如何在 Hadoop 中执行类似 shell 脚本的操作

Posted

技术标签:

【中文标题】如何在 Hadoop 中执行类似 shell 脚本的操作【英文标题】:How to Perform shell script like operation in Hadoop 【发布时间】:2015-11-20 07:48:13 【问题描述】:

我在执行剪切、拖尾、排序等操作时遇到了问题,就像我在 Unix Shell 环境中对文件执行的操作一样。

我遇到这样的情况,例如我想要文件中的最高时间戳,该时间戳未按时间戳排序并将其存储在“X”中,然后在执行 MR 时将“X”作为参数传递给我的 MapReducer 驱动程序类工作。

在本地模式下很容易做到这一点:

 cut -d, -f <<fieldIndexNo>> <<FileName>> | sort -n | tail -1

这给了我最大的时间戳。

现在在分布式模式下,如何去执行这样的操作。或者换句话说,我们可以使用什么技巧来帮助解决这样的问题,

我不希望触发 Mapreduce 作业来查找最大时间戳,然后将其传递给另一个 Map Reduce 作业。

请推荐。 如果需要更多信息,请告诉我。

谢谢

【问题讨论】:

【参考方案1】:

我将假设文件存储在 HDFS 中,而不是每个节点的本地文件系统中。在这种情况下,您只有两个选择:

读取本地 shell 中的所有文件并像以前一样进行过滤。请注意,这非常慢,非常低效,并且完全与 hadoop 的想法背道而驰。但你可以这样做:

hadoop fs -cat &lt;foldername&gt;/* | cut -d, -f &lt;&lt;fieldIndexNo&gt;&gt; &lt;&lt;FileName&gt;&gt; | sort -n | tail -1

编写一个能高效完成的 Pig 作业(或 spark 作业或...)。它应该是一个简单的最多 3 行脚本,按时间戳对文件进行排序并取前 1 个。然后将此数字存储在 HDFS 上。这将在每个节点上并行执行,并且比第一个解决方案要快得多。

【讨论】:

以上是关于如何在 Hadoop 中执行类似 shell 脚本的操作的主要内容,如果未能解决你的问题,请参考以下文章

如何在shell脚本中修改添加替换指定文件中的内容

Shell脚本----安装Hadoop过程小结

shell中怎么批量执行命令。

Linux系列教程(二十)——Linux的shell概述以及如何执行脚本

Linux系列教程(二十)——Linux的shell概述以及如何执行脚本

Linux shell执行hadoop命令清理垃圾箱