《Hadoop权威指南》索引笔记

来源:互联网 发布:ipadpro专用软件 编辑:程序博客网 时间:2024/05/02 02:47

//2015年5月2日

hadoop文件格式:http://www.educity.cn/ei/1458138.html


一、HDFS

1.HDFS一次写入,多次读取,每次分析应涉及大部分数据-批处理才有优势


2.HDFS缺点

低延迟访问
大量小文件
用户修改


3.HDFS块大小

默认64M,但实际工作中往往调大

最小化寻址开销
但不能太大,一般一个map处理一个block,保持足够并发性
文件可超过硬盘大小
简化了存储系统的设计,均衡负载
讲元数据与其分开


4.namenode,datanode

namenode
管理文件系统的命名空间
会问到文件系统树结构
两个文件的形式:命名空间镜像文件和编辑日志文件
记录每个块在哪个节点而不是具体的位置信息
辅助namenode将定期通过编辑日志合并命名空间镜像来防止编辑日志过大
fsimage文件包含文件系统中的所有目录和文件inode的序列化信息。每个inode都是一个文件或目录的元数据的内部描述方式。
对数据块存储在datanode中,但fsimage并不描述datanode。取而代之的是,namenode将这种块映射关系放在内存中。
当datanode加入集群时,namenode向datanode索取块列表以建立块映射关系。namenode会定期征询datanode以确保它拥有最新的块映射。
其是文件系统元数据的一个永久检查点。并非每一个写操作都会更新这个文件,因为他很大。如何发送故障,可以把fsimage载入内存,再执行编辑日志中记录的各项操作。


5.文件读取剖析

cilent建一个fs对象
fs对象向namenode取块地址
cilent通过lnputstream从各个datanode上读,按照与客户端的距离
同时再向namenode检索下一批datanode地址
设计重点:namenode不会成为性能瓶颈,无需响应数据请求


6.文件写入剖析

重点:一个块写三份,则第二第三份是从第一datanode传过去的
副本的布局


7.文件缓存

HDFS建一个目录或一个小文件,可能不会马上看到

和操作系统一样,HDFS也需要同步命令来同步内存缓冲区与硬盘。


8.复制、均衡、存档

均衡使用均衡器,或distcp
小文件处理方法:归档;http://www.iteblog.com/archives/978


二、Haddop IO

1.压缩与输入分片

各种序列化方法压缩,压缩可以更好地传输

压缩格式,bzip2支持切分,或者可以用sequence file


2.序列化,writable

序列化:进程间通信和永久存储
hadoop中进程间通信是通过远程过程调用RPC实现的
hadoop自己的序列化格式:writable


3.基于文件的数据结构

对于基于MR的数据处理,将每个二进制的大对象融入自己的文件中并不能实现很多的可扩展性
一条日志文件是一行文本,如果想记录二进制类型,存文本是不合适的
sequencefile 提供了二进制键值对的永久存储的数据结构
还可以作为小文件的容器,可以获得更高效率的存储和处理。将整个文件作为一条记录处理 206
MapFile是已经排序的seqFile,加入了搜索键的索引


三、MR应用开发

1.算法调试与任务剖析


2.reduce输出

每个reduce产生一个输出
如果输出文件很大,那么把文件分成多个reducer任务很重要,这样才能让多个reducer并行工作。


3.MR调优

1.mapper的数量 mapper任务不能太小 小文件和 203
2.reducer数量 为达到高性能,数量应该小于reducer任务槽数,这样使得reducer在同一个周期完成。  195
3.中间值的压缩  
4.自定义序列 实现rawcomparator 99
5.调整shuffle  180(map处避免多次溢出;reduce端中间数据都在内存最好)


4.MR工作机制

jobcilent获取输入分片信息,为每一个分片创建一个map任务,创建的reduce任务数量由task属性决定
任务的分配:通过heartbeat给tasktrace分配任务
在选择任务之前,要选定任务所在的作业 (fair scheduler ;capacity scheduler)一般简单维护一个作业优先级列表
对map和reduce任务,tasktrace有固定数量的任务槽,根据核的数量和内存大小决定;169
默认在处理reduce任务槽之前会填满map槽,因此tasktrace会先选择map任务

reduce不用考虑数据本地化,而map任务需要;jobtrack会考虑tasktrack的网络位置,选取距离其输入分片文件最近的tasktrack。
在理想情况下,任务是数据本地化的


5.shuffle和排序

map端产生输出时,并不是简单地将其写到磁盘;而是运用一个环形内存缓冲区;
一旦缓冲区到达阈值,后台线程就把内容写到磁盘,写磁盘过程中,若缓冲区满了,会阻塞到任务完成
写磁盘之前,线程会根据数据的partition,在每个分区中按键进行内部排序。如果有一个combiner,会在排序后的输出上运行;
map写完后会有几个溢出写文件,在任务完成前,这几个会被合并成为一个已经分区且已经排序的输出文件;
后面是combiner,写磁盘时压缩map输出也是一个好主意
用于文件分区的线程可以增加
reduce的shuffle阶段也是内存缓冲区;完成所有复制后进入排序阶段,合并因子;最后一趟合并到reducer
第一个块副本写到本地磁盘


6.任务执行-adv

推测执行机制、JVM重用、跳过坏记录


7.MR类型和格式


8.reduce个数

为达到高性能,数量应该小于reducer任务槽数,这样使得reducer在同一个周期完成


四、MR的特性

1.writable comparable 部分排序

对于查找操作来说部分有序已经够了


2.MapFile查找


3.全排序

采样也需共享,分布式缓存


5.两级排序

辅助排序:组合键;设定一个分区的patitioner;但在一个分区之内,reducer任是通过键进行分区的分组;因此还需要进行分组设置


6.连接join

map端连接:在map函数前就执行连接操作;为达到该目的,各map输入数据应该先分区并以特定方式排序。各个输入数据集被划分成相同数量的分区,并且均按相同的键排序。其要求输入数据集符合特定结构,如reduce个数相同
reduce端连接:更为常用;但两个数据集都要经过shuffle过程,效率低;基本思路是在map处标记源,并且使用连接键作为输出键;
multipleinputs来一个个map;先到的放在内存里,后到的作为一个流去连接;


7.序列化边际数据--分布式缓存


五、Hive

1.托管表,外部表


2.分区、桶

分区与分桶:会为数据提供更高效的查询处理
桶为表加上了额外的结构,join的时候可以利用,在map端连接;二是取样更高效

桶中数据还可以进行排序


3.distribute by

distribute by 和sort by一起用
cluster by


4.子查询

必须放在from后


5.视图

0 0