我试图在hadoop集群上编辑一个大文件,并修剪空格和特殊字符,比如¦,*,@," 等等。我不想复制本地和使用sed,因为我有1000的这样的文件来编辑。
b1zrtrql1#
mapreduce非常适合这种情况。幸好你在hdfs里有它!你说你认为你可以用 sed . 如果是这样的话,那么hadoop流媒体将是一次性的好选择。
sed
$ 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更好,就是通过节点流式传输它,并将它推回到磁盘上,而不命中磁盘。举个例子:
-reducer
$ hadoop fs -cat MyLargeFile.txt | sed '...' | hadoop fs -put - outputfile.txt
这个 - 在 hadoop fs -put 告诉它从stdin而不是文件中获取数据。
-
hadoop fs -put
1条答案
按热度按时间b1zrtrql1#
mapreduce非常适合这种情况。幸好你在hdfs里有它!
你说你认为你可以用
sed
. 如果是这样的话,那么hadoop流媒体将是一次性的好选择。这将启动一个mapreduce作业,应用您的
sed
命令到整个文件中的每一行。由于有1000个文件,您将有几个Map器任务同时命中这些文件。数据也将直接返回集群。注意,我在这里将reducer的数量设置为0。那是因为它不是真正需要的。如果希望输出为一个文件,可以使用一个减速机,但不要指定
-reducer
. 我认为它使用了identity reducer,并有效地用一个reducer创建了一个输出文件。只有mapper版本绝对更快。另一个选项,我不认为是好的,但不需要mapreduce,仍然比copytolocal更好,就是通过节点流式传输它,并将它推回到磁盘上,而不命中磁盘。举个例子:
这个
-
在hadoop fs -put
告诉它从stdin而不是文件中获取数据。