《Hadoop权威指南》知识点整理1
Hadoop部分
YARN_调度
- YARN调度器:FIFO调度器、容量调度器、公平调度器
- YARN-FIFO调度器:简单易懂,无需配置不适合共享集群,大应用会占用集群全部资源
- YARN-容量调度器:允许多组织共享一个Hadoop集群,每个组织存在专门队列,每个队列可用一定资源,队列内使用FIFO调度策略,容量调度器会将空余资源分给资源不足的队列(弹性队列),通过设置最大容量限制避免弹性队列过多侵占其他队列的资源。容量调度器预留专门队列保证小作业快速启动,降低集群利用率,提升的大作业执行时间。
- YARN-公平调度器:为所有运行的应用公平分配资源,通过队列的权重实现资源公平共享,queuePlacementPolicy元素包含规则列表来确定应用应放入的队列。作业从启动到获得公平共享资源之间存在时间滞后,需要等上一个作业容器用完并释放资源
Hadoop-IO_序列化
- String长度为char字符个数,Text长度为其UTF8编码的字节数
- String的indexOF()返回索引位置,Text的find()返回字节偏移量
- Text可变,通过set()方法重用Text实例,Text对象通过toString()方法转换成String对象
- NullWritable序列化长度为0,充当占位符,NullWritable.get()方法获得该实例
- Writable集合类:ArrayWritable、ArrayPrimitiveWritable、TwoDArrayWritable、MapWritable、SortedMapWritable、EnumMapWritable
- MapReduce可以使用任意类型的键和值,只要能有机制对其与二进制表示互相转换,Hadoop存在可替换序列化框架的API,通过Serialization(包含在org.apache.hadoop.io.seriallizer包中)实现
- IDL:接口定义语言,通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信交流。Avro即为基于IDL的序列化框架,适用于Hadoop的大规模数据处理
Hadoop-IO_基于文件的数据结构
- Haddop的SequenceFile为二进制键值对提供了持久数据结构,同时也可以作为小文件的容器
- SequenceFile的读写操作
private static final String[] DATA = {
"one, two, buckle my shoe",
"three, four, shut the door",
"five, six, pick up sticks",
"seven, eight, lay them straight",
"nine, ten, a big fat hen"
};
// 写
IntWritable key = new IntWritable();
Text value = new Text();
SequenceFile.Writer writer = null;
try{
writer = SequenceFile.createWriter(fs, conf, path, key.getClass(), value.getClass());
// 生成多个二进制数据大对象的键值对
for( int i=0; i<100; i++ ){
// 键为100到1降序排列的整数,值为Text对象
key.set(100-i);
value.set(DATA[i % DATA.length]);
// getLength()方法获取文件当前位置
syso("[%s]\t%s\t%s\n", writer.getLength(), key, value);
// 追加到writer实例末尾
writer.append(key, value);
}finally{
IOUtils.closeStream(writer);
}
}
// 读
SequenceFile.Reader reader = null;
try{
reader = new SequenceFile.Reader(fs, path, conf);
// ReflectionUtils对象生成常见键和值的实例
Writable key = (Writable)ReflectionUtils.newInstance(reader.getKeyClass(), conf);
Writable value = (Writable)ReflectionUtils.newInstance(reader.getValueClass(), conf);
// 得到当前位置
long position = reader.getPosition();
while( reader.next(key, value) ){
// 判断是否存在同步点 writer.sync(),详见第3条
String syncSeen = reader.syncSeen() ? "*" : '';
syso("[%s%s]\t%s\t%s\n", position, sysnSeen, key, value);
// 刷新位置
position = reader.getPosition();
}finally{
IOUtils.closeStream(reader);
}
}
- 顺序文件中搜索给定位置(两种方法)
reader.seek(359); // seek()方法指向文件中的指定位置
read.next(key, value); // 若位置不是边界位置,则调用next()方法会报错
// 或
reader.sync(360); // 读取位置为指定位置的下一个同步点的位置,同步点在writer.sync(long pos)里设定,若无同步点则定位到文件末尾
- 命令行接口显示SequenceFile
hadoop fs -text number.seq | head
- 顺序文件、map文件、Avro数据文件都是面向行的格式,Hadoop中第一个面向列的文件格式是Hive的RCFile(已被Hive的ORCFile和Parquet取代),Avro也有面向列的文件格式称为Trevni。面向列不适合流的写操作。