如何在 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 <foldername>/* | cut -d, -f <<fieldIndexNo>> <<FileName>> | sort -n | tail -1
编写一个能高效完成的 Pig 作业(或 spark 作业或...)。它应该是一个简单的最多 3 行脚本,按时间戳对文件进行排序并取前 1 个。然后将此数字存储在 HDFS 上。这将在每个节点上并行执行,并且比第一个解决方案要快得多。
【讨论】:
以上是关于如何在 Hadoop 中执行类似 shell 脚本的操作的主要内容,如果未能解决你的问题,请参考以下文章
Linux系列教程(二十)——Linux的shell概述以及如何执行脚本