gpt4 book ai didi

C# HDInsight MapReduce 将参数传递给映射器

转载 作者:可可西里 更新时间:2023-11-01 16:05:20 25 4
gpt4 key购买 nike

要执行mapreduce,您必须传递mapper 和reducer/combiner 类型,因此它们必须具有无参数构造函数。因此,您无法通过构造函数或映射器方法将任何属性依赖注入(inject)到映射器或化简器实体吗?

我试图避免创建多个映射器,这些映射器执行完全相同的操作,只是它们在 json 字符串输入中查找不同的属性。

取自 msdn 博客作为说明。映射器将我们假设为 json 字符串的输入行转换为对象。取出“一些属性(property)”来绘制 map 。这里的问题是我们如何注入(inject)“某些属性”,以便我们可以控制映射器的行为,而不必创建它的多个实现。

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

}

}

从映射器获取映射对象的reducer类。

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

最佳答案

您可以使用上下文将变量传递到您的map/reduce 类中。以下是通过 powershell 提交 jar 并读取 Java M/R 程序中的 key 的示例

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/

关于C# HDInsight MapReduce 将参数传递给映射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37064381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com