我正在尝试编辑Hadoop集群上的大文件,并从文件中修剪空格和特殊字符,如|,*,@,“等。 我不想copyToLocal并使用sed,因为我有1000个这样的文件要编辑。
答案 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而不是文件中获取数据。