01 package com.test; 02   03 import java.util.ArrayList; 04 import java.util.Iterator; 05 import java.util.List; 06   07 public class T { 08   09     public static void main(String[] args) { 10   11         // 只要实现了Iterable接口的对象都可以使用for-each循环. 12   …
起初遍历values时直接把对象添加到集合中,后来输出结果和预期不符,debug时发现添加到集合中的对象的值全部是最后一个对象的值,网上百度了下,发现是reduce阶段对象重用的问题,reduce阶段的key,value分别指向一个对象,无论操作了多少个键值对,始终是这两个对象,而ArrayList的add()添加的是对象的引用地址而不是对象的值,这样add(value),当最后一个值遍历完成后,value指向的值就变成了最后一个对象的值,所以如果想要保存key,value的值(属性),需要重新…
Mapreduce中由于sort的存在,MapTask和ReduceTask直接是工作流的架构.而不是数据流的架构.在MapTask尚未结束,其输出结果尚未排序及合并前,ReduceTask是又有数据输入的,因此即使ReduceTask已经创建也只能睡眠等待MapTask完成.从而可以从MapTask节点获取数据.一个MapTask最终的数据输出是一个合并的spill文件,可以通过Web地址访问.所以reduceTask一般在MapTask快要完成的时候才启动.启动早了浪费container资源…
今天在写MapReduce中的reduce函数时,碰到个问题,特此记录一下: void reduce(key, Iterable<*>values,...) { for(* v:values) { //做第一遍遍历 } for(* v:values) { //做第二遍遍历 } } 以上代码本以为可以直接通过,但是问题却出现了,就是在第二遍遍历的时候,遍历为空,这也就是说系统给reduce提供的iterable不能多次遍历. 但通过如下的代码片段却发现: .... List<*> l…
1.1.1         reduce端连接-分区分组聚合 reduce端连接则是利用了reduce的分区功能将stationid相同的分到同一个分区,在利用reduce的分组聚合功能,将同一个stationid的气象站数据和温度记录数据分为一组,reduce函数读取分组后的第一个记录(就是气象站的名称)与其他记录组合后输出,实现连接.例如连接下面气象站数据集和温度记录数据集.先用几条数据做分析说明,实际肯定不只这点数据. 气象站数据集,气象站id和名称数据表 StationId Statio…
hadoop api提供了一些遍历文件的api,通过该api可以实现遍历文件目录: import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.CountDownLatch; i…
很长时间以来一直写hive,嵌套脚本.偶尔写UDF.  最近用Hive的dynamic partition和多路插入做一些事情,很遗憾的结果是非常不稳定,有时能成功,有时失败.(可能是因为hive版本的问题,查了一些资料也没查的太清楚,因为服务器不能随便动,就想用mapreduce的多路输出吧). 1.首先这个多路插入也是用的hive的表,表的输出是SequenceFile格式. 按说sequencefile格式输入,取决于内部的Key/value格式. 在驱动类里需要添加 Job job=ne…
某个reduce中的value堆积的对象过多,导致jvm频繁GC. 解决办法: 1. 增加reduce个数,set mapred.reduce.tasks=300,. 2. 在hive-site.xml中设置,或者在hive shell里设置 set  mapred.child.java.opts = -Xmx512m 或者只设置reduce的最大heap为2G,并设置垃圾回收器的类型为并行标记回收器,这样可以显著减少GC停顿,但是稍微耗费CPU. set mapred.reduce.child…
来自为知笔记(Wiz)…
1.HDFS 修复 问题描述:其他部门在yarn平台上跑spark 程序错误的生成了海量的不到100K的小文件,导致namenode压力过大,其中一个namenode宕机后,没有及时发现 使得edits文件大量积累,在namenode1宕机后,namenode2 随后在凌晨1点也宕机. 原因分析:NameNode 内存设置太低,之前内存设置在1G,后调高namenode 堆内存,调高到18G.编写程序的人员不应该生成海量的小文件落地HDFS,大量的小文件不适合存储在HDFS上. 问题解决方案:提…