1、Ch.7.Ch.7.高级高级MapReduce MapReduce 编程技术编程技术MapReduceMapReduce海量数据并行处理海量数据并行处理Ch.7.Ch.7.高级高级MapReduceMapReduce编程技术编程技术1.复合键值对的使用2.用户自定义数据类型3.用户自定义输入输出格式4.用户自定义Partitioner和Combiner5.迭代完成MapReduce计算6.链式MapReduce任务7.多数据源的连接8.全局参数/数据文件的传递9.其它处理技术用复合键让系统完成排序用复合键让系统完成排序map计算过程结束后进行Partitioning处理时,系统自动按照map的
2、输出键进行排序,因此,进入Reduce节点的(key,value)对将保证是按照key进行排序的,而value则不保证是排好序的。为了解决这个问题,可以在Reduce过程中对value列表中的各个value进行本地排序。但当value列表数据量巨大、无法在本地内存中进行排序时,将出现问题。一个更好的办法是,将value中需要排序的部分加入到key中形成复合键,这样将能利用MapRecue系统的排序功能完成排序。但需要实现一个新的Partitioner,保证原来同一key值的键值对最后分区到同一个Reduce节点上。1.1.复合键值对的使用复合键值对的使用用复合键让系统完成排序用复合键让系统完成
3、排序复合键值对的使用复合键值对的使用带频率的倒排索引示例1:class Mapper2:procedure Map(docid n,doc d)3:H new AssociativeArray4:for all term t doc d do5:Ht Ht+16:for all term t H do7:Emit(term t,posting)1:class Reducer2:procedure Reduce(term t,postings,)3:P new List4:for all posting postings,do5:Append(P,)6:Sort(P);/进入Reduce节点的p
4、ostings不保证按照文档序/号排序,因而需要对postings进行一个本地排序7:Emit(term t;postings P)用复合键让系统完成排序用复合键让系统完成排序复合键值对的使用复合键值对的使用带频率的倒排索引示例为了能利用系统自动对docid进行排序,解决方法是:代之以生成(term,)键值对,map时将term和docid组合起来形成复合键。但会引起新的问题,同一个term下的所有posting信息无法被分区到同一个Reduce节点,为此,需要实现一个新的Partitioner:从中取出term,以term作为key进行分区。A revised example复合键值对的使用
5、复合键值对的使用Inverted IndexingA revised example(cont.)Customized PartitionerCustomized Partitioner复合键值对的使用复合键值对的使用进入入reducereduce的的键值对按照按照(term,docid)(term,docid)排序排序把小的键值对合并成大的键值对把小的键值对合并成大的键值对通常一个计算问题会产生大量的键值对,为了减少键值对传输和排序的开销,一些问题中的大量小的键值对可以被合并成一些大的键值对(pairs-stripes)。单词同现矩阵算法一个Map可能会产生单词a与其它单词间的多个键值对,这
6、些键值对可以在Map过程中合并成右侧的一个大的键值对(条):然后,在Reduce阶段,把每个单词a的键值对(条)进行累加:复合键值对的使用复合键值对的使用(a,b)1(a,c)2(a,d)5(a,e)3(a,f)2 a b:1,c:2,d:5,e:3,f:2 a b:1,d:5,e:3 a b:1,c:2,d:2,f:2 a b:2,c:2,d:7,e:3,f:2+把小的键值对合并成大的键值对把小的键值对合并成大的键值对单词同现矩阵算法复合键值对的使用复合键值对的使用Cluster size:38 coresData Source:Associated Press Worldstream(AP
7、W)of the English Gigaword Corpus(v3),which contains 2.27 million documents(1.8 GB compressed,5.7 GB uncompressed)把小的键值对合并成大的键值对把小的键值对合并成大的键值对用JobTracker的Web GUI可以观察优化执行后各项统计数据复合键值对的使用复合键值对的使用HadoopHadoop内置的数据类型内置的数据类型这些数据类型都实现了WritableComparable接口,以便进行网络传输和文件存储,以及进行大小比较。2.2.用户自定义数据类型用户自定义数据类型用户自定义数据
8、类型用户自定义数据类型需要实现Writable接口,作为key或者需要比较大小时则需要实现WritableComparable接口用户自定义数据类型用户自定义数据类型public class Point3D implements WritableComparable private int x,y,z;public int getX()return x;public int getY()return y;public int getZ()return z;public void write(DataOutput out)throws IOException out.writeFloat(x);
9、out.writeFloat(y);out.writeFloat(z);public void readFields(DataInput in)throws IOException x=in.readFloat();y=in.readFloat();z=in.readFloat();public int compareTo(Point3D p)/compares this(x,y,z)with p(x,y,z)and outputs-1,0,1 若用户需要自定义数据类型若用户需要自定义数据类型,实现实现WritableComparableWritableComparable接口接口public
10、 class Edge implements WritableComparable private String departureNode;private String arrivalNode;public String getDepartureNode()return departureNode;Overridepublic void readFields(DataInput in)throws IOException departureNode=in.readUTF();arrivalNode=in.readUTF();Overridepublic void write(DataOutp
11、ut out)throws IOException out.writeUTF(departureNode);out.writeUTF(arrivalNode);Overridepublic int compareTo(Edge o)return(departureNpareTo(o.departureNode)!=0)?departureNpareTo(o.departureNode):arrivalNpareTo(o.arrivalNode);用户自定义数据类型用户自定义数据类型HadoopHadoop内置的文件输入格式内置的文件输入格式3.3.用户自定义输入输出格式用户自定义输入输出格式I
12、nputFormat:InputFormat:Description:Description:Key:Key:Value:Value:TextInputFormatDefault format;reads lines of text filesThe byte offset of the lineThe line contentsKeyValueTextInputFormatParses lines into key-val pairsEverything up to the first tab characterThe remainder of the lineSequenceFileInp
13、utFormatA Hadoop-specific high-performance binary formatuser-defineduser-definedHadoopHadoop内置的文件输入格式内置的文件输入格式3.3.用户自定义输入输出格式用户自定义输入输出格式AutoInputFormat,CombineFileInutFormat,CompositeInputFormat,DBInputFormat,FileInputFormat,KeyValueTextInputFormat,LineDocInputFormat,MultiFileInputFormat,NLineInputF
14、ormat,SequenceFileAsBinaryInputFormat,SequenceFileAsTextInputFormat,SequenceFileInputFilter,SequenceFileInputFormat,StreamInputFormat,TextInputFormatHadoopHadoop内置的内置的RecordReaderRecordReaderRecordReaderRecordReader:InputFormatInputFormatDescription:Description:LineRecordReaderdefault reader for Tex
15、tInputFormatreads lines of text filesKeyValueLineRecordReaderdefault reader for KeyValueTextInputFormatparses lines into key-val pairsSequenceFileRecordReaderdefault reader for SequenceFileInputFormatUser-defined methods to create keys and values用户自定义输入输出格式用户自定义输入输出格式HadoopHadoop内置的内置的RecordReaderRe
16、cordReader用户自定义输入输出格式用户自定义输入输出格式CombineFileRecordReader,DBInputFormat.DBRecordReader,InnerJoinRecordReader,JoinRecordReader,KeyValueLineRecordReader,LineDocRecordReader,MultiFilterRecordReader,OuterJoinRecordReader,OverrideRecordReader,SequenceFileAsBinaryInputFormat.SequenceFileAsBinaryRecordReader,SequenceFileAsTextRecordReader,SequenceFileRecordReader,StreamBaseRecordReader,StreamXmlRecordReader,WrappedRecordReader用户自定义用户自定义InputFormatInputFormat和和RecordReaderRecordReader示例示例简单的文档倒排索引import j
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1