1、数据类型
MapReduce中的所有数据类型都统一地实现了writable接口,以便用这些类型定义的数据可以被序列化进行网络传输和文件存储。当程序间传递对象或者持久化对象的时候,就需要序列化对象成字节流,writable就是Hadoop中序列化的格式。
BooleanWritable:标准布尔型数值 ByteWritable:单字节数值
DoubleWritable:双字节数值 FloatWritable:浮点数
IntWritable:整型数 LongWritable:长整型数
Text:使用UTF8格式存储的文本 NullWritable:当
Writable:value需要继承的类,其中的write()方法是把每个对象序列化到输出流,readFields()方法是把输入流字节反序列化。
WritableComparable:key需要继承的类。
对象比较需要使用比较器,comparable就是一个排序接口,如果一个类实现了它,就代表着这个类支持排序。两个对象比较就是两个值比较。
Java值对象的比较:重写toString()、hashCode()、equals()方法。
2、二次排序
MapReduce框架无论是默认排序还是自定义排序,都是只对于key值进行排序的,当我们用第一个字段排序后,还需要对第二个字段排序时,需要用到二次排序。
需求:对于reduce输出结果进行二次排序。
每个分片对应一个map任务,shuffle进入内存缓冲区(分区、排序、合并),将数据传到reduce。
排序特性:对于第一个字段排序,将第一个作为key,第一个字段相同,第二个就会放在一起。
排序消耗的是资源(CPU、内存),主要指的是内存。
将两个字段放到一个key中,组合一个新的key。
例:a,1->a#1,1
保证原来的第一个字段进行分组,当key的第一个字段相同,就代表key相同。优势:利用了MapReduce中的shuffle过程进行排序,相比放在reduce中排序,性能有所提升。
实现二次排序:
(1)组合key,key是一个组合的字段,自定义数据类型,继承WritableComparable接口。
(2)保证原来的分组规则不变,可以自定义分组规则,需要继承RawComparator,在Job中使用setGroupingComparatorClass设置。在Reduce阶段,构造一个与Key相对应的Value迭代器的时候,只要first相同就属于同一个组,放在一个Value迭代器中。
(3)保证原来的分区规则不变,可以自定义分区规则,继承Partitioner接口,此为Key的第一次比较,在Job中使用setPartitionerClass设置。HashPartitioner分区是MapReduce框架默认的分区计算方法,使用hash的方式用key的hashcode对reduce的数目取余数,得到分区到哪个reduce中。
默认情况下reduce的数目是1个,但是可以自定义数目。通过测试来设置数目,我们通常会将所有的任务规划到一个时间区域内。
3、RawComparator
Hadoop为序列化提供了优化,类型的比较对MapReduce而言至关重要,Key和Key的比较也是在排序阶段完成的,hadoop提供了原生的比较器接口RawComparator
该类并非被多数的衍生类所实现,其具体的子类为WritableComparator,多数情况下是作为实现Writable接口的类的内置类,提供序列化字节的比较。类似于一个注册表,里面记录了所有Comparator类的集合,Comparators成员用一张Hash表记录Key=Class,value=WritableComparator的注册信息。
4、MapReduce Join编程
(1)适用场合:两个待连接的表,其中一个非常大,另一个非常小,可将小表直接放于内存中,用DistributeCache实现。
(2)设计
(3)setup()准备工作-->map()-->cleanup()清理工作
setup():在map没有处理之前,先将小表的数据读到并存储到HDFS中,
map():读取大表,
map join适合数据量较小的情形
map端输出:customer表:
(4)reduce join,可以叫shuffle join
设置一个标识,判断是用户信息还是订单信息。
reduce端join:customer表:
order表:
MySQL中导出的数据文件都是CSV文件。
reduce端输入:
5、分布式拷贝DistCP
用于大的内部或外部的集群之间的数据拷贝。
底层是MapReduce程序,但是只有Map,没有Reduce。
distcp
使用示例(将第二台机器中的文件拷贝到第一台机器中):
hadoop-2.5.0] $ bin/hadoop distcp hdfs://hadoop-senior02.ibeifeng.com:8020/user/beifeng/temp/conf/wc.input hdfs://hadoop-senior.ibeifeng.com:8020/user/beifeng/temp/conf
6、Yarn的资源管理
Yarn的8088端口号浏览器页面显示内容列表如下:
Apps Submitted | Apps Pending | Apps Running | Apps Completed |
提交的应用 | 等待的应用 | 运行的应用 | 完成的应用 |
其中属性可设置如下:
(1)物理内存的大小设置,默认是8G
yarn.nodemanager.resource.memory-mb
8192
(2)检测物理内存
yarn.nodemanager.pmem-check-enabled
true
(3)设置虚拟内存大小,默认是内存大小的2.1倍
yarn.nodemanager.vmem-pmem-ratio
2.1
(4)CPU核数设置,默认是8核。VCores 虚拟核数,可以当做真实的CPU核数来理解。
yarn.nodemanager.resource.cpu-vcores
8