1. Apache Hadoop
1.1 Hadoop介绍
Hadoop是Apache旗下的一个用java语言实现的开源软件框架, 是一个开发和运行处理大规模数据的软件平台. 允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理. Hadoop不会跟某种具体的行业或者某个具体的业务挂钩, 他只是一种用来做海量数据分析处理的工具.
狭义上说, Hadoop指Apache这款开源框架, 其核心组件有:
HDFS (分布式文件系统) : 解决海量数据存储
YARN (作业调度和集群资源管理的框架) : 解决资源任务调度
MAPREDUCE (分布式运算编程框架) : 解决海量数据计算
广义上说, Hadoop通常是指一个更广泛的概念 -- Hadoop生态圈.
当下的Hadoop已经成长为一个庞大的体系.
HDFS: 分布式文件系统
MAPREDUCE: 分布式运算程序开发框架
HIVE: 基于Hadoop的分布式数据仓库, 提供基于SQL的查询数据操作
HBASE: 基于Hadoop的分布式海量数据数据库
ZOOKEEPER: 分布式协调服务基础组件
Mahout: 基于MR / Spark / Flink等分布式运算框架的机器学习算法库
OOZIE: 工作流调度框架
SQOOP: 数据导入导出工具 (比如用于mysql和HDFS之间)
FLUME: 日志数据采集框架
IMPALA: 基于Hive的实时sql查询分析
1.2 Hadoop发展简史
三篇Google论文:
1) 2003年Google发表的第一篇论文: GFS (Google分布式文件系统)
2) 2004年Google发表的第二篇论文: Google的MapReduce解决海量数据计算
同一时期,Doug Cutting基于Google的两篇论文开发出: HDFS (Hadoop的分布式文件系统) , MapReduce (基于Hadoop的分布式计算平台) 成为Apache的顶级项目.
3) 2006年Google发表的第三篇论文: BigTable, 开源界根据论文开发了HBase (基于Hadoop的分布式数据库) .
1.3 Hadoop特性优点
1) 扩容能力: Hadoop是在可用的计算机集群间分配数据并完成计算任务的, 这些集群可用方便的扩展到数以千计的节点中.
2) 成本低: Hadoop通过廉价的机器组成服务器集群来分发以及处理数据, 以至于成本很低.
3) 高效率: 通过并发数据,Hadoop可以在节点之间动态并行的移动数据, 使得速度非常快.
4) 可靠性: 能自动维护数据的多份复制, 并且在任务失败后自动的重新部署计算任务. 所以Hadoop的按位存储和处理数据的能力值得信赖.
2. Hadoop集群
2.1 发行版本
分为开源社区版和商业版
社区版: 由Apache软件基金会维护的版本, 是官方维护的版本体系.
优点: 功能最新, 免费.
缺点: 稳定性差, 兼容性差.
商业版: 由第三方商业公司在社区版基础上进行一些修改, 整合以及各个服务组件兼容性测试而发行的版本, 比如著名的cloudera的CDH, mapR, hortonWorks等.
优点: 稳定性好, 软件兼容性好.
缺点: 收费, 暂时不能使用最新的Hadoop版本.
Hadoop版本特殊, 是由多条分支并行的发展, 大的来看分为3个大的系列版本: 1.x, 2.x, 3.x.
Hadoop1.x由一个分布式文件系统HDFS和一个离线计算框架MR组成.
Hadoop2.x包含一个支持NameNode横向扩展的HDFS, 一个资源管理系统YARN和一个运行在YARN上的离线计算框架MR. 相比于Hadoop1.x, Hadoop2.x功能更加强大, 且具有更好的扩展性, 性能, 并支持多种计算框架. 现在是企业主流版本.
Hadoop3.x相比之前的Hadoop2.x有一系列的功能增强. 目前已经趋于稳定, 但是整个生态圈体系升级整合还未完毕, 所以商用还值得商榷.
2.2 集群简介
Hadoop集群具体来说包含两个集群: HDFS集群, YARN集群, 两者逻辑上分离, 但物理上常在一起.
1) HDFS集群负责海量数据的存储, 集群中的角色主要有: NameNode, DataNode, SecondaryNameNode.
2) YARN集群负责海量数据运算时的资源调度, 集群中的角色主要有: ResourceManager, NodeManager.
其中MR其实是一个分布式运算编程框架, 是应用程序开发包, 由用户按照编程规范进行程序开发, 后打包运行在HDFS集群上, 并且受到YARN集群的资源调度管理.
Hadoop部署方式分四种: Standalone mode (独立模式) , Pseudo-Distributed mode (伪分布式模式) , Cluster mode (集群模式) , HA high availability (高可用集群模式) 其中前两种都是在单机部署.
1) 独立模式又称为单机模式, 仅1个机器运行1个Java进程, 主要用于调试.
2) 伪分布模式也是在1个机器运行HDFS的NameNode和DataNode, YARN的ResourceManager和NodeManager, 但分别启动单独的Java进程, 主要用于调试.
3) 集群模式主要用于生产环境部署. 会使用N台主机组成一个集群, 这种部署模式下, 主节点和从节点会分开部署在不同的机器上.
4) 高可用集群模式主要解决单点故障, 保证集群的高可用, 提高可靠性
HDFS集群 (主从架构) :
主角色: NameNode (nn)
从角色: DataNode (dn)
主角色的辅助角色: SecondaryNameNode (snn)
YARN集群 (主从架构) :
主角色: ResourceManager (rm)
从角色: NodeManager (nm)
MR需要开发的程序组件:
Map组件
Reduce组件
Hadoop角色分布图:
HDFS原理图简单分析:
2.3 为什么CDH版本Hadoop要重新编译?
由于CDH的所有安装包版本都给出了对应的软件版本, 一般情况下是不需要自己进行编译的, 但是由于CDH给出的Hadoop的安装包没有提供带C程序访问的借口, 所有我们在使用本地库的时候就会出现问题. (本地库: 可以用来做压缩, 以及支持C程序等等)
1) Hadoop是使用Java语言开发的, 但是有一些需求和操作并不适合使用java, 所以就引入了本地库 (Native Libraries) 的概念. 说白了, 就是Hadoop的某些功能, 必须通过JNT来协调Java类文件和Native代码生成的库文件一起才能工作.
2) linux系统要运行Native代码, 首先要将Native编译成目标CPU架构的 [.so] 文件. 而不同的处理器架构, 需要编译出相应平台的动态库 [.so] 文件, 才能被正确的执行, 所以最好重新编译一次hadoop源码, 让 [.so] 文件与自己处理器相对应. 注意: windows平台是动态库 [.dll] 文件
总结: 主要是要重新编译本地库 (Native Libraries) 代码 (Linux下对应 [.so] 文件,window下对应 [.dlI] 文件) , 也就是编译生成linux下的 [.so] 文件.
源码编译后压缩包路径:
源码编译后结果:
2.4 Hadoop安装包目录结构
目录结构如下:
bin: Hadoop最基本的管理脚本和使用脚本的目录.
etc: Hadoop配置文件所在的目录.
include: 对外提供的编程库头文件 (具体动态库和静态库在lib目录中) .
lib: 包含了Hadoop对外提供的编程动态库和静态库, 与include目录中的头文件结合使用.
libexec: 各个服务对用的shell配置文件所在的目录, 可用于配置日志输出, 启动参数等基本信息.
sbin: Hadoop管理脚本所在的目录, 主要包括HDFS和YARN中各类服务的启动 / 关闭脚本.
share: Hadoop各个模块编译后的jar包所在的目录, 官方自带实例.
2.5 集群规划
集群规划: 在我们准备的三台服务器上如何搭建hadoop集群
原则:
1) 优先满足软件需要的硬件资源
2) 尽量避免有冲突的软件不要在一起
3) 有依赖的软件尽量部署在一起
规划安排:
hadoop01: NameNode DataNode | ResourceManager NodeManager
hadoop02: DataNode SecondaryNameNode | NodeManager
hadoop03: DataNode | NodeManager
未来扩展:
hadoop04: DataNode NodeManager
hadoop05: DataNode NodeManager
hadoop06: DataNode NodeManager
......
2.6 启动, Web-UI
要启动Hadoop集群, 需要启动HDFS和YARN两个集群, 首次启动HDFS时, 必须对其进行格式化操作. 本质上是一些清理和准备工作, 因此此时的HDFS在物理上还是不存在的.
Hadoop集群启动并允许, 可以通过web-ui进行查看
NameNode: http://nn_host:port/ 默认50070.
ResourceManager: http://rm_host:port/ 默认8088.
2.7 MapReduce JobHistory
JobHistory用来记录已经finished的MR运行日志, 日志信息存放于HDFS目录中, 默认情况下没有开启此功能, 需要在mapred-site.xml中配置并手动启动.
可以通过web-ui进行查看
http://nn_host:port/ 默认19888.
3. HDFS的垃圾桶机制
3.1 垃圾桶机制解析
每一个文件系统都会有垃圾桶机制, 便于将删除的数据回收到垃圾桶里, 避免某些误操作删除一些重要文件. 回收到垃圾桶里的资料数据, 都可以进行恢复.
3.2 垃圾桶机制配置
HDFS的垃圾回收的默认配置属性为0, 也就是说, 如果不小心误删了, 那么这个操作是不可恢复的. 修改core-site.xml , 那么可以按照生产上的需求设置回收站的保存时间, 这个时间以分钟为单位, 例如1440 = 24h = 1天.
3.3 垃圾桶机制验证
如果启用垃圾桶配置, dfs命令删除的文件不会立即从HDFS中删除. 相反, HDFS将其移动到垃圾目录 (每个用户在 /user/<username>/.Trash 下都有自己的垃圾目录). 只要文件保留在垃圾箱中, 文件可以快速回复.
使用skipTrash选项删除文件, 该选项不会将文件发送到垃圾桶, 它将从HDFS中完全删除.