我有一个mr作业在emr中运行,它将输出存储在s3中。reducer的输出将作为同一Map器的输入(想想identity mapper),我希望尽可能快地执行连续运行,而不是等待emr写入s3,然后将Map器安排在“x”分钟后读取数据。对s3的读写需要花费大量的时间(大约3-5分钟),因此我想知道是否有办法避免在连续运行时从s3中读取?
我还需要将mapreduce作业的输出写入s3,因为这些数据对我很重要,需要持久化。但是,对于每个连续的mr运行,我不想从s3读取数据,而是可以将其写入hdfs(或缓存),然后将其用作下一次运行的输入吗?
多输出—帮助将数据输出到文件夹中的多个文件或写入多个文件夹。请参阅-将输出写入不同的文件夹hadoop
如何将这个概念扩展到两个不同的端点-s3和hdfs?
1条答案
按热度按时间sh7euo9m1#
基于您的问题,假设您希望在第一个作业中从s3读取输入数据,使用一个或几个中间mapreduce作业执行计算,这些作业将数据读/写到hdfs,最后一个作业将数据写入s3。
根据您的实现,您可以从不同的端点(s3或hdf)读取数据,也可以将数据写入不同的端点。
如果没有为mapreduce作业中的输入/输出路径指定方案,则默认为hdfs。但是,对于hadoop分布式文件系统,您还可以使用hdfs://前缀为路径指定uri方案,对于amazons3 bucket,使用s3://前缀为路径指定uri方案。您可以根据您的需求使用s3n://、s3a://和s3://。有关s3 bucket的更多信息,请参阅此链接:技术上讲,s3n、s3a和s3之间有什么区别?
不管mapreduce作业的输入/输出端点是什么,我们都可以使用filesystem类通过传递java.net.uri和org.apache.hadoop.conf.configuration类作为参数来创建对象。请参考下面的伪代码:
现在,在驱动程序代码中,如果作业只使用一个端点,则只需要创建一个文件系统对象,如果有两个不同的端点,则可以为输入和输出创建两个文件系统对象。您可以根据需要使用filesystem对象来执行任何类型的操作。
如果有多个mapreduce作业按上述方式设计,则可以按所需顺序使用这些命令调用这些作业
"hadoop jar jar_name main_class input_path output_path"
或者只是一个oozie工作流。