我正在尝试在Hadoop集群上编辑一个大文件,并从文件中修剪空白和特殊字符,如|,*,@,"等.我不想copyToLocal并使用sed,因为我有1000个这样的文件进行编辑.
MapReduce非常适合这种情况.你在HDFS中拥有它是件好事!
你说你认为你可以解决你的问题sed.如果是这样的话,那么Hadoop Streaming将是一次性的好选择.
$ hadoop jar /path/to/hadoop/hadoop-streaming.jar \
-D mapred.reduce.tasks=0 \
-input MyLargeFiles \
-output outputdir \
-mapper "sed ..."
Run Code Online (Sandbox Code Playgroud)
这将启动MapReduce作业,该作业将您的sed命令应用于整个文件中的每一行.由于有1000个文件,因此您将有多个映射器任务同时命中文件.数据也将重新进入群集.
请注意,我在这里将减速器的数量设置为0.那是因为它不是真的需要.如果您希望输出为一个文件,请使用一个reducer,但不要指定-reducer.我认为使用身份缩减器并有效地创建一个带有一个reducer的输出文件.仅映射器版本肯定更快.
另一个选项,我认为不是很好,但不需要MapReduce,并且仍然比copyToLocal更好地通过节点流式传输并将其推回而不会碰到磁盘.这是一个例子:
$ hadoop fs -cat MyLargeFile.txt | sed '...' | hadoop fs -put - outputfile.txt
Run Code Online (Sandbox Code Playgroud)
在-在hadoop fs -put告诉它从标准输入而不是一个文件获取数据.
| 归档时间: |
|
| 查看次数: |
1371 次 |
| 最近记录: |