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



我在Unix Shell环境中对文件执行剪切、尾部、排序等操作时遇到了问题。

我遇到的情况是,我希望文件中的最高时间戳不是按时间戳排序的,并将其存储在例如"X"中,然后在执行MR作业时将"X"作为参数传递给我的MapReducer驱动程序类。

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

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

这给了我最棒的时间戳。

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

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

请提出建议。如果需要更多信息,请告诉我。

感谢

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

  • 读取本地shell中的所有文件,并像以前一样进行筛选。请注意,这非常缓慢,效率非常低,与hadoop的想法完全相反。但你可以做一些类似的事情:

    hadoop fs -cat <foldername>/* | cut -d, -f <<fieldIndexNo>> <<FileName>> | sort -n | tail -1

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

相关内容

  • 没有找到相关文章

最新更新