在Hadoop集群上编辑数百万行文件

时间:2014-02-20 19:28:02

标签: hadoop apache-pig

我正在尝试编辑Hadoop集群上的大文件,并从文件中修剪空格和特殊字符,如|,*,@,“等。 我不想copyToLocal并使用sed,因为我有1000个这样的文件要编辑。

1 个答案:

答案 0 :(得分:7)

MapReduce非常适合这一点。你在HDFS中拥有它是好事!

您说您认为可以使用sed解决问题。如果是这种情况,那么Hadoop Streaming将是一次性的好选择。

$ hadoop jar /path/to/hadoop/hadoop-streaming.jar \
   -D mapred.reduce.tasks=0 \
   -input MyLargeFiles \
   -output outputdir \
   -mapper "sed ..."

这将启动MapReduce作业,该作业将sed命令应用于整个文件中的每一行。由于有1000个文件,因此您将有多个映射器任务同时命中文件。数据也将重新进入群集。

请注意,我在这里将减速器的数量设置为0。那是因为它不是真的需要。如果您希望输出为一个文件,请使用一个reducer,但不要指定-reducer。我认为使用身份缩减器并有效地创建一个带有一个reducer的输出文件。仅映射器版本肯定更快。


另一个选项,我认为不是很好,但不需要MapReduce,并且仍然比copyToLocal更好地通过节点流式传输并将其推回而不会碰到磁盘。这是一个例子:

$ hadoop fs -cat MyLargeFile.txt | sed '...' | hadoop fs -put - outputfile.txt

-中的hadoop fs -put告诉它从stdin而不是文件中获取数据。