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

Joy*_*oti 5 hadoop apache-pig

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

Don*_*ner 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 ..."
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告诉它从标准输入而不是一个文件获取数据.