2016-05-06 5 views
1

Для выполнения mapreduce вам необходимо передать типы карт и редукторов/объединителей, следовательно, они должны иметь конструктор без параметров. Таким образом, вы никак не можете вводить какие-либо свойства объектам mapper или редуктора через конструктор или метод сопоставления?C# HDInsight MapReduce передать аргументы в mapper

Я пытаюсь избежать создания нескольких картографов, которые делают то же самое, только если они ищут другое свойство в вводе строки json.

Взято из блога msdn для иллюстрации. Преобразователь преобразует строку ввода, которую мы предполагаем как строку json для объекта. Выбирает «некоторое свойство» для отображения. Проблема здесь в том, как мы можем вставить это «некоторое свойство», чтобы мы могли управлять поведением преобразователя, не создавая для него нескольких его реализаций.

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()); 

    } 

} 

Класс редуктора, который отображает отображаемые объекты из картографа.

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); 

    } 

Обратите внимание, как мы даем ему тип преобразователя и редуктора, следовательно, должен быть параметром менее конструктор.

 //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

Привет, можете ли вы добавить пример кода для иллюстрации вашего вопроса? – benjguin

ответ

0

Вы можете использовать контекст для передачи переменных в классы карты/сокращения. Ниже приведен пример представления банку с помощью PowerShell и чтения ключа в вашем Java M программы/R

представления

PowerShell:

$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** 

С вашей M/R работу

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

Ресурсы: http://www.andrewsmoll.com/3-hacks-for-hadoop-and-hdinsight-clusters/ https://blogs.msdn.microsoft.com/mostlytrue/2014/04/10/merging-small-files-on-hdinsight/

+0

Библиотека C# не поддерживает это: http://hadoopsdk.codeplex.com/SourceControl/latest#src/Microsoft.Hadoop.MapReduce/src/MapReduce/Microsoft.Hadoop.MapReduce/BasicStreaming/Context/ContextBase.cs – shiva8

+0

hmm Вы можете сохранить конфигурационный файл в виде хранилища blob и извлечь его из экземпляра M/R. Он чувствует себя не так, но я не знаю другого способа передать переменные в экземпляр M/R. –

+0

Да, это хакки. Ну, я просто собираюсь рассказать ребятам в Microsoft. Вероятно, для исправления уже есть запрос на вытягивание. – shiva8