我想在里面捕获一些关于键和它们的值的信息自定义分区器(甚至是默认的HashPartitioner)。我可以通过访问“上下文”变量在映射器和缩减器中使用自定义计数器。但是,在分区程序内部无法访问“上下文”变量。有没有办法:-1-从分区程序访问“上下文”变量?要么-2-如何给Partitioner添加计数器?谢谢。 最佳答案 通过分区器的每个键/值对要么(1)由映射器写入上下文,要么(2)将传递给reducer的reduce()方法。您可以将代码放在这两个地方中的任何一个,以编写自定义计数器并将其递增到上下文中。如果您必须在分区器中编写
我是hadoop的新手,我尝试在Java中执行一些map/reduce任务。我想知道我们如何对所有键/值对执行归约操作。例如,假设我们有一个月中每一天的当天最高温度。我们将日期作为键,将温度作为值,我希望获得整个月最高温度的键/值。我希望我的问题很清楚!感谢您的帮助。 最佳答案 是的,这是可能的。只需通过job.setNumReduceTasks(1)配置您的工作以使用单个reducer.这个单一的reducer将遍历所有键/值对。在reduce()方法中,您只需搜索最大值,而在cleanup()方法中,您输出最终结果。(k,v)=
我正在尝试运行MapReduce流作业,该作业从s3存储桶中与给定模式匹配的目录中获取输入文件。该模式类似于bucket-name/[date]/product/logs/[hour]/[logfilename]。示例日志稍后会像bucket-name/2013-05-02/product/logs/05/log123456789一样。我可以通过仅将文件名的小时部分作为通配符传递来使工作正常进行。例如:bucket-name/2013-05-02/product/logs/*/。这成功地从每个小时中挑选了每个日志文件,并将它们分别传递给映射器。问题是我也尝试使日期成为通配符,例如:bu
我想在Hadoop中处理一个约300GB的JSON文件。据我了解,JSON由单个字符串组成,其中嵌套了数据。现在,如果我想使用Google的GSON解析JSON字符串,那么Hadoop就不必将整个负载放在单个节点上,因为JSON在逻辑上不可分割。如果我希望文件应该在不同节点上并行处理,我该如何对文件进行分区(我可以从逻辑上查看数据来划分分区)。在将文件加载到HDFS本身之前,我是否必须破坏文件?JSON是否绝对有必要由一台机器(或节点)至少解析一次? 最佳答案 假设您知道可以在逻辑上将JSON解析为逻辑上独立的组件,那么您只需编
在Hadoop中运行map-reduce作业后,结果是一个包含部分文件的目录。part文件的数量取决于reducer的数量,可以达到几十个(在我的例子中是80个)。保留多个部分文件是否会影响futuremap-reduce操作的性能,是好是坏?采取额外的缩减步骤并合并所有部分会提高还是降低进一步处理的速度?请仅引用map-reduce性能问题。我不关心以任何其他方式拆分或合并这些结果。 最佳答案 在零件目录上运行进一步的mapreduce操作应该对整体性能几乎没有影响。原因是Hadoop做的第一步是根据大小拆分输入目录中的数据,并将
我需要不断获取映射器和缩减器的运行时间。我已经提交了如下作业。JobClientjobclient=newJobClient(conf);RunningJobrunjob=jobclient.submitJob(conf);TaskReport[]maps=jobclient.getMapTaskReports(runjob.getID());longmapDuration=0;for(TaskReportrpt:maps){mapDuration+=rpt.getFinishTime()-rpt.getStartTime();}但是,当我运行该程序时,作业似乎没有提交并且映射器从未启
我对Hadoop数据流中的序列化有点困惑。假设我有一个定义如下的Java对象(该对象可能比我展示的要复杂得多):publicvoidMyObject{privateintField1;privateStringField2;publicvoidmethod1(){}...}要在映射器和缩减器之间传输此对象的实例,有两种方法:第一种方法-我可以在映射器中一个一个地序列化int字段和String字段并将它们写入输出,然后在reducer中,我读取它们并使用它们创建MyObject的新实例值。假设新创建的实例与原始实例相比没有区别。第二种方法-我可以重写MyObject以实现Writable
所以我有十个不同的文件,每个文件看起来像这样。....实际上每个文件大约有56,000行。每行都有一个文档ID和一个RDF文档。我的目标是将每个映射器作为输入键值对传递给每个映射器,并为输出键值对发出多个映射器。在reduce步骤中,我会将这些存储到Hive表中。我有几个入门问题,而且我对RDF/XML文件完全陌生。我应该如何解析文档的每一行以分别传递给每个映射器?是否有一种有效的方法来控制映射器的输入大小? 最佳答案 1-如果您使用的是TextInputFormat,您将在每个映射器中自动获得1行(1次拆分)作为值。将此行转换为S
简而言之我需要一种方法来向HadoopMapRediceAPI提供提示,告诉我希望在哪个主机上运行基于其分区的特定reducer。有什么办法吗?有点长的故事:我很少有映射器任务为某些HBase表生成(或从其他来源导入)记录。发出的记录以ImmutableBytesWritable作为键。此作业的reducer数量与表区域的数量完全匹配,自定义分区器用于分发记录,以便每个区域的记录都到达适当的reducer。Reducer旨在生成HFile图像,每个区域一个图像,以便稍后可以在它们上使用批量加载。这里唯一严重的问题是我希望reducer至少在适当的区域服务器正在运行的相同主机上“尝试运行
在Hadoop1.0.1中,如何使用API找到reduce任务中每个阶段的权重?更明确地说,我试图查看改组阶段、排序阶段和合并阶段占用了多少reduce任务。 最佳答案 我认为实现此目的的一种方法是监控任务所用的总时间以及Shuffle和Sort阶段所用的时间。您可以使用TaskStatus提供的以下方法类找到:getStartTime():获取任务的开始时间。getFinishTime():获取任务完成时间。如果之前未设置shuffleFinishTime和sortFinishTime,则将它们设置为finishTime。它负