Hadoop&HDFS知识点整理

创作之初

最近抽时间看了下Hadoop权威指南一书,对原理有了更深刻的理解,顺便整理了一些重要的知识点,工作或面试中能用得上,需要的请收藏点赞。

知识点整理

1.尽量在计算节点上存储数据,以实现数据的本地快速访问,数据本地化特性是hadoop数据处理的核心。

2.hadoop为每个分片构建一个map任务,小文件会导致大量的map任务。一个合理的分片大小趋向于HDFS的一个块的大小,默认是128MB。

3.map任务将其输出写入本地硬盘,而非HDFS。因为map输出是中间结果,中间结果由reduce任务处理后才产生最终结果,一旦作业完成,map的输出结果就可以删除。

4.reduce任务输入来自于所有mapper的输出,不具备数据本地化的优势,输出存储在HDFS上,需要占用网络带宽,任务数不是由输入数据的大小决定,是独立的。

5.combiner函数能帮助减少mapper和reducer之间的数据船数量,通过Reducer类来定义。

6.大量的小文件:由于namenode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于namenode内存容量。每个文件、目录和数据块的存储信息大约占150字节。

7.HDFS中文件的写入只支持单个写入者,写操作总是以只添加的方式在文件末尾写数据,不支持多个写入者的操作,也不支持在文件的任意位置进行修改。

8.HDFS的块默认128MB,比磁盘块大,目的是为了最小化寻址开销。

9.列出文件系统中各个文件由哪些块构成:hdfs fsck / -files -blocks

10.namenode管理文件系统的命名空间,维护文件系统树以及整棵树所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。

11.datanode是文件系统的工作节点,存储并检索数据块,定期向namenode发送他们所存储的块的列表。

12.namenode容错:(1)将持久状态写入本地磁盘的同时,写入一个远程挂载的网络文件系统(NFS) (2)运行一个辅助namenode,定期合并编辑日志与命名空间镜像,以防止编辑日志过大。存储在NFS上的namenode元数据复制到辅助namenode并作为新的主namenode运行。

13.namenode HA:
namenode 之间需要通过高可用共享存储实现编辑日志的共享。当备用 namenode 接管工作之后,它将通读共享编辑日志直至末尾,以实现与活动 namenode 的状态同步,井继续读取由活动 namenode 写人的新条目 。
datanode 需要同时向两个 namenode 发送数据块处理报 告,因为数据块的映射信息存储在 namenode 的内存中,而非磁盘。
客户端需要使用特定的机制来处理 namenode 的失效问题,这一机制对 用户是透明的。
辅助 namenode 的角色被备用 namenode 所包含,备用 namenode 为 活动 的 namenode 命名空间设置周期性检查点。

14.从本地文件系统中将一个文件复制到HDFS:hdfs dfs -copyFromLocal input/docs/test.txt /user/tom/test.txt (-copyToLocal 把文件复制回本地文件系统)

15.复制大文件或目录: hadoop distcp file1 file2 同步修改: hadoop distcp -update dir1 dir2

16.CodecPool 压缩解压缩池,支持反复使用压缩和解压缩,分摊创建这些对象的开销.

17.gzip不支持文件切分,bzip2文件支持切分.

18.Avro、Parquet文件格式支持压缩和切分,与快压工具Snappy、LZO,LZ4联合使用。

19.合理选择数据块的大小、确保压缩后数据块的大小近似于HDFS块的大小.

20.文件格式
(1)Avro: .avsc是文件扩展名,数据文件,紧凑且可切分,可移植,可跨越不同的编程语言,二进制格式,面向行,连续存储,适合同时处理一行中很多列的情况,实现了高效的二进制比较,不需要将二进制对象反序列化为对象即可实现比较,因为它可以直接对字节流进行操作。
面向列的存储不适合流的写操作,如果write处理失败,当前的文件无法恢复,Flume使用面向行的存储形式。
(2)Parquet面向列的存储,查询性能优秀,存储更少占用空间,节省时间并提升I/O操作效率。

21.Configuration从资源中读取属性值。

22.小文件处理:CombineFilelnputFormat把多个文件打包到一个分片中以便每个mapper可以处理更多的数据,避免输入文件切分(1.增加最小分片的大小,设置long.MAX_VALUE 2.使用 FileinputFormat 具体子类,并且 重写 isSplitable()方法@把返回值设置为 false)。

23.Flume收集数据减少小文件数可以使用多层代理的方式,通过第二层代理汇聚来自第一层的事件。

24.sqoop的import工具会运行一个MR作业,默认情况下,该作业会并行使用4个map任务,可以通过参数调整(-m ),可以指定分隔符、文件格式、压缩方式。应该使用 Sqoop的 SequenceFile格式、的ro格式或 Parquet 文件。

25.sqoop,当导人的大对象数据大于阔值 16 M 时(通过 sqoop. inline.lob.length.max 设置,以字节为单位), Sqoop 将导入的大对 象数据存 储在 LobFile 格式的单独文件中。 LobFile 格式能够存储非常大的单条记录(使 用了 64 位的地址空间),每条记录保存一个大对象。 LobFile 格式允许客 户端持 有对记录的引用,而不访问记录内容,对记录的访问是通过 java.io.InputStream(用于二进制对象)或 java.io.Reader(用于字符对象)来实 现的。

26.控制map数据:(1)通过压缩文件,一个压缩文件一个map (2)修改对应参数 (3)修改block参数

27.namenode查找数据位置:
(1)文件名 (path)—》blockid
(2)blockid -》 datanode

28.crc32,签名, hdfs数据校验 client -> datanode 默认512字节创建一个校验码,修复命令DN接收NN发送的一个block修复指令,datanode -> client,同样也需要签名校验

29.zkfc 是zk集群的客户端,监控NN的状态信息

30.同步问题,需要依赖JournalNodes 守护进程,完成元数据的一致性,JN数量大于等于3个。

31.为什么用QJM来实现HA:
(1)不需要配置额外的共享存储
(2)消除单点问题
(3)可配置
(4)JN不会因为其中一台的延迟而影响整体的延迟,也不会因为JN的数量增多而影响

32.Hadoop 2.4.0开始,使用hdfs acl做权限控制。

33.Container是Yarn中最基本的处理单元,通常建议:一块磁盘和一个cpu,配置2个Container会达到集群利用率的最佳平衡

34.文件分发命令:
(1)-file:把本地文件分发到集群节点
(2)-cacheFile:把hdfs文件分发到集群节点
(3)-cacheArchive:把hdfs目录(压缩包)分发到集群节点

欢迎补充

原文地址:https://www.cnblogs.com/zfwwdz/p/13183268.html