文章目录
- 《Hadoop知识体系》
- 1. Apache Hadoop
- 2. HDFS
- 2.1. 技术架构
- 2.2. 常用命令
- 2.2.1. help
- 2.2.2. ls
- 2.2.3. lsr
- 2.2.4. mkdir
- 2.2.5. put
- 2.2.6. moveFromLocal
- 2.2.7. copyFromLocal
- 2.2.8. appendToFile
- 2.2.9. moveToLocal
- 2.2.10. get
- 2.2.11. getmerge
- 2.2.12. copyToLocal
- 2.2.13. mv
- 2.2.14. rm
- 2.2.15. cp
- 2.2.16. cat
- 2.2.17. tail
- 2.2.18. text
- 2.2.19. chmod
- 2.2.20. chown
- 2.2.21. df
- 2.2.22. du
- 2.2.23. count
- 2.2.24. setrep
- 2.2.25. expunge (慎用)
- 3. MapReduce
《Hadoop知识体系》
1. Apache Hadoop
1.1. 基础介绍
Apache Hadoop 是一个由Apache基金会所开发的可靠的、可扩展的用于分布式计算的分布式系统基础架构和开发开源软件。Apache Hadoop软件库是一个框架,允许使用简单的编程模型在计算机集群中对大规模数据集进行分布式处理。它的目的是从单一的服务器扩展到成千上万的机器,将集群部署在多台机器中,每台机器提供本地计算和存储,并且将存储的数据备份在多个节点,由此提升集群的可用性,而不是通过硬件提升。当一台机器宕机时,其他节点依然可以提供备份数据和计算服务。
Hadoop框架最核心的设计是HDFS(Hadoop Distributed File System)和MapReduce。HDFS是可扩展、高容错、高性能的分布式文件系统,负责数据的分布式存储和备份,文件写入后只能读取,不能修改。MapReduce是分布式计算框架,包含Map(映射)和Reduce (规约)两个过程。
1.2. Hadoop发展历史
Hadoop是由Apache Lucence创始人Doug Cutting创建的,Hadoop起源于开源的网络搜索引擎Apache Nutch。
2003年,Google发表的论文“The Google File System”。
2004年,Google发表了论文“MapReduce:Simplifed Data Processing onLarge Clusters”。
2005年初,Nutch的开发人员在Nutch上实现了一个MapReduce算法,半年左右的时间,Nutch的所有主要算法均完成移植,用MapReduce和NDFS来运行。
2008年1月,Hadoop已经成为Apache的顶级项目。
2017年12月,Hadoop推出3.0.0版本。
1.3. Hadoop技术生态
- Hadoop Common
- Hadoop Distributed File System (HDFS™)
- Hadoop YARN
- Hadoop MapReduce
- Ambari™
- Avro™
- Cassandra™
- Chukwa™
- HBase™
- Hive™
- Mahout™
- Pig™
- Spark™
- Tez™
- ZooKeeper™
1.4. 搭建文档
不要使用Window搭建!!! 不要使用Window搭建!!! 不要使用Window搭建!!!
Apache Hadoop 3.3.1
实例搭建
https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html
Apache Hadoop 2.10.1
实例搭建
https://hadoop.apache.org/docs/r2.10.1/hadoop-project-dist/hadoop-common/SingleCluster.html
2. HDFS
在Hadoop分布式系统框架中,首要的基础功能就是文件系统。HDFS(Hadoop Distributed File System)是Hadoop项目的一个子项目,是Hadoop的核心组件之一,Hadoop非常适于存储大型数据(比如TB和PB),其就是使用HDFS作为存储系统。HDFS使用多台计算机存储文件,并且提供统一的访问接口,像是访问一个普通文件系统一样使用分布式文件系统。
2.1. 技术架构
HDFS基于主从(Master/Slaves)架构,一共有三种节点:NameNode、DataNode和SecondaryNameNode。
![](https://gitee.com/sisyphus2016/media-repository/raw/master/hadoop/05.jpg)
![](https://gitee.com/sisyphus2016/media-repository/raw/master/hadoop/01.jpg)
2.1.1. 基于数据块的存储模型
在Hadoop2.x版本中,数据块默认大小是128M。
HDFS中文件会按字节线性切割成指定大小的数据块,每一个数据块都会作为一个文件存储在本地文件系统中。每个数据块具有自己对应的offset和唯一标识id。理论上同一文件除了最后一个数据块,其他block大小一致。
数据块Block可以设置副本(replication,并非主从),副本不能出现在同一个节点。用户上传文件时可以指定block大小和副本数,但上传后只能修改副本数。
HDFS文件支持一次写入多次读取,不支持修改,但支持追加数据。
2.1.2. NameNode
NameNode负责管理整个文件系统的元数据和每个文件所对应的数据块信息。完全基于内存存储文件元数据、目录结构、文件block的映射,需要持久化方案保证数据可靠性,提供副本放置策略。
2.1.3. DataNode
DataNode负责管理用户的文件数据块,每一个数据块都可以在多个DataNode上存储多个副本(副本数量也可以通过参数设置 dfs.replication,默认是 3)。
DataNode与NameNode维持心跳,并汇报自己持有的block信息。
DataNode基于本地磁盘存储数据块,并保存数据块的校验和保证数据块的可靠性。
2.1.4. Secondary NameNode
根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒
根据配置文件设置edits log大小 fs.checkpoint.size 规定edits文件的最大值默认是64MB
Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照,最主要作用是辅助NameNode管理元数据信息。
在非Ha模式下,Secondary NameNode一般是独立的节点,周期完成对NameNode的EditLog向FsImage合并,减少EditLog大小,减少NameNode启动时间。
![](https://gitee.com/sisyphus2016/media-repository/raw/master/hadoop/03.jpg)
Secondary NameNode
2.1.5. 元数据持久化
- 任何对文件系统元数据产生修改的操作,Namenode都会使用一种称为EditLog的事务日志记录下来
- 使用FsImage存储内存所有的元数据状态
- 使用本地磁盘保存EditLog和FsImage
- EditLog具有完整性,数据丢失少,但恢复速度慢,并有体积膨胀风险
- FsImage具有恢复速度快,体积与内存数据相当,但不能实时保存,数据丢失多
- NameNode使用了FsImage+EditLog整合的方案:
- 滚动将增量的EditLog更新到FsImage,以保证更近时点的FsImage和更小的EditLog体积
2.1.6. 安全模式
- HDFS搭建时会格式化,格式化操作会产生一个空的FsImage。
- 当Namenode启动时,它从硬盘中读取Editlog和FsImage。
- 将所有Editlog中的事务作用在内存中的FsImage上。
- 并将这个新版本的FsImage从内存中保存到本地磁盘上。
- 然后删除旧的Editlog,因为这个旧的Editlog的事务都已经作用在FsImage上了。
- Namenode启动后会进入一个称为安全模式的特殊状态。
- 处于安全模式的Namenode是不会进行数据块的复制的。
- Namenode从所有的 Datanode接收心跳信号和块状态报告。
- 每当Namenode检测确认某个数据块的副本数目达到这个最小值,那么该数据块就会被认为是副本安全(safely replicated)的。
- 在一定百分比(这个参数可配置)的数据块被Namenode检测确认是安全之后(加上一个额外的30秒等待时间),Namenode将退出安全模式状态。
- 接下来它会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他Datanode上。
2.1.7. Block的副本放置策略
- 第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
- 第二个副本:放置在于第一个副本不同的 机架的节点上。
- 第三个副本:与第二个副本相同机架的节点。
- 更多副本:随机节点。
2.1.8. HDFS写流程
![](https://gitee.com/sisyphus2016/media-repository/raw/master/hadoop/02.jpg)
HDFS写流程
- Client和NN连接创建文件元数据
- NN判定元数据是否有效
- NN处发副本放置策略,返回一个有序的DN列表
- Client和DN建立Pipeline连接
- Client将块切分成packet(64KB),并使用chunk(512B)+chucksum(4B)填充
- Client将packet放入发送队列dataqueue中,并向第一个DN发送
- 第一个DN收到packet后本地保存并发送给第二个DN
- 第二个DN收到packet后本地保存并发送给第三个DN
- 这一个过程中,上游节点同时发送下一个packet
- 生活中类比工厂的流水线:结论:流式其实也是变种的并行计算
- Hdfs使用这种传输方式,副本数对于client是透明的
- 当block传输完成,DN们各自向NN汇报,同时client继续传输下一个block
- 所以,client的传输和block的汇报也是并行的
2.1.9. HDFS读流程
![](https://gitee.com/sisyphus2016/media-repository/raw/master/hadoop/04.jpg)
HDFS读流程
- 为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本。
- 如果在读取程序的同一个机架上有一个副本,那么就读取该副本。
- 如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本。
- 语义:下载一个文件:
- Client和NN交互文件元数据获取fileBlockLocation
- NN会按距离策略排序返回
- Client尝试下载block并校验数据完整性
- 语义:下载一个文件其实是获取文件的所有的block元数据,那么子集获取某些block应该成立
- Hdfs支持client给出文件的offset自定义连接哪些block的DN,自定义获取数据
- 这个是支持计算层的分治、并行计算的核心
2.2. 常用命令
2.2.1. help
查看某一个操作命令的参数信息。
hdfs dfs -help
2.2.2. ls
类似于 Linux 的 ls 命令,显示文件列表。
hdfs dfs -ls URI
2.2.3. lsr
在整个目录下递归执行ls, 与 UNIX 中的 ls-R 类似。
hdfs dfs -lsr URI
2.2.4. mkdir
以中的URI 作为参数,创建目录。使用-p 参数可以递归创建目录。
hdfs dfs -mkdir [-p] <paths>
2.2.5. put
将单个的源文件src 或者多个源文件 srcs 从本地文件系统拷贝到目标文件系统中(对应的路径)。也可以从标准输入中读取输入,写入目标文件系统中。
hdfs dfs -put <localsrc> ... <dst>
示例:
hdfs dfs -put /rooot/bigdata.txt /dir1
2.2.6. moveFromLocal
和 put 命令类似,但是源文件localsrc拷贝之后自身被删除。
hdfs dfs -moveFromLocal <localsrc> <dst>
示例:
hdfs dfs -moveFromLocal /root/bigdata.txt /
2.2.7. copyFromLocal
从本地文件系统中拷贝文件到 hdfs 路径去。
hdfs dfs -copyFromLocal <localsrc> ... <dst>
2.2.8. appendToFile
追加一个或者多个文件到 hdfs 指定文件中.也可以从命令行读取输入。
hdfs dfs -appendToFile <localsrc> ... <dst>
示例:
hdfs dfs -appendToFile a.xml b.xml /big.xml
2.2.9. moveToLocal
将本地文件剪切到 HDFS。
格式:hadoop dfs -moveToLocal [-crc] <src> <dst>
2.2.10. get
将文件拷贝到本地文件系统。 CRC 校验失败的文件通过-ignorecrc 选项拷贝。 文件和CRC 校验可以通过-CRC 选项拷贝。
hdfs dfs -get [-ignorecrc ] [-crc] <src> <localdst>
示例:
hdfs dfs -get /bigdata.txt /export/servers
2.2.11. getmerge
合并下载多个文件,比如 hdfs 的目录 /aaa/下有多个文件:log.1, log.2,log.3,…
hdfs dfs -getmerge <src> <localdst>
2.2.12. copyToLocal
从 hdfs 拷贝到本地。
hdfs dfs -copyToLocal <src> ... <localdst>
2.2.13. mv
将 hdfs 上的文件从原路径移动到目标路径(移动之后文件删除),该命令不能跨文件系统。
hdfs dfs -mv URI <dest>
示例:
hdfs dfs -mv /dir1/bigdata.txt /dir2
2.2.14. rm
删除参数指定的文件,参数可以有多个。 此命令只删除文件和非空目录。如果指定-skipTrash 选项,那么在回收站可用的情况下,该选项将跳过回收站而直接删除文件;否则,在回收站可用时,在 HDFS Shell 中执行此命令,会将文件暂时放到回收站中。
hdfs dfs -rm [-r] 【-skipTrash】 URI 【URI 。。。】
示例:
hdfs dfs -rm -r /dir1
2.2.15. cp
将文件拷贝到目标路径中。如果 为目录的话,可以将多个文件拷贝到该目录下。
-f :
选项将覆盖目标,如果它已经存在。
-p :
选项将保留文件属性(时间戳、所有权、许可、ACL、XAttr)。
hdfs dfs -cp URI [URI ...] <dest>
示例:
hdfs dfs -cp /dir1/a.txt /dir2/bigdata.txt
2.2.16. cat
将参数所指示的文件内容输出到 stdout。
hdfs dfs -cat URI [uri ...]
示例:
hdfs dfs -cat /bigdata.txt
2.2.17. tail
显示一个文件的末尾。
hdfs dfs -tail path
2.2.18. text
以字符形式打印一个文件的内容。
hdfs dfs -text path
2.2.19. chmod
改变文件权限。如果使用 -R 选项,则对整个目录有效递归执行。使用这一命令的用户必须是文件的所属用户,或者超级用户。
hdfs dfs -chmod [-R] URI[URI ...]
示例:
hdfs dfs -chmod -R 777 /bigdata.txt
2.2.20. chown
改变文件的所属用户和用户组。如果使用 -R 选项,则对整个目录有效递归执行。使用这一命令的用户必须是文件的所属用户,或者超级用户。
hdfs dfs -chmod [-R] URI[URI ...]
示例:
hdfs dfs -chown -R hadoop:hadoop /bigdata.txt
2.2.21. df
统计文件系统的可用空间信息。
hdfs dfs -df -h path
2.2.22. du
统计文件夹的大小信息。
hdfs dfs -du -s -h path
2.2.23. count
统计一个指定目录下的文件节点数量。
hdfs dfs -count path
2.2.24. setrep
注意: 即使设置的超过了 datanode 的数量,副本的数量也最多只能和 datanode 的数量是一致的。
设置 hdfs 中文件的副本数量。
hdfs dfs -setrep num filePath
2.2.25. expunge (慎用)
清空 hdfs 垃圾桶。
hdfs dfs -expunge