作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试编辑 Hadoop 集群上的一个大文件,并从文件中删除空格和特殊字符,如 ¦、*、@、"等。我不想复制到本地并使用 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 ..."
这将启动一个 MapReduce 作业,将您的 sed
命令应用于整个文件中的每一行。由于有 1000 个文件,您将有多个映射器任务同时访问这些文件。数据也将立即返回到集群中。
注意我这里reducer的个数设置为0。那是因为它不是真正需要的。如果您希望输出为一个文件,则使用一个 reducer,但不要指定 -reducer
。我认为使用 identity reducer 并有效地只用一个 reducer 创建一个输出文件。仅映射器版本肯定更快。
另一个选项,我认为不是很好,但不需要 MapReduce,但仍然比 copyToLocal 更好,它是通过节点流式传输它并在不影响磁盘的情况下将其推回。这是一个例子:
$ hadoop fs -cat MyLargeFile.txt | sed '...' | hadoop fs -put - outputfile.txt
hadoop fs -put
中的 -
告诉它从标准输入而不是文件中获取数据。
关于hadoop - 在 Hadoop 集群上编辑数百万行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21917616/
我是一名优秀的程序员,十分优秀!