2016-05-06 10 views
1

Um MapReduce auszuführen, müssen Sie die Mapper und Reducer/Combiner-Typen übergeben, daher müssen sie parameterlosen Konstruktor haben. Also gibt es keine Möglichkeit, dass Abhängigkeiten den Mapper- oder Reducer-Entitäten über die Konstruktor- oder Mapper-Methode Eigenschaften hinzufügen können.C# HDInsight MapReduce übergeben Argumente an Mapper

Ich versuche zu vermeiden, mehrere Mapper zu erstellen, die genau das gleiche tun nur, dass sie nach einer anderen Eigenschaft in einer JSON-String-Eingabe suchen.

Von msdn Blog zur Veranschaulichung übernommen. Der Mapper konvertiert die Eingabezeile, die wir als JSON-String annehmen, in ein Objekt. Trifft "eine Eigenschaft" aus, um eine Karte zu erstellen. Das Problem besteht darin, wie wir dieses "eine Eigenschaft" einfügen können, so dass wir das Verhalten des Mappers steuern können, ohne dass wir mehrere Implementierungen davon erstellen müssen.

public class MySimpleMapper : MapperBase 

{ 

    public override void Map(string inputLine, MapperContext context) 

    { 

     //interpret the incoming line as an integer value 

     SomeObject obj = JsonConvert.Serialize<SomeObject>(inputLine); 
     int value = obj.Properties["some property"]; 

     //determine whether value is even or odd 

     string key = (value % 2 == 0) ? “even” : “odd”; 

     //output key assignment with value 

     context.EmitKeyValue(key, value.ToString()); 

    } 

} 

Die Reduziererklasse, die die zugeordneten Objekte vom Mapper übernimmt.

public class MySimpleReducer : ReducerCombinerBase 

{ 

    public override void Reduce(

     string key, IEnumerable<string> values, ReducerCombinerContext context 

     ) 

    { 

     //initialize counters 

     int myCount = 0; 

     int mySum = 0; 



     //count and sum incoming values 

     foreach (string value in values) 

     { 

      mySum += int.Parse(value); 

      myCount++; 

     } 

     //output results 

     context.EmitKeyValue(key, myCount + “t” + mySum); 

    } 

Beachten Sie, wie wir es der Art von Mapper und Reducer geben, daher muss es einen parameterlosen Konstruktor geben.

 //output results 

     context.EmitKeyValue(key, myCount + “t” + mySum); 

    } 

//establish job configuration 

     HadoopJobConfiguration myConfig = new HadoopJobConfiguration(); 

     myConfig.InputPath = “/demo/simple/in”; 

     myConfig.OutputFolder = “/demo/simple/out”; 



     //connect to cluster 

     Uri myUri = new Uri(“http://localhost”); 

     string userName = “hadoop”; 

     string passWord = null; 

     IHadoop myCluster = Hadoop.Connect(myUri, userName, passWord); 



     //execute mapreduce job 

     MapReduceResult jobResult = 

      myCluster.MapReduceJob.Execute<MySimpleMapper, MySimpleReducer>(myConfig); 
+0

Hallo, können Sie einen Beispielcode hinzufügen, um Ihre Frage zu veranschaulichen? – benjguin

Antwort

0

Sie können den Kontext verwenden, um Variablen in Ihre map/reduce-Klassen zu übergeben. Hier ist ein Beispiel für ein Glas über Powershell-Vorlage und das Lesen der Schlüssel in Ihrer Java-M/R-Programm

Powershell Vorlage:

$defines = @{"parser.batch.id" = $batchID} 
$jobDef = New-AzureHDInsightMapReduceJobDefinition -JarFile $jarPath -ClassName "com.microsoft.myclass" -Defines $defines -JobName "Parser" -StatusFolder "Parser/$batchID" 
$job = Start-AzureHDInsightJob -Cluster $clusterName -JobDefinition $jobDef -verbose -Credential $clusterCred** 

Von Ihrem M/R Job

conf = contex.getConfigutation(); 
batchID = conf.get(Keys.PARSER_BATCH_ID.getKey()); 

Ressourcen: https://blogs.msdn.microsoft.com/mostlytrue/2014/04/10/merging-small-files-on-hdinsight/

+0

Die C# -Bibliothek unterstützt dies nicht: http://hadoopsdk.codeplex.com/SourceControl/latest#src/Microsoft.Hadoop.MapReduce/src/MapReduce/Microsoft.Hadoop.MapReduce/BasicStreaming/Context/ContextBase.cs – shiva8

+0

hmm Sie könnten die Konfigurationsdatei in einem Blob-Speicher speichern und von der M/R-Instanz abrufen. Es fühlt sich falsch an, aber mir ist keine andere Möglichkeit bekannt, Variablen in eine M/R-Instanz zu leiten. –

+0

Ja, das ist Hacky. Nun, ich werde es den Jungs von Microsoft nur sagen. Wahrscheinlich gibt es bereits eine Pull-Anfrage, um das zu beheben. – shiva8