我正在运行一个简单的mapandreduceHadoop作业。mapred.reduce.tasks属性已由Hadoop管理员在mapred-site.xml文件中设置。假设它是25。现在,我的工作只产生4个不同的key,所以25个part-r-xxxx文件中只有4个是非空的,其余的是空文件。我该如何防止这种情况?我只想要与生成的key数量一样多的输出文件(我事先不知道)。谢谢。 最佳答案 我建议使用LazyOutputFormat:LazyOutputFormat.setOutputFormatClass(job,TextOutp
正如标题所说,我有一个关于map-reduce的任务设计:经过思考,我认为只需要将部分数据(可能是10%的数据)送入reducer,剩下的数据直接输出到HDFS即可。然后最后,我只是合并了mapper和reducer的这两个输出文件(我必须得到一个关于这个总数据的统一文件或目录)。我认为,通过这样做,可以降低此任务运行的带宽成本。那么我的想法能实现吗?(我知道如何直接从mapper输出到HDFS,但这需要mapper既输出到HDFS又将数据发送到reducer) 最佳答案 一种解决方案是使用MultipleOutputs'swrit
我希望Map的输出为SequenceFileOutputFormat,reduce的最终输出为TextOutputFormat。作业配置只允许指定setOutputFormatClass如何为map和reduce阶段设置不同的输出格式? 最佳答案 我不认为您可以为映射器和缩减器指定不同的输出格式,只是为了整体工作。您可以尝试一个选项,具体取决于您的处理,您可以让一个作业输出SequenceFileOutputFormat中的文件,然后另一个作业读取并处理它以将其转换为TextOutputFormat。
我在HadoopJavaAPI(1.0.3)中编写了一个MapReduce作业。这项工作包括对我的数据中特定字段(X)的所有值求和,并创建其他字段的加权分布。输入:1field1_1field2_1field3_1...fieldX_12field1_2field2_2field3_2...fieldX_23field1_3field2_3field3_3...fieldX_3由于我的数据中的任何行都会发出一对,并且我需要使用单个reducer来汇总所有值,因此我想将相同的Reduce类设置为Combiner。总X求和:map输出:XfieldX_1XfieldX_2XfieldX_3
我的工作是计算密集型的,所以我实际上只使用Hadoop的分布函数,我希望我的所有输出都在1个文件中,所以我将reducer的数量设置为1。我的reducer实际上什么都不做。..通过将reducer的数量显式设置为0,我可以知道如何在映射器中进行控制以强制将所有输出写入同一个1输出文件吗?谢谢。 最佳答案 您不能在Hadoop中这样做。您的每个映射器都必须写入独立文件。这使它们变得高效(无争用或网络传输)。如果你想合并所有这些文件,你需要一个单一的reducer。或者,您可以让它们成为单独的文件,并在下载它们时合并这些文件(例如,使
我有三个reducer,我需要它们中的每一个都接收相同的key,如下所示:GOOG-Reducer0AAPL-Reducer1VMW-Reducer2在分区器中,getPartition()方法应返回一个int,指示reducer的索引(0,1,2)之一。我的getPartition()实现是:return((CompositeKey)key).getSymbol().hashCode()%numReduceTasks;但是这在这里不起作用是我得到的:intnumReduceTasks=3;System.out.println("GOOG".hashCode()%numReduceTa
我有两个大文件并将它们上传到名为“ccssdd”的AmazonS3存储桶中,并创建了一个名为data的文件夹:数据/友谊.xml数据/用户.xml用户结构是12447football..和13..我需要编写一个作业jar以在AmazonElasticMapReduce上运行它以计算:找出每个用户的friend数。我知道我应该从每个友谊元素中生成对作为map函数的输出在reduce函数中,我应该将每个用户ID的“1”相加。1_我知道我可以在eclipse中运行我的应用程序以生成.jar作业文件,但我不知道我应该下载哪些库并将其添加到项目中。2-我真的不知道如何将我的应用程序连接到s3!并
我们正在使用Hive进行临时查询,并且有一个Hive表,该表按两个字段(date,id)进行分区。现在每个日期大约有1400个ID,所以在一天左右添加了很多分区。实际数据驻留在s3中。现在我们面临的问题是假设我们从表格中执行一个月的selectcount(*)然后启动map需要相当长的时间(大约:1小时52分钟)减少工作。当我在Hive详细模式下运行查询时,我可以看到它这次花费的时间实际上决定了要生成多少个映射器(计算拆分)。有什么方法可以减少启动map-reduce作业的延迟时间吗?这是在此延迟时间内记录的日志消息之一:13/11/1907:11:06INFOmapred.FileI
在代码的第一部分,我设置了一些数组来跟踪一些值,如下所示:@Overridepublicvoidconfigure(JobConfconf){top5=newString[5];counttop5=newint[5]}现在,在reducer的一些代码之后,我想将顶部的内容输出到输出文件,但是,为了做到这一点,我创建了一个close()函数:@Overridepublicvoidclose(){//whatgoeshere?}但是正如您所见,没有任何东西可以调用,因为输出是在reducer方法中定义的。虽然代码本身很长,但这里是方法的数据签名:publicstaticclassMapex
我已经运行了很多天的seq2sparse作业,但它就是没有完成。主要原因是大多数“子作业”只有1个reducer,而每个作业都有很多映射器。我在从命令行调用seq2sparse时指定了--numReducers=n,但该属性仅在某些地方使用,例如MakePartialVectors而不是用于子作业,例如PruneVectors.可能是什么原因? 最佳答案 我查看了代码并意识到numReducers变量并未传递给所有子作业,因此这些作业是使用默认的缩减容量创建的,即1要绕过此限制,只需指定变量-Dmapred.reduce.tasks