2017-02-23 38 views
0

我有大约170 GB的数据。我必须使用hadoop 2.7.3来分析它。有14名工人。我必须找到每个文档的唯一MIME类型的总数,例如文本/ html类型的文档总数。当我运行mapreduce作业(用python编写)时,Hadoop会返回许多输出文件,而不是我期望的单个文件。我认为这是由于许多工人单独处理一些数据并给出结果。我想得到单一的输出。哪里有问题。我如何限制hadoop提供单一输出(通过结合所有小型输出文件)。如何结合hadoop mappers输出获得单一结果

+0

你可以设置setnumreducetasks(1)来获得单个输出,我相信 – Bhavesh

+0

你能更具体吗?什么是所需的输出格式?你得到的输出是什么? – vefthym

回答

1

您的工作是为每个映射器生成1个文件,您必须使用1个reducer强制执行reducer阶段才能完成此操作,您可以在所有映射器中完成相同的密钥。

2

您可以使用Hadoop getmerge命令合并结束文件,当您从HDFS检索数据:

hadoop fs -getmerge /output/reduce/ /localcatalog/mergedresult.txt 

每个映射器和减速会生成一个单独的文件,并通过减少映射器和减压器你会数量降低您的工作并行度。我认为,不要将reducer限制为单个输出,最好的方法是使用提供的命令从hdfs获取合并结果。

+0

我认为合并会导致重复,例如每个输出文件中都会存在一个关键文本/ html。在最终的输出中,它应该是所有的总和。 – Shafiq

+1

@Shafiq您不会有重复的情况,因为Reducer会按键对您的数据进行分组,并在您的减速机作业中按顺序分配这些数据。所以你会有不相交的范围没有任何重复。 getmerge会将它们合并成单个文件。 – Alex

+0

@ Shafiq亚历克斯的答案是正确的当前问题陈述。你所评论的内容与原始问题不同。 “我必须找到每个文档的唯一MIME类型的总数”不清楚 – vefthym

1

使你的映射器发出处理每个文件 - (doc-mime-type, 1)然后在减少阶段计数所有这些对。从本质上讲,这是一个标准的字数统计练习,除了您的mapper会为每个doc的mime类型发射1个字符。

关于要设置的还原器数量:Alex合并还原器结果的方式是可取的,因为它允许在还原阶段使用所有工作器节点。但是,如果作业要在1-2个节点上运行,那么只需一个减速器就可以正常工作。