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

hpcdzsge  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(309)

我试图在hadoop集群上编辑一个大文件,并修剪空格和特殊字符,比如¦,*,@," 等等。我不想复制本地和使用sed,因为我有1000的这样的文件来编辑。

b1zrtrql

b1zrtrql1#

mapreduce非常适合这种情况。幸好你在hdfs里有它!
你说你认为你可以用 sed . 如果是这样的话,那么hadoop流媒体将是一次性的好选择。

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

这将启动一个mapreduce作业,应用您的 sed 命令到整个文件中的每一行。由于有1000个文件,您将有几个Map器任务同时命中这些文件。数据也将直接返回集群。
注意,我在这里将reducer的数量设置为0。那是因为它不是真正需要的。如果希望输出为一个文件,可以使用一个减速机,但不要指定 -reducer . 我认为它使用了identity reducer,并有效地用一个reducer创建了一个输出文件。只有mapper版本绝对更快。
另一个选项,我不认为是好的,但不需要mapreduce,仍然比copytolocal更好,就是通过节点流式传输它,并将它推回到磁盘上,而不命中磁盘。举个例子:

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

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

相关问题