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

Posted

技术标签:

【中文标题】在 Hadoop 集群上编辑数百万行文件【英文标题】:Editing a multi million row file on Hadoop cluster 【发布时间】:2014-02-20 19:28:01 【问题描述】:

我正在尝试在 Hadoop 集群上编辑一个大文件,并从文件中删除空格和特殊字符,如 ¦、*、@" 等。 我不想复制到本地并使用 sed,因为我有 1000 个这样的文件要编辑。

【问题讨论】:

【参考方案1】:

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 多个文件,您将有多个映射器任务同时访问这些文件。数据也会直接返回集群。

请注意,我在这里将 reducer 的数量设置为 0。那是因为它并不真正需要。如果你希望你的输出是一个文件,而不是使用一个减速器,但不要指定-reducer。我认为这使用了身份归约器,并且有效地只使用一个归约器创建了一个输出文件。仅映射器的版本肯定更快。


另一个我认为不太好但不需要 MapReduce 并且仍然比 copyToLocal 更好的选项是通过节点流式传输并将其推回而不撞到磁盘。这是一个例子:

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

hadoop fs -put 中的 - 告诉它从标准输入而不是文件中获取数据。

【讨论】:

谢谢唐纳德。它有助于。 :) 干杯。 嗨,第二个选项工作正常,但不是 mapred 方法。我想对文件应用多个 sed 操作,例如 hadoop fs -cat file1 | sed '1d' | sed 's/^A//g' | sed 's/|//g' | sed 's/"//g' | sed 's/ \+//g' | hadoop fs -put file2 如果我使用 mapred,它不适用于 ^A," 和空格。错误 - /bin/sed: can't read s/ \+//g: No such file or directory I am trying : $ hadoop jar /path/to/hadoop/hadoop-streaming.jar \ -D mapred.reduce. tasks=1 \ -input file1 -output file2 -mapper "sed 's/|//g';'s/ \+//g';'s/"//g';'其他 sed 操作'" Think i在映射器部分我错了。请纠正我

以上是关于在 Hadoop 集群上编辑数百万行文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中处理数百万行

在包含数百万行和多个过滤器的表上创建哪些索引

从C#中的数据中删除特殊字符后如何将dbf文件中的数百万行数据上传到SQL Server

mysql中数百万行的基于键的分区

xampp phpmyadmin 可以处理数百万行吗?

如何用qlik意义上的另一种方式替换大数据(大约数百万行)的for循环