Hadoop大数据入门与实践.pdf
http://www.100md.com
2020年11月10日
![]() |
| 第1页 |
![]() |
| 第10页 |
![]() |
| 第17页 |
![]() |
| 第22页 |
![]() |
| 第45页 |
![]() |
| 第78页 |
参见附件(3194KB,84页)。
Hadoop大数据入门与实践
大数据时代已经到来,越来越多的行业面临着大量数据需要存储以及分析的挑战。Hadoop,作为一个开源的分布式并行处理平台,以其高扩展、高效率、高可靠等优点,得到越来越广泛的应用,小编今天就为大家准备了相关的资料供大家
书籍内容部分预览









实例简介
全书共有12章,从Hadoop起源开始,介绍了Hadoop的安装和配置,并对Hadoop的组件分别进行了介绍,包括HDFS分布式存储系统,MapReduce计算框架,海量数据库HBase,Hive数据仓库,Pig、ZooKeeper管理系统等知识,最后对Hadoop实时数据处理技术作了简单介绍,旨在让读者了解当前的其它的大数据处理技术。
本书除了对Hadoop的理论进行说明之外,还对如何使用各组件进行了介绍,但介绍的只是基础的使用,没有涉及到底层的高级内容,所以本书只是起一个引导作用,旨在让读者了解Hadoop并能够使用Hadoop的基本功能,并不是学习Hadoop的完全手册。
Hadoop功能和作用
Hadoop是一个分布式存储和计算的平台
http://hadoop.apache.org
2个核心组成部分
HDFS:分布式文件系统,存储海量数据
MapReduce:并行处理框架,实现任务分解和调度
主要应用
搭建大型数据仓库,PB级数据的存储,处理,分析,统计等业务(搜索引擎,商业智能,日志分析,数据挖掘)
主要优势
高扩展,理论上无限扩展
低成本
成熟的生态圈(开源的力量),基于这个平台的工具很多
Hadoop已经成为业界大数据平台的首选
【Hadoop生态系统和版本】
HDFS
MapReduce
Hive,小蜜蜂,降低使用Hadoop的门槛。把SQL语句转化为Hadoop任务
Hbase,存储结构化数据的分布式数据库。
与传统关系型数据库区别:放弃事务特性,追求更高的扩展
与HDFS区别:提供了数据的随机读写和实时访问,实现对表数据的读写功能
zookeeper,动物管理员。监控Hadoop节点状态,管理集群,维护节点间数据的一致性。
Hadoop1.x与2.x差别很大。现在已经是3.x版本。
自学大数据Hadoop需要哪些基础知识
需要的基础知识:我觉得Java就够了。Linux基本上需要用的时候之直接百度就可以了,但是Java你必须过完基础,这个可以保证你能够上手hadoop,至少想要实现的逻辑能够自己用Java写出来。
Linux的基础用在三部分
(1)搭建hadoop集群环境:这个需要安装操作系统,安装一些组件,配置SSH无密码登陆,修改hadoop配置文件等。这部分有博客介绍入门 hadoop学习之hadoop完全分布式集群安装 你按照步骤来,但是估计这个要折腾一两个星期的,期间会有各种小问题。
(2)hadoop 本身有些命令是 和Linux shell命令很像的,比如 shell里面的查看/usr/hdfs/目录下文件命令是
ls /usr/hdfs在hadoop中查看 /user/hdfs命令是
hadoop fs -ls /usr/hdfs有这个基础 你可以快速使用hadoop shell命令
(3)集群的维护。hadoop作为开源分布式框架,用起来没那么舒服。期间会各种各样的问题,你需要去排查,这个过程你得有些linux的基础才知道如何去查看问题日志,定位问题的根源。
关于是否培训:
我个人并不看好培训,一者费用过高,一般都是上万;二者现在各种在线的网络课堂都有成套的教程,按照教程慢慢来也是可以系统学到的。
培训的唯一价值,我个人认为在于对没有相关工作经验的人来说,培训机构可以为你推荐一些就业机会。
Hadoop大数据入门与实践截图




郭专老师
猿课教育
Hadoop 大数据入门与实践
Hadoop 入门与实践
目录
Hadoop 入门与实践 ..................................................................................................................... 1
第一章 前言 ....................................................................................................................... 3
第二章 hadoop简介 ............................................................................................................. 3
1. Hadoop版本衍化历史 .............................................................................................. 3
2. Hadoop生态圈 .......................................................................................................... 4
第三章 安装hadoop 环境 .................................................................................................... 6
第四章 HDFS 文件系统 ..................................................................................................... 13
1. HDFS特点: ............................................................................................................ 13
2. 不适用于 HDFS的场景: ....................................................................................... 14
3. HDFS体系架构 ........................................................................................................ 15
4. HDFS数据块复制 .................................................................................................... 16
5. HDFS读取和写入流程 ............................................................................................ 17
6. 操作HDFS的基本命令 ........................................................................................... 19
第五章 Mapreduce计算框架 .......................................................................................... 21
1. MapReduce 编程模型 ............................................................................................. 21
2. MapReduce 执行流程 ............................................................................................. 23
3. MapReduce 数据本地化(Data-Local) ................................................................ 26
4. MapReduce 工作原理 ............................................................................................. 27
5. MapReduce 错误处理机制 ..................................................................................... 30
第六章 Zookeeper .............................................................................................................. 32
1. Zookeeper 数据模型 ............................................................................................... 33
2. Zookeeper 访问控制 ............................................................................................... 35
3. Zookeeper 应用场景 ............................................................................................... 36
第七章 HBase ....................................................................................................................... 37
1. Hbase 简介 ............................................................................................................... 37 2. Hbase 数据模型 ....................................................................................................... 39
3. Hbase 架构及基本组件 ........................................................................................... 41
4. Hbase 容错与恢复 ................................................................................................... 43
5. Hbase 基础操作 ....................................................................................................... 44
第八章 Hive .......................................................................................................................... 48
1. Hive 基础原理 .......................................................................................................... 48
2. Hive 基础操作 .......................................................................................................... 52
第九章 流式计算解决方案-Storm ...................................................................................... 59
1. Storm 特点 ............................................................................................................... 60
2. Storm 与 Hadoop 区别 ............................................................................................ 61
3. Storm 基本概念 ....................................................................................................... 63
4. Storm 系统架构 ....................................................................................................... 69
5. Storm 容错机制 ....................................................................................................... 71
6. 一个简单的 Storm实现 .......................................................................................... 72
7. Storm 常用配置 ....................................................................................................... 73
第十章 数据挖掘——推荐系统 .......................................................................................... 74
1. 数据挖掘和机器学习概念 ...................................................................................... 75
2. 一个机器学习应用方向——推荐领域 ................................................................... 75
3. 推荐算法——基于内容的推荐方法 ....................................................................... 76
4. 推荐算法——基于协同过滤的推荐方法 ............................................................... 80
第一章 前言
出此书的目的就是为了帮助新人快速加入大数据行业, 市面上有很多类似的书籍都是重
理论少实践,特别缺少一线企业实践经验的传授,而这个课程会让您少走弯路、快速入门和
实践,让您再最短时间内达到一个一线企业大数据工程师的能力标准,因为在课程整理和实
践安排上过滤掉很多用不上的知识,直接带领大家以最直接的方式掌握大数据使用方法。
作者在知名一线互联网公司从事大数据开发与管理多年,深知业界大数据公司一直对大
数据人才的渴望,同时也知道有很多的大数据爱好者想参与进这个朝阳行业,因为作者平时
也是需要参与大数据工程师的招聘与培养的,所以特别想通过一种方式,让广大的大数据爱
好者更好的与企业对接,让优秀的人才找到合适的企业,《Hadoop入门与实践》电子书是作
者根据多年从业经验整理的系列课程,希望让更多的大数据爱好者收益!
第二章 hadoop 简介
Hadoop 是一个由 Apache 基金会所开发的开源分布式系统基础架构。用户可以在不了
解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。
解决了大数据(大到一台计算机无法进行存储,一台计算机无法在要求的时间内进行处理)
的可靠存储和处理。适合处理非结构化数据,包括HDFS,MapReduce基本组件。
1. Hadoop版本衍化历史
由于Hadoop版本混乱多变对初级用户造成一定困扰,所以对其版本衍化历史有个大概
了解,有助于在实践过程中选择合适的Hadoop版本。
Apache Hadoop版本分为分为 1.0和2.0两代版本,我们将第一代Hadoop 称为 Hadoop
1.0,第二代Hadoop 称为Hadoop 2.0。下图是 Apache Hadoop的版本衍化史:
第一代Hadoop包含三个大版本,分别是 0.20.x,0.21.x和0.22.x,其中,0.20.x 最后演
化成1.0.x,变成了稳定版。
第二代 Hadoop 包含两个版本,分别是 0.23.x 和 2.x,它们完全不同于 Hadoop 1.0,是
一套全新的架构,均包含 HDFS Federation 和 YARN 两个系统,相比于 0.23.x,2.x 增加了
NameNode HA和Wire-compatibility两个重大特性。
Hadoop 遵从 Apache 开源协议,用户可以免费地任意使用和修改 Hadoop,也正因此,市面上出现了很多Hadoop 版本,其中比较出名的一是Cloudera公司的发行版,该版本称为
CDH(Cloudera Distribution Hadoop)。
截至目前为止,CDH 共有4 个版本,其中,前两个已经不再更新,最近的两个,分别是
CDH3(在Apache Hadoop 0.20.2 版本基础上演化而来的)和 CDH4 在Apache Hadoop 2.0.0 版
本基础上演化而来的),分别对应Apache 的Hadoop 1.0和 Hadoop 2.0。
2. Hadoop生态圈
架构师和开发人员通常会使用一种软件工具,用于其特定的用途软件开发。例如,他们
可能会说,Tomcat是 Apache Web服务器,MySQL是一个数据库工具。
然而,当提到Hadoop 的时候,事情变得有点复杂。Hadoop包括大量的工具,用来协同
工作。因此,Hadoop 可用于完成许多事情,以至于,人们常常根据他们使用的方式来定义
它。
对于一些人来说, Hadoop是一个数据管理系统。他们认为Hadoop是数据分析的核心,汇集了结构化和非结构化的数据,这些数据分布在传统的企业数据栈的每一层。对于其他人,Hadoop 是一个大规模并行处理框架,拥有超级计算能力,定位于推动企业级应用的执行。
还有一些人认为Hadoop作为一个开源社区,主要为解决大数据的问题提供工具和软件。因
为Hadoop可以用来解决很多问题,所以很多人认为 Hadoop是一个基本框架。
虽然 Hadoop 提供了这么多的功能,但是仍然应该把它归类为多个组件组成的 Hadoop
生态圈,这些组件包括数据存储、数据集成、数据处理和其它进行数据分析的专门工具。
该图主要列举了生态圈内部主要的一些组件,从底部开始进行介绍:
1) HDFS:Hadoop 生态圈的基本组成部分是 Hadoop 分布式文件系统(HDFS)。HDFS 是一
种数据分布式保存机制,数据被保存在计算机集群上。数据写入一次,读取多次。HDFS
为 HBase 等工具提供了基础。
2) MapReduce:Hadoop 的主要执行框架是 MapReduce,它是一个分布式、并行处理的编
程模型。MapReduce 把任务分为 map(映射)阶段和 reduce(化简)。开发人员使用存储在
HDFS 中数据(可实现快速存储),编写 Hadoop 的 MapReduce 任务。由于 MapReduce
工作原理的特性, Hadoop能以并行的方式访问数据,从而实现快速访问数据。
3) Hbase:HBase 是一个建立在HDFS之上,面向列的 NoSQL数据库,用于快速读写大量
数据。HBase 使用 Zookeeper进行管理,确保所有组件都正常运行。
4) ZooKeeper:用于Hadoop的分布式协调服务。Hadoop的许多组件依赖于 Zookeeper,它
运行在计算机集群上面,用于管理Hadoop操作。
5) Hive:Hive类似于 SQL高级语言,用于运行存储在Hadoop上的查询语句,Hive 让不熟
悉 MapReduce 开发人员也能编写数据查询语句,然后这些语句被翻译为 Hadoop 上面
的 MapReduce 任务。像 Pig 一样,Hive 作为一个抽象层工具,吸引了很多熟悉 SQL 而
不是Java编程的数据分析师。
6) Pig:它是 MapReduce 编程的复杂性的抽象。Pig 平台包括运行环境和用于分析 Hadoop
数据集的脚本语言(Pig Latin)。其编译器将 Pig Latin翻译成MapReduce程序序列。
7) Sqoop: 是一个连接工具,用于在关系数据库、数据仓库和Hadoop之间转移数据。 Sqoop
利用数据库技术描述架构,进行数据的导入导出;利用MapReduce 实现并行化运行和容错技术。
第三章 安装hadoop 环境
由于实践部分主要以 Hadoop 1.0 环境为主,所以这主要介绍如何搭建 Hadoop 1.0
分布式环境。
整个分布式环境运行在带有linux 操作系统的虚拟机上,至于虚拟机和 linux 系统的安
装这里暂不做过多介绍。
安装Hadoop分布式环境:
1) 下载Hadoop安装包:
在 http:pan.baidu.coms1qXSN3hM 地址中可以找到 hadoop-1.2.1-bin.tar.gz
文件
使用securtCRT的rz功能上传hadoop-1.2.1-bin.tar.gz这个文件到虚拟机的系统中。
同样在securtcrt 中ll时,能得到
2) 安装Hadoop安装包:
· 首先将安装包解压缩:
· Linux 终端执行cd进入相应目录:
· 新增tmp 目录,mkdir homehadoophadoop-1.2.1tmp
3) 配置Hadoop:
· 使用vim修改 master文件内容:
将 localhost 修改成 master:
最后保存退出。
· 修改slaves 文件
注意,这里准备设置几台 slave 机器,就写几个,因为当前分布式环境有四个虚拟机,一台做master,三台做 slave,所以这里写成了三个 slave
· 修改core-site.xml文件:
【注意】中间的 ip地址,不要输入192.168.2.55,根据自己的情况设置。
· 修改mapred-site.xml文件:
【注意】记得value 的内容要以http开头。 ? 修改hdfs-site.xml文件:
其中,3视情况修改,如果有三台slave 机器,这里设置成 3,如果
只有1 台或2 台,修改成对应的值即可。
· 修改hadoo-env.sh 文件
在
下新增export JAVA_HOME=homehadoopjdk1.6.0_45
· 修改本地网络配置:编辑etchosts 文件
【注意】Ip地址根据具体的情况要进行修改。
4) 复制虚拟机
· 关闭当前虚拟机,并复制多份
【注意】要选择初始化所有网卡的 mac 地址
根据自己需求,复制 2到3 台虚拟机作为 slave,同样要确认网络连接方式为桥接。
· 设置所有机器的 IP地址 分别启动虚拟机,修改机器的 ip 地址,在虚拟机的图形界面里,选择设置
单击打开,在弹出来的窗口里,选择
打开 ,修改成如下的形式,选择 ipv4 ,分配方式选择成manual。
【注意】具体的 ip地址,根据实际的情况来设置,因为培训教室里都是 192.168.2.x的
网段,所以我这里设置成了 192.168.2.x,每个人选择自己的一个 ip地址范围,注意不要和
其它人冲突了。
5) 建立互信关系
· 生成公私钥,在 master 机器的虚拟机命令行下输入 ssh-keygen,一路回车,全
默认
· 复制公钥
复制一份master的公钥文件,cat ~.sshid_rsa.pub >> ~.sshauthorized_keys
同样,在所有的 slave 机器上,也在命令行中输入ssh-keygen,一路回车,全默认
在所有的salve机器上,从master 机器上复制 master 的公钥文件:
· 测试连接
在 master 机器上分别向所有的 slave 机器发起联接请求:
如:ssh slave1
【注意】记得一旦联接上,所有的操作,就视同在对应的 slave 上操作,所以一定要记
得使用exit 退出联接。
6) 启动Hadoop:
· 初始化:在 master 机器上,进入homehadoophadoop-1.2.1bin 目录
在安装包根目录下运行.hadoop namenode –format来初始化hadoop的文件系统。
· 启动
执行.start-all.sh,如果中间过程提示要判断是否,需要输入yes
输入jps,查看进程是否都正常启动。
如果一切正常,应当有如上的一些进程存在。
7) 测试系统
输入.hadoop fs –ls
能正常显示文件系统。
如此,hadoop系统搭建完成。否则,可以去homehadoophadoop-1.2.1logs目
录下,查看缺少的进程中,对应的出错日志。
第四章 HDFS 文件系统
Hadoop 附带了一个名为 HDFS(Hadoop 分布式文件系统)的分布式文件系统,专门
存储超大数据文件,为整个Hadoop生态圈提供了基础的存储服务。
本章内容:
1) HDFS文件系统的特点,以及不适用的场景
2) HDFS文件系统重点知识点:体系架构和数据读写流程
3) 关于操作HDFS文件系统的一些基本用户命令
1. HDFS特点:
HDFS专为解决大数据存储问题而产生的,其具备了以下特点:
1) HDFS文件系统可存储超大文件
每个磁盘都有默认的数据块大小,这是磁盘在对数据进行读和写时要求的最小单位,文件系统是要构建于磁盘上的, 文件系统的也有块的逻辑概念,通常是磁盘块的整数倍,通常文件系统为几千个字节,而磁盘块一般为512个字节。
HDFS 是一种文件系统,自身也有块(block)的概念,其文件块要比普通单一磁
盘上文件系统大的多,默认是64MB。
HDFS上的块之所以设计的如此之大,其目的是为了最小化寻址开销。
HDFS文件的大小可以大于网络中任意一个磁盘的容量,文件的所有块并不需要存
储在一个磁盘上,因此可以利用集群上任意一个磁盘进行存储,由于具备这种分布式存
储的逻辑,所以可以存储超大的文件,通常 G、T、P 级别。
2) 一次写入,多次读取
一个文件经过创建、写入和关闭之后就不需要改变,这个假设简化了数据一致性的
问题,同时提高数据访问的吞吐量。
3) 运行在普通廉价的机器上
Hadoop 的设计对硬件要求低,无需昂贵的高可用性机器上,因为在 HDFS 设计
中充分考虑到了数据的可靠性、安全性和高可用性。
2. 不适用于 HDFS 的场景:
1) 低延迟
HDFS不适用于实时查询这种对延迟要求高的场景,例如:股票实盘。往往应对低
延迟数据访问场景需要通过数据库访问索引的方案来解决,Hadoop 生态圈中的
Hbase具有这种随机读、低延迟等特点。
2) 大量小文件
对于Hadoop系统, 小文件通常定义为远小于 HDFS 的 block size (默认 64MB)的文件,由于每个文件都会产生各自的MetaData元数据,Hadoop 通过Namenode
来存储这些信息,若小文件过多,容易导致Namenode 存储出现瓶颈。
3) 多用户更新
为了保证并发性,HDFS需要一次写入多次读取,目前不支持多用户写入,若要修
改,也是通过追加的方式添加到文件的末尾处, 出现太多文件需要更新的情况, Hadoop
是不支持的。
针对有多人写入数据的场景,可以考虑采用 Hbase的方案。
4) 结构化数据
HDFS适合存储半结构化和非结构化数据,若有严格的结构化数据存储场景,也可
以考虑采用Hbase 的方案。
5) 数据量并不大
通常 Hadoop 适用于 TB、PB 数据,若待处理的数据只有几十 GB 的话,不建议
使用Hadoop,因为没有任何好处。
3. HDFS体系架构
HDFS 是一个主从(MasterSlave)体系架构,由于分布式存储的性质,集群拥有两
类节点NameNode和DataNode。
NameNode(名字节点) :系统中通常只有一个,中心服务器的角色,管理存储和检索
多个DataNode 的实际数据所需的所有元数据。
DataNode(数据节点) :系统中通常有多个,是文件系统中真正存储数据的地方,在
NameNode 统一调度下进行数据块的创建、删除和复制。
图中的 Client 是 HDFS 的客户端,是应用程序可通过该模块与 NameNode 和
DataNode 进行交互,进行文件的读写操作。
4. HDFS数据块复制
为了系统容错,文件系统会对所有数据块进行副本复制多份,Hadoop 是默认 3 副本
管理。
复本管理策略是运行客户端的节点上放一个复本(若客户端运行在集群之外,会随机选
择一个节点) ,第二个复本会放在与第一个不同且随机另外选择的机架中节点上,第三个复
本与第二个复本放在相同机架,切随机选择另一个节点。所存在其他复本,则放在集群中随机选择的节点上,不过系统会尽量避免在相同机架上放太多复本。
所有有关块复制的决策统一由NameNode 负责, NameNode 会周期性地接受集群中
数据节点 DataNode 的心跳和块报告。一个心跳的到达表示这个数据节点是正常的。一个
块报告包括该数据节点上所有块的列表。
5. HDFS读取和写入流程
1) 读文件的过程:
首先Client 通过File System的Open函数打开文件,Distributed File System用
RPC 调用NameNode 节点,得到文件的数据块信息。对于每一个数据块,NameNode
节点返回保存数据块的数据节点的地址。Distributed File System返回
FSDataInputStream给客户端,用来读取数据。客户端调用stream的 read函数开始读
取数据。DFSInputStream连接保存此文件第一个数据块的最近的数据节点。DataNode
从数据节点读到客户端(client),当此数据块读取完毕时,DFSInputStream关闭和此数据
节点的连接,然后连接此文件下一个数据块的最近的数据节点。当客户端读取完毕数据的
时候,调用FSDataInputStream的close函数。 在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数
据块的下一个数据节点。失败的数据节点将被记录,以后不再连接。
2) 写文件的过程:
客户端调用create来创建文件,Distributed File System用RPC 调用NameNode
节点,在文件系统的命名空间中创建一个新的文件。NameNode 节点首先确定文件原来不
存在,并且客户端有创建文件的权限,然后创建新文件。
Distributed File System返回DFSOutputStream,客户端用于写数据。客户端开始写
入数据,DFSOutputStream 将数据分成块,写入 Data Queue。Data Queue 由 Data
Streamer 读取,并通知NameNode 节点分配数据节点,用来存储数据块(每块默认复制3
块)。分配的数据节点放在一个Pipeline里。Data Streamer 将数据块写入 Pipeline中的第
一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发
送给第三个数据节点。
DFSOutputStream为发出去的数据块保存了 Ack Queue,等待Pipeline中的数据节
点告知数据已经写入成功。 6. 操作 HDFS 的基本命令
1) 打印文件列表(ls)
标准写法:
hadoop fs -ls hdfs: hdfs: 明确说明是 HDFS 系统路径
简写:
hadoop fs -ls 默认是 HDFS 系统下的根目录
打印指定子目录:
hadoop fs -ls packagetest HDFS 系统下某个目录
2) 上传文件、目录(put、copyFromLocal)
put 用法:
上传新文件:
hdfs fs -put file:roottest.txt hdfs: 上传本地test.txt文件到HDFS根目录, HDFS
根目录须无同名文件,否则“File exists”
hdfs fs -put test.txt test2.txt 上传并重命名文件。
hdfs fs -put test1.txt test2.txt hdfs: 一次上传多个文件到 HDFS 路径。
上传文件夹:
hdfs fs -put mypkg newpkg 上传并重命名了文件夹。
覆盖上传:
hdfs fs -put -f roottest.txt 如果 HDFS 目录中有同名文件会被覆盖
copyFromLocal用法:
上传文件并重命名:
hadoop fs -copyFromLocal file:test.txt hdfs:test2.txt
覆盖上传:
hadoop fs -copyFromLocal -f test.txt test.txt
3) 下载文件、目录(get、copyToLocal)
get 用法:
拷贝文件到本地目录:
hadoop fs -get hdfs:test.txt file:root
拷贝文件并重命名,可以简写:
hadoop fs -get test.txt roottest.txt copyToLocal用法
拷贝文件到本地目录:
hadoop fs -copyToLocal hdfs:test.txt file:root
拷贝文件并重命名,可以简写:
hadoop fs -copyToLocal test.txt roottest.txt
4) 拷贝文件、目录(cp)
从本地到 HDFS,同 put
hadoop fs -cp file:test.txt hdfs:test2.txt
从 HDFS 到 HDFS
hadoop fs -cp hdfs:test.txt hdfs:test2.txt
hadoop fs -cp test.txt test2.txt
5) 移动文件(mv)
hadoop fs -mv hdfs:test.txt hdfs:dirtest.txt
hadoop fs -mv test.txt dirtest.txt
6) 删除文件、目录(rm)
删除指定文件
hadoop fs -rm a.txt
删除全部 txt 文件
hadoop fs -rm .txt
递归删除全部文件和目录
hadoop fs -rm -R dir
7) 读取文件(cat、tail)
hadoop fs -cat test.txt 以字节码的形式读取
hadoop fs -tail test.txt
8) 创建空文件(touchz)
hadoop fs - touchz newfile.txt
9) 创建文件夹(mkdir)
hadoop fs -mkdir newdir newdir2 可以同时创建多个
hadoop fs -mkdir -p newpkgnewpkg2newpkg3 同时创建父级目录
10) 获取逻辑空间文件、目录大小(du)
hadoop fs - du 显示 HDFS 根目录中各文件和文件夹大小
hadoop fs -du -h 以最大单位显示 HDFS 根目录中各文件和文件夹大小 hadoop fs -du -s 仅显示 HDFS 根目录大小。即各文件和文件夹大小之和
第五章 Mapreduce计算框架
如果将Hadoop 比做一头大象,那么MapReduce就是那头大象的电脑。 MapReduce
是 Hadoop 核心编程模型。在 Hadoop 中,数据处理核心就是 MapReduce 程序设计模
型。
本章内容:
1) MapReduce 编程模型
2) MapReduce 执行流程
3) MapReduce 数据本地化
4) MapReduce 工作原理
5) MapReduce 错误处理机制
1. MapReduce 编程模型
Map和Reduce 的概念是从函数式变成语言中借来的,整个MapReduce计算过程分
为Map阶段和 Reduce阶段,也称为映射和缩减阶段,这两个独立的阶段实际上是两个独
立的过程,即 Map 过程和 Reduce 过程,在 Map 中进行数据的读取和预处理,之后将预
处理的结果发送到Reduce 中进行合并。
我们通过一个代码案例,让大家快速熟悉如何通过代码,快速实现一个我们自己的
MapReduce。
案例:分布式计算出一篇文章中的各个单词出现的次数,也就是WordCount。
1) 创建map.py 文件,写入以下代码:
!usrbinenv python
import sys word_list = []
for line in sys.stdin:
word_list = line.strip.split(' ')
if len(word_list) <= 0:
continue
for word in word_list:
w = word.strip
if len(w) <= 0:
continue
print '\t'.join([w, 1])
该代码主要工作是从文章数据源逐行读取,文章中的单词之间以空格分割,word_list = line.strip.split(' ')这块代码是将当前读取的一整行数据按照空格分割,将分割后的结果存入 word_list 数组中,然后通过 for word in word_list 遍历数组,取出
每个单词,后面追加“1”标识当前word出现1 次。
2) 创建reduce.py,写入以下代码:
!usrbinenv python
import sys
cur_word = None
sum_of_word = 0
for line in sys.stdin:
ss = line.strip.split('\t')
if len(ss) != 2:
continue
word = ss[0].strip
count = ss[1].strip
if cur_word == None:
cur_word = word
if cur_word != word:
print '\t'.join([cur_word, str(sum_of_word)])
sum_of_word = 0
cur_word = word
sum_of_word += int(count)
print '\t'.join([cur_word, str(sum_of_word)])
sum_of_word = 0
该代码针对 map 阶段的数组进行汇总处理,map 到 reduce 过程中默认存在 shuffle
partition分组机制,保证同一个word的记录,会连续传输到reduce中,所以在 reduce
阶段只需要对连续相同的word后面的技术进行累加求和即可。
3) 本地模拟测试脚本:
] cat big.txt | python map.py | sort -k1 | python reduce.py
cat 1
run 3
see 2
spot 2
the 1
6) 脚本执行流程:
see spot run
run spot run
see the cat
see spot run
see the cat
run spot run
see,1
spot,1
run,1
run,1
spot,1
run,1
see,1
the,1
cat,1
see,1
see,1
spot,1
spot,1
run,1
run,1
run,1
the,1
cat,1
see,1
spot,1
run,1
the,1
cat,1
cat 1
run 3
see 2
spot 2
the 1
输入 拆分 映射 派发 缩减 输出
2. MapReduce 执行流程
上面的例子属于 MapReduce 计算框架的一般流程,经过整理总结:
1) 输入和拆分:
不属于map和reduce 的主要过程,但属于整个计算框架消耗时间的一部分,该部分
会为正式的map准备数据。
分片(split)操作:
split 只是将源文件的内容分片形成一系列的 InputSplit,每个InputSpilt中存储着对
应分片的数据信息(例如,文件块信息、起始位置、数据长度、所在节点列表…),并不是
将源文件分割成多个小文件,每个InputSplit 都由一个mapper进行后续处理。
每个分片大小参数是很重要的,splitSize 是组成分片规则很重要的一个参数,该参数
由三个值来确定:
· minSize:splitSize 的最小值,由mapred-site.xml配置文件中
mapred.min.split.size 参数确定。
· maxSize:splitSize的最大值,由mapred-site.xml配置文件中
mapreduce.jobtracker.split.metainfo.maxsize 参数确定。
· blockSize:HDFS 中文件存储的快大小,由 hdfs-site.xml配置文件中
dfs.block.size 参数确定。
splitSize的确定规则:splitSize=max{minSize,min{maxSize,blockSize}}
数据格式化(Format)操作: 将划分好的InputSplit格式化成键值对形式的数据。其中key 为偏移量,value是每
一行的内容。
值得注意的是,在 map任务执行过程中,会不停的执行数据格式化操作,每生成一
个键值对就会将其传入 map,进行处理。所以 map和数据格式化操作并不存在前后时间
差,而是同时进行的。
Input Data
Stored on
HDFS
Input Split
Input Split
Input Split
Record
Reader
Record
Reader
Record
Reader
Key, Value
Key, Value
Key, Value
Key, Value
Key, Value
Key, Value
Map
Task
Map
Task
Map
Task
2) Map映射:
是 Hadoop并行性质发挥的地方。根据用户指定的map过程,MapReduce尝试在
数据所在机器上执行该 map程序。在HDFS 中,文件数据是被复制多份的,所以计算将
会选择拥有此数据的最空闲的节点。
在这一部分,map 内部具体实现过程,可以由用户自定义。
3) Shuffle派发:
Shuffle 过程是指 Mapper 产生的直接输出结果,经过一系列的处理,成为最终的
Reducer直接输入数据为止的整个过程。这是 mapreduce的核心过程。该过程可以分为两
个阶段:
Mapper 端的 Shuffle:由 Mapper 产生的结果并不会直接写入到磁盘中,而是先存
储在内存中,当内存中的数据量达到设定的阀值时,一次性写入到本地磁盘中。并同时进行
sort(排序)、combine(合并)、partition(分片)等操作。其中,sort 是把Mapper产
生的结果按照key值进行排序;combine是把 key值相同的记录进行合并;partition是把数据均衡的分配给Reducer。
Reducer端的 Shuffle:由于Mapper 和 Reducer往往不在同一个节点上运行,所以
Reducer 需要从多个节点上下载 Mapper 的结果数据,并对这些数据进行处理,然后才能
被Reducer 处理。
4) Reduce缩减:
Reducer接收形式的数据流,形成形式的输出,具体的过程可以由用户自定义,最终结
果直接写入hdfs。每个reduce 进程会对应一个输出文件,名称以part-开头。
3. MapReduce 数据本地化(Data-Local)
首先,HDFS 和 MapReduce 是 Hadoop 的核心设计。对于 HDFS,是存储基础,在
数据层面上提供了海量数据存储的支持。而 MapReduce,是在数据的上一层,通过编写
MapReduce 程序对海量数据进行计算处理。
在前面 HDFS 章节中,知道了 NameNode 是文件系统的名字节点进程,DataNode
是文件系统的数据节点进程。
MapReduce 计算框架中负责计算任务调度的 JobTracker 对应 HDFS 的 NameNode
的角色,只不过一个负责计算任务调度,一个负责存储任务调度。
MapReduce计算框架中负责真正计算任务的TaskTracker对应到HDFS的DataNode
的角色,一个负责计算,一个负责管理存储数据。
考虑到“本地化原则”,一般地,将 NameNode和JobTracker部署到同一台机器上,各个DataNode 和 TaskNode 也同样部署到同一台机器上。
这样做的目的是将 map 任务分配给含有该 map 处理的数据块的 TaskTracker 上,同
时将程序JAR包复制到该TaskTracker 上来运行,这叫“运算移动,数据不移动”。而分配
reduce 任务时并不考虑数据本地化。
4. MapReduce 工作原理
我们通过Client、JobTrask 和TaskTracker的角度来分析MapReduce的工作原理:
首先在客户端(Client)启动一个作业(Job) ,向JobTracker 请求一个 Job ID。将运
行作业所需要的资源文件复制到 HDFS上,包括MapReduce程序打包的 JAR文件、配置
文件和客户端计算所得的输入划分信息。这些文件都存放在JobTracker 专门为该作业创建
的文件夹中,文件夹名为该作业的 Job ID。JAR 文件默认会有 10 个副本
(mapred.submit.replication属性控制);输入划分信息告诉了JobTracker应该为这个作业启动多少个map 任务等信息。
JobTracker 接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度
当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一
个 map 任务,并将 map 任务分配给 TaskTracker 执行。对于 map 和 reduce 任务,TaskTracker 根据主机核的数量和内存的大小有固定数量的 map 槽和 reduce 槽。这里需
要强调的是:map 任务不是随随便便地分配给某个 TaskTracker 的,这里就涉及到上面提
到的数据本地化(Data-Local) 。
TaskTracker 每隔一段时间会给 JobTracker 发送一个心跳,告诉JobTracker它依然在
运行,同时心跳中还携带着很多的信息,比如当前 map 任务完成的进度等信息。当
JobTracker 收到作业的最后一个任务完成信息时,便把该作业设置成“成功”。当 JobClient
查询状态时,它将得知任务已完成,便显示一条消息给用户。
如果具体从map端和reduce 端分析,可以参考上面的图片,具体如下:
Map端流程:
1) 每个输入分片会让一个 map 任务来处理,map 输出的结果会暂且放在一个环形
内存缓冲区中(该缓冲区的大小默认为100M,由 io.sort.mb属性控制),当该缓
冲区快要溢出时(默认为缓冲区大小的 80%,由io.sort.spill.percent属性控制),会在本地文件系统中创建一个溢出文件,将该缓冲区中的数据写入这个文件。 2) 在写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,也就是一个 reduce 任务对应一个分区的数据。这样做是为了避免有些 reduce 任
务分配到大量数据,而有些 reduce任务却分到很少数据,甚至没有分到数据的尴
尬局面。其实分区就是对数据进行 hash 的过程。然后对每个分区中的数据进行排
序,如果此时设置了 Combiner,将排序后的结果进行 Combine 操作,这样做的
目的是让尽可能少的数据写入到磁盘。
3) 当map任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文
件合并。合并的过程中会不断地进行排序和Combine 操作,目的有两个:
· 尽量减少每次写入磁盘的数据量;
· 尽量减少下一复制阶段网络传输的数据量。
最后合并成了一个已分区且已排序的文件。为了减少网络传输的数据量,这里可以
将数据压缩,只要将 mapred.compress.map.out设置为true就可以了。
4) 将分区中的数据拷贝给相对应的 reduce 任务。分区中的数据怎么知道它对应的
reduce 是哪个呢?其实 map 任务一直和其父 TaskTracker 保持联系,而
TaskTracker 又一直和JobTracker 保持心跳。所以 JobTracker中保存了整个集群
中的宏观信息。只要reduce 任务向JobTracker 获取对应的map输出位置就可以
了。
Reduce端流程:
1) Reduce 会接收到不同 map 任务传来的数据,并且每个 map 传来的数据都是有
序的。如果 reduce 端接受的数据量相当小,则直接存储在内存中(缓冲区大小由
mapred.job.shuffle.input.buffer.percent 属性控制,表示用作此用途的堆空间的
百 分 比 ), 如 果 数 据 量 超 过 了 该 缓 冲 区 大 小 的 一 定 比 例 ( 由mapred.job.shuffle.merge.percent 决定),则对数据合并后溢写到磁盘中。
2) 随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是
为了给后面的合并节省时间。其实不管在 map 端还是 reduce 端,MapReduce
都是反复地执行排序,合并操作,所以排序是hadoop的灵魂。
3) 合并的过程中会产生许多的中间文件(写入磁盘了),但 MapReduce 会让写入磁
盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到
reduce 函数。
在 Map处理数据后,到 Reduce得到数据之前,这个流程在MapReduce 中可以看做
是一个Shuffle 的过程。
在经过 mapper 的运行后,我们得知 mapper 的输出是这样一个 keyvalue 对。到底
当前的 key 应该交由哪个 reduce 去做呢,是需要现在决定的。 MapReduce 提供
Partitioner 接口,它的作用就是根据 key 或 value 及 reduce 的数量来决定当前的这对输
出数据最终应该交由哪个 reduce task 处理。默认对 key 做 hash 后再以 reduce task 数
量取模。默认的取模方式只是为了平均 reduce 的处理能力,如果用户自己对 Partitioner
有需求,可以订制并设置到 job上。
5. MapReduce 错误处理机制
MapReduce 任务执行过程中出现的故障可以分为两大类: 硬件故障和任务执行失败引
发的故障。
1) 硬件故障
在 Hadoop Cluster中,只有一个JobTracker,因此,JobTracker本身是存在单点故
障的。如何解决JobTracker的单点问题呢?我们可以采用主备部署方式,启动 JobTracker主节点的同时,启动一个或多个 JobTracker备用节点。当JobTracker 主节点出现问题时,通过某种选举算法,从备用的 JobTracker 节点中重新选出一个主节点。
机器故障除了 JobTracker 错误就是 TaskTracker 错误。TaskTracker 故障相对较为常
见,MapReduce 通常是通过重新执行任务来解决该故障。
在 Hadoop集群中,正常情况下,TaskTracker 会不断的与JobTracker通过心跳机制
进行通信。如果某 TaskTracker 出现故障或者运行缓慢,它会停止或者很少向 JobTracker
发送心跳。如果一个 TaskTracker 在一定时间内(默认是1 分钟)没有与 JobTracker通信,那么 JobTracker 会将此 TaskTracker 从等待任务调度的 TaskTracker 集合中移除。同时
JobTracker 会要求此 TaskTracker 上的任务立刻返回。如果此 TaskTracker 任务仍然在
mapping阶段的Map 任务,那么JobTracker会要求其他的TaskTracker重新执行所有原
本由故障TaskTracker执行的Map任务。如果任务是在 Reduce 阶段的 Reduce 任务,那
么JobTracker会要求其他TaskTracker重新执行故障TaskTracker未完成的Reduce任务。
比如:一个 TaskTracker 已经完成被分配的三个 Reduce 任务中的两个,因为 Reduce 任务
一旦完成就会将数据写到 HDFS 上,所以只有第三个未完成的 Reduce 需要重新执行。但
是对于Map任务来说,即使 TaskTracker 完成了部分 Map,Reduce 仍可能无法获取此节
点上所有Map的所有输出。所以无论Map任务完成与否,故障 TaskTracker上的Map任
务都必须重新执行。
2) 任务执行失败引发的故障
在实际任务中, MapReduce 作业还会遇到用户代码缺陷或进程崩溃引起的任务失败等
情况。用户代码缺陷会导致它在执行过程中抛出异常。此时,任务 JVM 进程会自动退出,并
向TaskTracker 父进程发送错误消息,同时错误消息也会写入 log文件,最后 TaskTracker
将此次任务尝试标记失败。对于进程崩溃引起的任务失败,TaskTracker 的监听程序会发现进程退出,此时TaskTracker 也会将此次任务尝试标记为失败。对于死循环程序或执行时间
太长的程序,由于 TaskTracker 没有接收到进度更新,它也会将此次任务尝试标记为失败,并杀死程序对应的进程。
在以上情况中,TaskTracker将任务尝试标记为失败之后会将TaskTracker自身的任务
计数器减 1,以便想 JobTracker 申请新的任务。TaskTracker 也会通过心跳机制告诉
JobTracker 本地的一个任务尝试失败。JobTracker接到任务失败的通知后,通过重置任务
状态,将其加入到调度队列来重新分配该任务执行(JobTracker 会尝试避免将失败的任务
再次分配给运行失败的 TaskTracker)。如果此任务尝试了 4 次(次数可以进行设置)仍没
有完成,就不会再被重试,此时整个作业也就失败了。
第六章 Zookeeper
Zookeeper 是一种分布式的,开源的,应用于分布式应用的协作服务。它提供了一些
简单的操作,使得分布式应用可以基于这些接口实现诸如同步、配置维护和分集群或者命名
的服务。Zookeeper 很容易编程接入,它使用了一个和文件树结构相似的数据模型。可以
使用Java 或者C 来进行编程接入。
众所周知,分布式的系统协作服务很难有让人满意的产品。这些协作服务产品很容易陷
入一些诸如竞争选择条件或者死锁的陷阱中。Zookeeper 的目的就是将分布式服务不再需
要由于协作冲突而另外实现协作服务。
本章内容:
1) Zookeeper 数据模型
2) Zookeeper 访问控制
3) Zookeeper 应用场景 1. Zookeeper 数据模型
ZooKeeper拥有一个层次的命名空间,这个和标准的文件系统非常相似
从图中我们可以看出 ZooKeeper 的数据模型,在结构上和标准文件系统的非常相似,都是采用这种树形层次结构,ZooKeeper树中的每个节点被称为—Znode。和文件系统的
目录树一样,ZooKeeper树中的每个节点可以拥有子节点。但也有不同之处:
1) 引用方式:
Zonde 通过路径引用,如同 Unix 中的文件路径。路径必须是绝对的,因此他们必须由
斜杠字符来开头。除此以外,他们必须是唯一的,也就是说每一个路径只有一个表示,因此
这些路径不能改变。在 ZooKeeper 中,路径由 Unicode 字符串组成,并且有一些限制。
字符串zookeeper用以保存管理信息,比如关键配额信息。
2) Znode 结构
ZooKeeper命名空间中的 Znode,兼具文件和目录两种特点。既像文件一样维护着数
据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。图中的
每个节点称为一个Znode。 每个Znode 由3 部分组成:
· stat:此为状态信息, 描述该Znode的版本, 权限等信息
· data:与该Znode 关联的数据
· children:该Znode 下的子节点 ZooKeeper虽然可以关联一些数据,但并没有被设计为常规的数据库或者大数据存储,相反的是,它用来管理调度数据,比如分布式应用中的配置文件信息、状态信息、汇集位置
等等。这些数据的共同特性就是它们都是很小的数据,通常以 KB为大小单位。ZooKeeper
的服务器和客户端都被设计为严格检查并限制每个 Znode 的数据大小至多 1M,但常规使
用中应该远小于此值。
3) 数据访问
ZooKeeper 中的每个节点存储的数据要被原子性的操作。也就是说读操作将获取与节
点相关的所有数据,写操作也将替换掉节点的所有数据。另外,每一个节点都拥有自己的
ACL(访问控制列表),这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行
的操作。
4) 节点类型
Persistent Nodes:永久有效地节点,除非 client 显式的删除,否则一直存在。
Ephemeral Nodes:临时节点,仅在创建该节点 client 保持连接期间有效,一旦连接丢
失,zookeeper会自动删除该节点。
Sequence Nodes:顺序节点,client 申请创建该节点时, ZooKeeper 会自动在节点路
径末尾添加递增序号,这种类型是实现分布式锁,分布式queue 等特殊功能的关键。
5) 监控
客户端可以在节点上设置 watch,我们称之为监视器。当节点状态发生改变时(Znode
的增、删、改)将会触发 watch 所对应的操作。当 watch 被触发时,ZooKeeper 将会向客
户端发送且仅发送一条通知,因为 watch只能被触发一次,这样可以减少网络流量。
ZooKeeper可以为所有的读操作设置watch,这些读操作包括: exists、 getChildren
及getData。watch 事件是一次性的触发器,当 watch的对象状态发生改变时,将会触发此对象上watch所对应的事件。 watch事件将被异步地发送给客户端,并且ZooKeeper为
watch 机制提供了有序的一致性保证。理论上,客户端接收 watch 事件的时间要快于其看
到watch对象状态变化的时间。
2. Zookeeper 访问控制
传统的文件系统中,ACL分为两个维度,一个是属组,一个是权限,子目录文件默认
继承父目录的 ACL。而在 Zookeeper 中,node 的 ACL 是没有继承关系的,是独立控制
的。Zookeeper 的 ACL,可以从三个维度来理解:一是 scheme; 二是 user; 三是
permission,通常表示为scheme:id:permissions, 下面从这三个方面分别来介绍:
1) scheme: scheme 对应于采用哪种方案来进行权限管理,zookeeper 实现了一个
pluggable的ACL方案,可以通过扩展scheme,来扩展ACL 的机制。
模式 描述
World 它下面只有一个 id, 叫anyone, world:anyone代表任何人, zookeeper 中对
所有人有权限的结点就是属于 world:anyone 的
Auth 已经被认证的用户
Digest 通过username:password字符串的MD5 编码认证用户
Host 匹 配 主 机 名 后 缀 , 如 , host:corp.com 匹配 host:host1.corp.com,host:host2.corp.com,但不能匹配 host:host1.store.com
IP 通过IP 识别用户,表达式格式为 addrbits
2) User:与 scheme 是紧密相关的,具体的情况在上面介绍 scheme 的过程都已介
绍,这里不再赘述。
3) permission: zookeeper目前支持下面一些权限: 权限 描述 备注
Create 有创建子节点的权限
Read 有读取节点数据和子节点列表的权限
Write 有修改节点数据的权限 无创建和删除子节点的权限
Delete 有删除子节点的权限
Admin 有设置节点权限的权限
3. Zookeeper 应用场景
1) 数据发布与订阅(配置中心)
发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZK 节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服
务式服务框架的服务地址列表等就非常适合使用。
2) 分布式锁服务
分布式锁,这个主要得益于 ZooKeeper 为我们保证了数据的强一致性。锁服务可以分
为两类,一个是保持独占,另一个是控制时序。
3) 分布式队列
队列方面,简单地讲有两种,一种是常规的先进先出队列,另一种是要等到队列成员聚
齐之后的才统一按序执行。对于第一种先进先出队列,和分布式锁服务中的控制时序场景基本原理一致,这里不再赘述。 第二种队列其实是在FIFO队列的基础上作了一个增强。通常
可以在 queue 这个 znode 下预先建立一个queuenum 节点,并且赋值为 n(或者直
接给queue 赋值n),表示队列大小,之后每次有队列成员加入后,就判断下是否已经到达
队列大小,决定是否可以开始执行了。这种用法的典型场景是,分布式环境中,一个大任务
Task A,需要在很多子任务完成(或条件就绪)情况下才能进行。这个时候,凡是其中一个
子任务完成(就绪),那么就去 taskList 下建立自己的临时时序节点
(CreateMode.EPHEMERAL_SEQUENTIAL),当 taskList 发现自己下面的子节点满足
指定个数,就可以进行下一步按序进行处理了。
第七章 HBase
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存
储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
本章内容:
1) Hbase简介
2) Hbase数据模型
3) Hbase基础原理
4) Hbase系统架构
5) Hbase基础操作
1. Hbase简介
HBase 是 Apache Hadoop 中的一个子项目,Hbase 依托于 Hadoop 的 HDFS 作为
最基本存储基础单元,通过使用 hadoop的 DFS 工具就可以看到这些这些数据存储文件夹的结构,还可以通过MapReduce 的框架(算法)对HBase 进行操作。
上图描述了 Hadoop EcoSystem 中的各层系统,其中 HBase 位于结构化存储层,Hadoop HDFS 为 HBase 提供了高可靠性的底层存储支持,Hadoop MapReduce 为
HBase提供了高性能的计算能力, Zookeeper为HBase提供了稳定服务和failover机制。
Hbase适用场景:
1) 大数据量存储,大数据量高并发操作
2) 需要对数据随机读写操作
3) 读写访问均是非常简单的操作
Hbase与 HDFS对比:
· 两者都具有良好的容错性和扩展性,都可以扩展到成百上千个节点;
· HDFS适合批处理场景,但不支持数据随机查找,不适合增量数据处理,不支持数据更新
2. Hbase数据模型
HBase 以表的形式存储数据。表由行和列族组成。列划分为若干个列族(row family),其逻辑视图如下:
行健 时间戳 列族contents 列族anchor 列族 mime
“com.cnn.www” T9 Anchor:cnnsi.com=“CNN”
T8 Anchor:my.look.ca=“CNN.com”
T6 Contents:html=“……” Mime.type=“texthtml”
T5 Contents:html=“……”
T3 Contents:html=“……”
几个关键概念:
1) 行键(RowKey)
· 行键是字节数组, 任何字符串都可以作为行键;
· 表中的行根据行键进行排序,数据按照 Row key 的字节序(byte order)排序
存储;
· 所有对表的访问都要通过行键 (单个 RowKey 访问,或RowKey范围访问,或全表扫描)
2) 列族(ColumnFamily)
· CF必须在表定义时给出
· 每个 CF 可以有一个或多个列成员(ColumnQualifier),列成员不需要在表定
义时给出,新的列族成员可以随后按需、动态加入
· 数据按 CF 分开存储, HBase 所谓的列式存储就是根据CF 分开存储(每个CF
对应一个Store),这种设计非常适合于数据分析的情形
3) 时间戳(TimeStamp) ? 每个Cell可能又多个版本,它们之间用时间戳区分
4) 单元格(Cell)
· Cell 由行键,列族:限定符,时间戳唯一决定
· Cell中的数据是没有类型的,全部以字节码形式存储
5) 区域(Region)
· HBase自动把表水平(按Row)划分成多个区域(region),每个region会保
存一个表里面某段连续的数据;
· 每个表一开始只有一个region,随着数据不断插入表,region不断增大,当
增大到一个阀值的时候,region就会等分会两个新的region;
· 当 table 中的行不断增多,就会有越来越多的 region。这样一张完整的表被
保存在多个 Region 上。
· Region 虽然是分布式存储的最小单元,但并不是存储的最小单元。 Region由
一个或者多个Store组成,每个store保存一个columns family;每个Strore
又由一个 memStore 和 0 至多个 StoreFile 组成,StoreFile 包含 HFile;
memStore 存储在内存中,StoreFile存储在HDFS上。
3. Hbase架构及基本组件
从上图看到HBase 的基本组件:
1) Client:
· 包含访问 HBase的接口,并维护 cache来加快对HBase 的访问,比如region
的位置信息。
2) Master
· 为Region server分配region
· 负责Region server 的负载均衡
· 发现失效的 Region server 并重新分配其上的region
· 管理用户对 table 的增删改查操作 3) Region Server
· Regionserver维护region,处理对这些region的IO请求
· Regionserver负责切分在运行过程中变得过大的region
4) Zookeeper 作用
· 通过选举,保证任何时候,集群中只有一个Master, Master与RegionServers
启动时会向 ZooKeeper注册
· 存储所有 Region的寻址入口
· 实时监控 Region server的上线和下线信息,并实时通知给Master
· 存储HBase的 schema和 table 元数据
· 默认情况下,HBase 管理 ZooKeeper 实例,比如, 启动或者停止
ZooKeeper
· Zookeeper 的引入使得Master不再是单点故障 4. Hbase容错与恢复
每个HRegionServer 中都有一个HLog对象, HLog是一个实现Write Ahead Log的
类,在每次用户操作写入 MemStore 的同时,也会写一份数据到 HLog 文件中(HLog 文
件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到 StoreFile中
的数据)。当HRegionServer 意外终止后,HMaster 会通过Zookeeper 感知到,HMaster
首先会处理遗留的 HLog 文件,将其中不同 Region 的 Log 数据进行拆分,分别放到相应
region的目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer
在 Load Region 的过程中,会发现有历史 HLog 需要处理,因此会 Replay HLog 中的数
据到MemStore中,然后 flush 到StoreFiles,完成数据恢复
Hbase容错性:
1) Master 容错:Zookeeper 重新选择一个新的 Master
· 无Master过程中,数据读取仍照常进行;
· 无master 过程中,region切分、负载均衡等无法进行;
2) RegionServer容错:定时向Zookeeper汇报心跳,如果一旦时间内未出现心跳,Master 将该 RegionServer 上的 Region 重新分配到其他 RegionServer 上,失效服务器上“预写”日志由主服务器进行分割并派送给新的 RegionServer
3) Zookeeper 容错: Zookeeper是一个可靠地服务,一般配置3或5 个Zookeeper
实例
Region定位流程:
寻找 RegionServer 过程:ZooKeeper--> -ROOT-(单 Region)--> .META.--> 用户
表
1) -ROOT-
· 表包含.META.表所在的region 列表,该表只会有一个Region;
· Zookeeper 中记录了-ROOT-表的 location。
2) .META.
· 表包含所有的用户空间region列表,以及 RegionServer 的服务器地址。
5. Hbase基础操作
1) 进入hbase shell console
HBASE_HOMEbinhbase shell
表的管理:
2) 查看有哪些表 list
3) 创建表
语法:create, {NAME =>
猿课教育
Hadoop 大数据入门与实践
Hadoop 入门与实践
目录
Hadoop 入门与实践 ..................................................................................................................... 1
第一章 前言 ....................................................................................................................... 3
第二章 hadoop简介 ............................................................................................................. 3
1. Hadoop版本衍化历史 .............................................................................................. 3
2. Hadoop生态圈 .......................................................................................................... 4
第三章 安装hadoop 环境 .................................................................................................... 6
第四章 HDFS 文件系统 ..................................................................................................... 13
1. HDFS特点: ............................................................................................................ 13
2. 不适用于 HDFS的场景: ....................................................................................... 14
3. HDFS体系架构 ........................................................................................................ 15
4. HDFS数据块复制 .................................................................................................... 16
5. HDFS读取和写入流程 ............................................................................................ 17
6. 操作HDFS的基本命令 ........................................................................................... 19
第五章 Mapreduce计算框架 .......................................................................................... 21
1. MapReduce 编程模型 ............................................................................................. 21
2. MapReduce 执行流程 ............................................................................................. 23
3. MapReduce 数据本地化(Data-Local) ................................................................ 26
4. MapReduce 工作原理 ............................................................................................. 27
5. MapReduce 错误处理机制 ..................................................................................... 30
第六章 Zookeeper .............................................................................................................. 32
1. Zookeeper 数据模型 ............................................................................................... 33
2. Zookeeper 访问控制 ............................................................................................... 35
3. Zookeeper 应用场景 ............................................................................................... 36
第七章 HBase ....................................................................................................................... 37
1. Hbase 简介 ............................................................................................................... 37 2. Hbase 数据模型 ....................................................................................................... 39
3. Hbase 架构及基本组件 ........................................................................................... 41
4. Hbase 容错与恢复 ................................................................................................... 43
5. Hbase 基础操作 ....................................................................................................... 44
第八章 Hive .......................................................................................................................... 48
1. Hive 基础原理 .......................................................................................................... 48
2. Hive 基础操作 .......................................................................................................... 52
第九章 流式计算解决方案-Storm ...................................................................................... 59
1. Storm 特点 ............................................................................................................... 60
2. Storm 与 Hadoop 区别 ............................................................................................ 61
3. Storm 基本概念 ....................................................................................................... 63
4. Storm 系统架构 ....................................................................................................... 69
5. Storm 容错机制 ....................................................................................................... 71
6. 一个简单的 Storm实现 .......................................................................................... 72
7. Storm 常用配置 ....................................................................................................... 73
第十章 数据挖掘——推荐系统 .......................................................................................... 74
1. 数据挖掘和机器学习概念 ...................................................................................... 75
2. 一个机器学习应用方向——推荐领域 ................................................................... 75
3. 推荐算法——基于内容的推荐方法 ....................................................................... 76
4. 推荐算法——基于协同过滤的推荐方法 ............................................................... 80
第一章 前言
出此书的目的就是为了帮助新人快速加入大数据行业, 市面上有很多类似的书籍都是重
理论少实践,特别缺少一线企业实践经验的传授,而这个课程会让您少走弯路、快速入门和
实践,让您再最短时间内达到一个一线企业大数据工程师的能力标准,因为在课程整理和实
践安排上过滤掉很多用不上的知识,直接带领大家以最直接的方式掌握大数据使用方法。
作者在知名一线互联网公司从事大数据开发与管理多年,深知业界大数据公司一直对大
数据人才的渴望,同时也知道有很多的大数据爱好者想参与进这个朝阳行业,因为作者平时
也是需要参与大数据工程师的招聘与培养的,所以特别想通过一种方式,让广大的大数据爱
好者更好的与企业对接,让优秀的人才找到合适的企业,《Hadoop入门与实践》电子书是作
者根据多年从业经验整理的系列课程,希望让更多的大数据爱好者收益!
第二章 hadoop 简介
Hadoop 是一个由 Apache 基金会所开发的开源分布式系统基础架构。用户可以在不了
解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。
解决了大数据(大到一台计算机无法进行存储,一台计算机无法在要求的时间内进行处理)
的可靠存储和处理。适合处理非结构化数据,包括HDFS,MapReduce基本组件。
1. Hadoop版本衍化历史
由于Hadoop版本混乱多变对初级用户造成一定困扰,所以对其版本衍化历史有个大概
了解,有助于在实践过程中选择合适的Hadoop版本。
Apache Hadoop版本分为分为 1.0和2.0两代版本,我们将第一代Hadoop 称为 Hadoop
1.0,第二代Hadoop 称为Hadoop 2.0。下图是 Apache Hadoop的版本衍化史:
第一代Hadoop包含三个大版本,分别是 0.20.x,0.21.x和0.22.x,其中,0.20.x 最后演
化成1.0.x,变成了稳定版。
第二代 Hadoop 包含两个版本,分别是 0.23.x 和 2.x,它们完全不同于 Hadoop 1.0,是
一套全新的架构,均包含 HDFS Federation 和 YARN 两个系统,相比于 0.23.x,2.x 增加了
NameNode HA和Wire-compatibility两个重大特性。
Hadoop 遵从 Apache 开源协议,用户可以免费地任意使用和修改 Hadoop,也正因此,市面上出现了很多Hadoop 版本,其中比较出名的一是Cloudera公司的发行版,该版本称为
CDH(Cloudera Distribution Hadoop)。
截至目前为止,CDH 共有4 个版本,其中,前两个已经不再更新,最近的两个,分别是
CDH3(在Apache Hadoop 0.20.2 版本基础上演化而来的)和 CDH4 在Apache Hadoop 2.0.0 版
本基础上演化而来的),分别对应Apache 的Hadoop 1.0和 Hadoop 2.0。
2. Hadoop生态圈
架构师和开发人员通常会使用一种软件工具,用于其特定的用途软件开发。例如,他们
可能会说,Tomcat是 Apache Web服务器,MySQL是一个数据库工具。
然而,当提到Hadoop 的时候,事情变得有点复杂。Hadoop包括大量的工具,用来协同
工作。因此,Hadoop 可用于完成许多事情,以至于,人们常常根据他们使用的方式来定义
它。
对于一些人来说, Hadoop是一个数据管理系统。他们认为Hadoop是数据分析的核心,汇集了结构化和非结构化的数据,这些数据分布在传统的企业数据栈的每一层。对于其他人,Hadoop 是一个大规模并行处理框架,拥有超级计算能力,定位于推动企业级应用的执行。
还有一些人认为Hadoop作为一个开源社区,主要为解决大数据的问题提供工具和软件。因
为Hadoop可以用来解决很多问题,所以很多人认为 Hadoop是一个基本框架。
虽然 Hadoop 提供了这么多的功能,但是仍然应该把它归类为多个组件组成的 Hadoop
生态圈,这些组件包括数据存储、数据集成、数据处理和其它进行数据分析的专门工具。
该图主要列举了生态圈内部主要的一些组件,从底部开始进行介绍:
1) HDFS:Hadoop 生态圈的基本组成部分是 Hadoop 分布式文件系统(HDFS)。HDFS 是一
种数据分布式保存机制,数据被保存在计算机集群上。数据写入一次,读取多次。HDFS
为 HBase 等工具提供了基础。
2) MapReduce:Hadoop 的主要执行框架是 MapReduce,它是一个分布式、并行处理的编
程模型。MapReduce 把任务分为 map(映射)阶段和 reduce(化简)。开发人员使用存储在
HDFS 中数据(可实现快速存储),编写 Hadoop 的 MapReduce 任务。由于 MapReduce
工作原理的特性, Hadoop能以并行的方式访问数据,从而实现快速访问数据。
3) Hbase:HBase 是一个建立在HDFS之上,面向列的 NoSQL数据库,用于快速读写大量
数据。HBase 使用 Zookeeper进行管理,确保所有组件都正常运行。
4) ZooKeeper:用于Hadoop的分布式协调服务。Hadoop的许多组件依赖于 Zookeeper,它
运行在计算机集群上面,用于管理Hadoop操作。
5) Hive:Hive类似于 SQL高级语言,用于运行存储在Hadoop上的查询语句,Hive 让不熟
悉 MapReduce 开发人员也能编写数据查询语句,然后这些语句被翻译为 Hadoop 上面
的 MapReduce 任务。像 Pig 一样,Hive 作为一个抽象层工具,吸引了很多熟悉 SQL 而
不是Java编程的数据分析师。
6) Pig:它是 MapReduce 编程的复杂性的抽象。Pig 平台包括运行环境和用于分析 Hadoop
数据集的脚本语言(Pig Latin)。其编译器将 Pig Latin翻译成MapReduce程序序列。
7) Sqoop: 是一个连接工具,用于在关系数据库、数据仓库和Hadoop之间转移数据。 Sqoop
利用数据库技术描述架构,进行数据的导入导出;利用MapReduce 实现并行化运行和容错技术。
第三章 安装hadoop 环境
由于实践部分主要以 Hadoop 1.0 环境为主,所以这主要介绍如何搭建 Hadoop 1.0
分布式环境。
整个分布式环境运行在带有linux 操作系统的虚拟机上,至于虚拟机和 linux 系统的安
装这里暂不做过多介绍。
安装Hadoop分布式环境:
1) 下载Hadoop安装包:
在 http:pan.baidu.coms1qXSN3hM 地址中可以找到 hadoop-1.2.1-bin.tar.gz
文件
使用securtCRT的rz功能上传hadoop-1.2.1-bin.tar.gz这个文件到虚拟机的系统中。
同样在securtcrt 中ll时,能得到
2) 安装Hadoop安装包:
· 首先将安装包解压缩:
· Linux 终端执行cd进入相应目录:
· 新增tmp 目录,mkdir homehadoophadoop-1.2.1tmp
3) 配置Hadoop:
· 使用vim修改 master文件内容:
将 localhost 修改成 master:
最后保存退出。
· 修改slaves 文件
注意,这里准备设置几台 slave 机器,就写几个,因为当前分布式环境有四个虚拟机,一台做master,三台做 slave,所以这里写成了三个 slave
· 修改core-site.xml文件:
【注意】中间的 ip地址,不要输入192.168.2.55,根据自己的情况设置。
· 修改mapred-site.xml文件:
【注意】记得value 的内容要以http开头。 ? 修改hdfs-site.xml文件:
其中,
只有1 台或2 台,修改成对应的值即可。
· 修改hadoo-env.sh 文件
在
下新增export JAVA_HOME=homehadoopjdk1.6.0_45
· 修改本地网络配置:编辑etchosts 文件
【注意】Ip地址根据具体的情况要进行修改。
4) 复制虚拟机
· 关闭当前虚拟机,并复制多份
【注意】要选择初始化所有网卡的 mac 地址
根据自己需求,复制 2到3 台虚拟机作为 slave,同样要确认网络连接方式为桥接。
· 设置所有机器的 IP地址 分别启动虚拟机,修改机器的 ip 地址,在虚拟机的图形界面里,选择设置
单击打开,在弹出来的窗口里,选择
打开 ,修改成如下的形式,选择 ipv4 ,分配方式选择成manual。
【注意】具体的 ip地址,根据实际的情况来设置,因为培训教室里都是 192.168.2.x的
网段,所以我这里设置成了 192.168.2.x,每个人选择自己的一个 ip地址范围,注意不要和
其它人冲突了。
5) 建立互信关系
· 生成公私钥,在 master 机器的虚拟机命令行下输入 ssh-keygen,一路回车,全
默认
· 复制公钥
复制一份master的公钥文件,cat ~.sshid_rsa.pub >> ~.sshauthorized_keys
同样,在所有的 slave 机器上,也在命令行中输入ssh-keygen,一路回车,全默认
在所有的salve机器上,从master 机器上复制 master 的公钥文件:
· 测试连接
在 master 机器上分别向所有的 slave 机器发起联接请求:
如:ssh slave1
【注意】记得一旦联接上,所有的操作,就视同在对应的 slave 上操作,所以一定要记
得使用exit 退出联接。
6) 启动Hadoop:
· 初始化:在 master 机器上,进入homehadoophadoop-1.2.1bin 目录
在安装包根目录下运行.hadoop namenode –format来初始化hadoop的文件系统。
· 启动
执行.start-all.sh,如果中间过程提示要判断是否,需要输入yes
输入jps,查看进程是否都正常启动。
如果一切正常,应当有如上的一些进程存在。
7) 测试系统
输入.hadoop fs –ls
能正常显示文件系统。
如此,hadoop系统搭建完成。否则,可以去homehadoophadoop-1.2.1logs目
录下,查看缺少的进程中,对应的出错日志。
第四章 HDFS 文件系统
Hadoop 附带了一个名为 HDFS(Hadoop 分布式文件系统)的分布式文件系统,专门
存储超大数据文件,为整个Hadoop生态圈提供了基础的存储服务。
本章内容:
1) HDFS文件系统的特点,以及不适用的场景
2) HDFS文件系统重点知识点:体系架构和数据读写流程
3) 关于操作HDFS文件系统的一些基本用户命令
1. HDFS特点:
HDFS专为解决大数据存储问题而产生的,其具备了以下特点:
1) HDFS文件系统可存储超大文件
每个磁盘都有默认的数据块大小,这是磁盘在对数据进行读和写时要求的最小单位,文件系统是要构建于磁盘上的, 文件系统的也有块的逻辑概念,通常是磁盘块的整数倍,通常文件系统为几千个字节,而磁盘块一般为512个字节。
HDFS 是一种文件系统,自身也有块(block)的概念,其文件块要比普通单一磁
盘上文件系统大的多,默认是64MB。
HDFS上的块之所以设计的如此之大,其目的是为了最小化寻址开销。
HDFS文件的大小可以大于网络中任意一个磁盘的容量,文件的所有块并不需要存
储在一个磁盘上,因此可以利用集群上任意一个磁盘进行存储,由于具备这种分布式存
储的逻辑,所以可以存储超大的文件,通常 G、T、P 级别。
2) 一次写入,多次读取
一个文件经过创建、写入和关闭之后就不需要改变,这个假设简化了数据一致性的
问题,同时提高数据访问的吞吐量。
3) 运行在普通廉价的机器上
Hadoop 的设计对硬件要求低,无需昂贵的高可用性机器上,因为在 HDFS 设计
中充分考虑到了数据的可靠性、安全性和高可用性。
2. 不适用于 HDFS 的场景:
1) 低延迟
HDFS不适用于实时查询这种对延迟要求高的场景,例如:股票实盘。往往应对低
延迟数据访问场景需要通过数据库访问索引的方案来解决,Hadoop 生态圈中的
Hbase具有这种随机读、低延迟等特点。
2) 大量小文件
对于Hadoop系统, 小文件通常定义为远小于 HDFS 的 block size (默认 64MB)的文件,由于每个文件都会产生各自的MetaData元数据,Hadoop 通过Namenode
来存储这些信息,若小文件过多,容易导致Namenode 存储出现瓶颈。
3) 多用户更新
为了保证并发性,HDFS需要一次写入多次读取,目前不支持多用户写入,若要修
改,也是通过追加的方式添加到文件的末尾处, 出现太多文件需要更新的情况, Hadoop
是不支持的。
针对有多人写入数据的场景,可以考虑采用 Hbase的方案。
4) 结构化数据
HDFS适合存储半结构化和非结构化数据,若有严格的结构化数据存储场景,也可
以考虑采用Hbase 的方案。
5) 数据量并不大
通常 Hadoop 适用于 TB、PB 数据,若待处理的数据只有几十 GB 的话,不建议
使用Hadoop,因为没有任何好处。
3. HDFS体系架构
HDFS 是一个主从(MasterSlave)体系架构,由于分布式存储的性质,集群拥有两
类节点NameNode和DataNode。
NameNode(名字节点) :系统中通常只有一个,中心服务器的角色,管理存储和检索
多个DataNode 的实际数据所需的所有元数据。
DataNode(数据节点) :系统中通常有多个,是文件系统中真正存储数据的地方,在
NameNode 统一调度下进行数据块的创建、删除和复制。
图中的 Client 是 HDFS 的客户端,是应用程序可通过该模块与 NameNode 和
DataNode 进行交互,进行文件的读写操作。
4. HDFS数据块复制
为了系统容错,文件系统会对所有数据块进行副本复制多份,Hadoop 是默认 3 副本
管理。
复本管理策略是运行客户端的节点上放一个复本(若客户端运行在集群之外,会随机选
择一个节点) ,第二个复本会放在与第一个不同且随机另外选择的机架中节点上,第三个复
本与第二个复本放在相同机架,切随机选择另一个节点。所存在其他复本,则放在集群中随机选择的节点上,不过系统会尽量避免在相同机架上放太多复本。
所有有关块复制的决策统一由NameNode 负责, NameNode 会周期性地接受集群中
数据节点 DataNode 的心跳和块报告。一个心跳的到达表示这个数据节点是正常的。一个
块报告包括该数据节点上所有块的列表。
5. HDFS读取和写入流程
1) 读文件的过程:
首先Client 通过File System的Open函数打开文件,Distributed File System用
RPC 调用NameNode 节点,得到文件的数据块信息。对于每一个数据块,NameNode
节点返回保存数据块的数据节点的地址。Distributed File System返回
FSDataInputStream给客户端,用来读取数据。客户端调用stream的 read函数开始读
取数据。DFSInputStream连接保存此文件第一个数据块的最近的数据节点。DataNode
从数据节点读到客户端(client),当此数据块读取完毕时,DFSInputStream关闭和此数据
节点的连接,然后连接此文件下一个数据块的最近的数据节点。当客户端读取完毕数据的
时候,调用FSDataInputStream的close函数。 在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数
据块的下一个数据节点。失败的数据节点将被记录,以后不再连接。
2) 写文件的过程:
客户端调用create来创建文件,Distributed File System用RPC 调用NameNode
节点,在文件系统的命名空间中创建一个新的文件。NameNode 节点首先确定文件原来不
存在,并且客户端有创建文件的权限,然后创建新文件。
Distributed File System返回DFSOutputStream,客户端用于写数据。客户端开始写
入数据,DFSOutputStream 将数据分成块,写入 Data Queue。Data Queue 由 Data
Streamer 读取,并通知NameNode 节点分配数据节点,用来存储数据块(每块默认复制3
块)。分配的数据节点放在一个Pipeline里。Data Streamer 将数据块写入 Pipeline中的第
一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发
送给第三个数据节点。
DFSOutputStream为发出去的数据块保存了 Ack Queue,等待Pipeline中的数据节
点告知数据已经写入成功。 6. 操作 HDFS 的基本命令
1) 打印文件列表(ls)
标准写法:
hadoop fs -ls hdfs: hdfs: 明确说明是 HDFS 系统路径
简写:
hadoop fs -ls 默认是 HDFS 系统下的根目录
打印指定子目录:
hadoop fs -ls packagetest HDFS 系统下某个目录
2) 上传文件、目录(put、copyFromLocal)
put 用法:
上传新文件:
hdfs fs -put file:roottest.txt hdfs: 上传本地test.txt文件到HDFS根目录, HDFS
根目录须无同名文件,否则“File exists”
hdfs fs -put test.txt test2.txt 上传并重命名文件。
hdfs fs -put test1.txt test2.txt hdfs: 一次上传多个文件到 HDFS 路径。
上传文件夹:
hdfs fs -put mypkg newpkg 上传并重命名了文件夹。
覆盖上传:
hdfs fs -put -f roottest.txt 如果 HDFS 目录中有同名文件会被覆盖
copyFromLocal用法:
上传文件并重命名:
hadoop fs -copyFromLocal file:test.txt hdfs:test2.txt
覆盖上传:
hadoop fs -copyFromLocal -f test.txt test.txt
3) 下载文件、目录(get、copyToLocal)
get 用法:
拷贝文件到本地目录:
hadoop fs -get hdfs:test.txt file:root
拷贝文件并重命名,可以简写:
hadoop fs -get test.txt roottest.txt copyToLocal用法
拷贝文件到本地目录:
hadoop fs -copyToLocal hdfs:test.txt file:root
拷贝文件并重命名,可以简写:
hadoop fs -copyToLocal test.txt roottest.txt
4) 拷贝文件、目录(cp)
从本地到 HDFS,同 put
hadoop fs -cp file:test.txt hdfs:test2.txt
从 HDFS 到 HDFS
hadoop fs -cp hdfs:test.txt hdfs:test2.txt
hadoop fs -cp test.txt test2.txt
5) 移动文件(mv)
hadoop fs -mv hdfs:test.txt hdfs:dirtest.txt
hadoop fs -mv test.txt dirtest.txt
6) 删除文件、目录(rm)
删除指定文件
hadoop fs -rm a.txt
删除全部 txt 文件
hadoop fs -rm .txt
递归删除全部文件和目录
hadoop fs -rm -R dir
7) 读取文件(cat、tail)
hadoop fs -cat test.txt 以字节码的形式读取
hadoop fs -tail test.txt
8) 创建空文件(touchz)
hadoop fs - touchz newfile.txt
9) 创建文件夹(mkdir)
hadoop fs -mkdir newdir newdir2 可以同时创建多个
hadoop fs -mkdir -p newpkgnewpkg2newpkg3 同时创建父级目录
10) 获取逻辑空间文件、目录大小(du)
hadoop fs - du 显示 HDFS 根目录中各文件和文件夹大小
hadoop fs -du -h 以最大单位显示 HDFS 根目录中各文件和文件夹大小 hadoop fs -du -s 仅显示 HDFS 根目录大小。即各文件和文件夹大小之和
第五章 Mapreduce计算框架
如果将Hadoop 比做一头大象,那么MapReduce就是那头大象的电脑。 MapReduce
是 Hadoop 核心编程模型。在 Hadoop 中,数据处理核心就是 MapReduce 程序设计模
型。
本章内容:
1) MapReduce 编程模型
2) MapReduce 执行流程
3) MapReduce 数据本地化
4) MapReduce 工作原理
5) MapReduce 错误处理机制
1. MapReduce 编程模型
Map和Reduce 的概念是从函数式变成语言中借来的,整个MapReduce计算过程分
为Map阶段和 Reduce阶段,也称为映射和缩减阶段,这两个独立的阶段实际上是两个独
立的过程,即 Map 过程和 Reduce 过程,在 Map 中进行数据的读取和预处理,之后将预
处理的结果发送到Reduce 中进行合并。
我们通过一个代码案例,让大家快速熟悉如何通过代码,快速实现一个我们自己的
MapReduce。
案例:分布式计算出一篇文章中的各个单词出现的次数,也就是WordCount。
1) 创建map.py 文件,写入以下代码:
!usrbinenv python
import sys word_list = []
for line in sys.stdin:
word_list = line.strip.split(' ')
if len(word_list) <= 0:
continue
for word in word_list:
w = word.strip
if len(w) <= 0:
continue
print '\t'.join([w, 1])
该代码主要工作是从文章数据源逐行读取,文章中的单词之间以空格分割,word_list = line.strip.split(' ')这块代码是将当前读取的一整行数据按照空格分割,将分割后的结果存入 word_list 数组中,然后通过 for word in word_list 遍历数组,取出
每个单词,后面追加“1”标识当前word出现1 次。
2) 创建reduce.py,写入以下代码:
!usrbinenv python
import sys
cur_word = None
sum_of_word = 0
for line in sys.stdin:
ss = line.strip.split('\t')
if len(ss) != 2:
continue
word = ss[0].strip
count = ss[1].strip
if cur_word == None:
cur_word = word
if cur_word != word:
print '\t'.join([cur_word, str(sum_of_word)])
sum_of_word = 0
cur_word = word
sum_of_word += int(count)
print '\t'.join([cur_word, str(sum_of_word)])
sum_of_word = 0
该代码针对 map 阶段的数组进行汇总处理,map 到 reduce 过程中默认存在 shuffle
partition分组机制,保证同一个word的记录,会连续传输到reduce中,所以在 reduce
阶段只需要对连续相同的word后面的技术进行累加求和即可。
3) 本地模拟测试脚本:
] cat big.txt | python map.py | sort -k1 | python reduce.py
cat 1
run 3
see 2
spot 2
the 1
6) 脚本执行流程:
see spot run
run spot run
see the cat
see spot run
see the cat
run spot run
see,1
spot,1
run,1
run,1
spot,1
run,1
see,1
the,1
cat,1
see,1
see,1
spot,1
spot,1
run,1
run,1
run,1
the,1
cat,1
see,1
spot,1
run,1
the,1
cat,1
cat 1
run 3
see 2
spot 2
the 1
输入 拆分 映射 派发 缩减 输出
2. MapReduce 执行流程
上面的例子属于 MapReduce 计算框架的一般流程,经过整理总结:
1) 输入和拆分:
不属于map和reduce 的主要过程,但属于整个计算框架消耗时间的一部分,该部分
会为正式的map准备数据。
分片(split)操作:
split 只是将源文件的内容分片形成一系列的 InputSplit,每个InputSpilt中存储着对
应分片的数据信息(例如,文件块信息、起始位置、数据长度、所在节点列表…),并不是
将源文件分割成多个小文件,每个InputSplit 都由一个mapper进行后续处理。
每个分片大小参数是很重要的,splitSize 是组成分片规则很重要的一个参数,该参数
由三个值来确定:
· minSize:splitSize 的最小值,由mapred-site.xml配置文件中
mapred.min.split.size 参数确定。
· maxSize:splitSize的最大值,由mapred-site.xml配置文件中
mapreduce.jobtracker.split.metainfo.maxsize 参数确定。
· blockSize:HDFS 中文件存储的快大小,由 hdfs-site.xml配置文件中
dfs.block.size 参数确定。
splitSize的确定规则:splitSize=max{minSize,min{maxSize,blockSize}}
数据格式化(Format)操作: 将划分好的InputSplit格式化成键值对形式的数据。其中key 为偏移量,value是每
一行的内容。
值得注意的是,在 map任务执行过程中,会不停的执行数据格式化操作,每生成一
个键值对就会将其传入 map,进行处理。所以 map和数据格式化操作并不存在前后时间
差,而是同时进行的。
Input Data
Stored on
HDFS
Input Split
Input Split
Input Split
Record
Reader
Record
Reader
Record
Reader
Key, Value
Key, Value
Key, Value
Key, Value
Key, Value
Key, Value
Map
Task
Map
Task
Map
Task
2) Map映射:
是 Hadoop并行性质发挥的地方。根据用户指定的map过程,MapReduce尝试在
数据所在机器上执行该 map程序。在HDFS 中,文件数据是被复制多份的,所以计算将
会选择拥有此数据的最空闲的节点。
在这一部分,map 内部具体实现过程,可以由用户自定义。
3) Shuffle派发:
Shuffle 过程是指 Mapper 产生的直接输出结果,经过一系列的处理,成为最终的
Reducer直接输入数据为止的整个过程。这是 mapreduce的核心过程。该过程可以分为两
个阶段:
Mapper 端的 Shuffle:由 Mapper 产生的结果并不会直接写入到磁盘中,而是先存
储在内存中,当内存中的数据量达到设定的阀值时,一次性写入到本地磁盘中。并同时进行
sort(排序)、combine(合并)、partition(分片)等操作。其中,sort 是把Mapper产
生的结果按照key值进行排序;combine是把 key值相同的记录进行合并;partition是把数据均衡的分配给Reducer。
Reducer端的 Shuffle:由于Mapper 和 Reducer往往不在同一个节点上运行,所以
Reducer 需要从多个节点上下载 Mapper 的结果数据,并对这些数据进行处理,然后才能
被Reducer 处理。
4) Reduce缩减:
Reducer接收形式的数据流,形成形式的输出,具体的过程可以由用户自定义,最终结
果直接写入hdfs。每个reduce 进程会对应一个输出文件,名称以part-开头。
3. MapReduce 数据本地化(Data-Local)
首先,HDFS 和 MapReduce 是 Hadoop 的核心设计。对于 HDFS,是存储基础,在
数据层面上提供了海量数据存储的支持。而 MapReduce,是在数据的上一层,通过编写
MapReduce 程序对海量数据进行计算处理。
在前面 HDFS 章节中,知道了 NameNode 是文件系统的名字节点进程,DataNode
是文件系统的数据节点进程。
MapReduce 计算框架中负责计算任务调度的 JobTracker 对应 HDFS 的 NameNode
的角色,只不过一个负责计算任务调度,一个负责存储任务调度。
MapReduce计算框架中负责真正计算任务的TaskTracker对应到HDFS的DataNode
的角色,一个负责计算,一个负责管理存储数据。
考虑到“本地化原则”,一般地,将 NameNode和JobTracker部署到同一台机器上,各个DataNode 和 TaskNode 也同样部署到同一台机器上。
这样做的目的是将 map 任务分配给含有该 map 处理的数据块的 TaskTracker 上,同
时将程序JAR包复制到该TaskTracker 上来运行,这叫“运算移动,数据不移动”。而分配
reduce 任务时并不考虑数据本地化。
4. MapReduce 工作原理
我们通过Client、JobTrask 和TaskTracker的角度来分析MapReduce的工作原理:
首先在客户端(Client)启动一个作业(Job) ,向JobTracker 请求一个 Job ID。将运
行作业所需要的资源文件复制到 HDFS上,包括MapReduce程序打包的 JAR文件、配置
文件和客户端计算所得的输入划分信息。这些文件都存放在JobTracker 专门为该作业创建
的文件夹中,文件夹名为该作业的 Job ID。JAR 文件默认会有 10 个副本
(mapred.submit.replication属性控制);输入划分信息告诉了JobTracker应该为这个作业启动多少个map 任务等信息。
JobTracker 接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度
当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一
个 map 任务,并将 map 任务分配给 TaskTracker 执行。对于 map 和 reduce 任务,TaskTracker 根据主机核的数量和内存的大小有固定数量的 map 槽和 reduce 槽。这里需
要强调的是:map 任务不是随随便便地分配给某个 TaskTracker 的,这里就涉及到上面提
到的数据本地化(Data-Local) 。
TaskTracker 每隔一段时间会给 JobTracker 发送一个心跳,告诉JobTracker它依然在
运行,同时心跳中还携带着很多的信息,比如当前 map 任务完成的进度等信息。当
JobTracker 收到作业的最后一个任务完成信息时,便把该作业设置成“成功”。当 JobClient
查询状态时,它将得知任务已完成,便显示一条消息给用户。
如果具体从map端和reduce 端分析,可以参考上面的图片,具体如下:
Map端流程:
1) 每个输入分片会让一个 map 任务来处理,map 输出的结果会暂且放在一个环形
内存缓冲区中(该缓冲区的大小默认为100M,由 io.sort.mb属性控制),当该缓
冲区快要溢出时(默认为缓冲区大小的 80%,由io.sort.spill.percent属性控制),会在本地文件系统中创建一个溢出文件,将该缓冲区中的数据写入这个文件。 2) 在写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,也就是一个 reduce 任务对应一个分区的数据。这样做是为了避免有些 reduce 任
务分配到大量数据,而有些 reduce任务却分到很少数据,甚至没有分到数据的尴
尬局面。其实分区就是对数据进行 hash 的过程。然后对每个分区中的数据进行排
序,如果此时设置了 Combiner,将排序后的结果进行 Combine 操作,这样做的
目的是让尽可能少的数据写入到磁盘。
3) 当map任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文
件合并。合并的过程中会不断地进行排序和Combine 操作,目的有两个:
· 尽量减少每次写入磁盘的数据量;
· 尽量减少下一复制阶段网络传输的数据量。
最后合并成了一个已分区且已排序的文件。为了减少网络传输的数据量,这里可以
将数据压缩,只要将 mapred.compress.map.out设置为true就可以了。
4) 将分区中的数据拷贝给相对应的 reduce 任务。分区中的数据怎么知道它对应的
reduce 是哪个呢?其实 map 任务一直和其父 TaskTracker 保持联系,而
TaskTracker 又一直和JobTracker 保持心跳。所以 JobTracker中保存了整个集群
中的宏观信息。只要reduce 任务向JobTracker 获取对应的map输出位置就可以
了。
Reduce端流程:
1) Reduce 会接收到不同 map 任务传来的数据,并且每个 map 传来的数据都是有
序的。如果 reduce 端接受的数据量相当小,则直接存储在内存中(缓冲区大小由
mapred.job.shuffle.input.buffer.percent 属性控制,表示用作此用途的堆空间的
百 分 比 ), 如 果 数 据 量 超 过 了 该 缓 冲 区 大 小 的 一 定 比 例 ( 由mapred.job.shuffle.merge.percent 决定),则对数据合并后溢写到磁盘中。
2) 随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是
为了给后面的合并节省时间。其实不管在 map 端还是 reduce 端,MapReduce
都是反复地执行排序,合并操作,所以排序是hadoop的灵魂。
3) 合并的过程中会产生许多的中间文件(写入磁盘了),但 MapReduce 会让写入磁
盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到
reduce 函数。
在 Map处理数据后,到 Reduce得到数据之前,这个流程在MapReduce 中可以看做
是一个Shuffle 的过程。
在经过 mapper 的运行后,我们得知 mapper 的输出是这样一个 keyvalue 对。到底
当前的 key 应该交由哪个 reduce 去做呢,是需要现在决定的。 MapReduce 提供
Partitioner 接口,它的作用就是根据 key 或 value 及 reduce 的数量来决定当前的这对输
出数据最终应该交由哪个 reduce task 处理。默认对 key 做 hash 后再以 reduce task 数
量取模。默认的取模方式只是为了平均 reduce 的处理能力,如果用户自己对 Partitioner
有需求,可以订制并设置到 job上。
5. MapReduce 错误处理机制
MapReduce 任务执行过程中出现的故障可以分为两大类: 硬件故障和任务执行失败引
发的故障。
1) 硬件故障
在 Hadoop Cluster中,只有一个JobTracker,因此,JobTracker本身是存在单点故
障的。如何解决JobTracker的单点问题呢?我们可以采用主备部署方式,启动 JobTracker主节点的同时,启动一个或多个 JobTracker备用节点。当JobTracker 主节点出现问题时,通过某种选举算法,从备用的 JobTracker 节点中重新选出一个主节点。
机器故障除了 JobTracker 错误就是 TaskTracker 错误。TaskTracker 故障相对较为常
见,MapReduce 通常是通过重新执行任务来解决该故障。
在 Hadoop集群中,正常情况下,TaskTracker 会不断的与JobTracker通过心跳机制
进行通信。如果某 TaskTracker 出现故障或者运行缓慢,它会停止或者很少向 JobTracker
发送心跳。如果一个 TaskTracker 在一定时间内(默认是1 分钟)没有与 JobTracker通信,那么 JobTracker 会将此 TaskTracker 从等待任务调度的 TaskTracker 集合中移除。同时
JobTracker 会要求此 TaskTracker 上的任务立刻返回。如果此 TaskTracker 任务仍然在
mapping阶段的Map 任务,那么JobTracker会要求其他的TaskTracker重新执行所有原
本由故障TaskTracker执行的Map任务。如果任务是在 Reduce 阶段的 Reduce 任务,那
么JobTracker会要求其他TaskTracker重新执行故障TaskTracker未完成的Reduce任务。
比如:一个 TaskTracker 已经完成被分配的三个 Reduce 任务中的两个,因为 Reduce 任务
一旦完成就会将数据写到 HDFS 上,所以只有第三个未完成的 Reduce 需要重新执行。但
是对于Map任务来说,即使 TaskTracker 完成了部分 Map,Reduce 仍可能无法获取此节
点上所有Map的所有输出。所以无论Map任务完成与否,故障 TaskTracker上的Map任
务都必须重新执行。
2) 任务执行失败引发的故障
在实际任务中, MapReduce 作业还会遇到用户代码缺陷或进程崩溃引起的任务失败等
情况。用户代码缺陷会导致它在执行过程中抛出异常。此时,任务 JVM 进程会自动退出,并
向TaskTracker 父进程发送错误消息,同时错误消息也会写入 log文件,最后 TaskTracker
将此次任务尝试标记失败。对于进程崩溃引起的任务失败,TaskTracker 的监听程序会发现进程退出,此时TaskTracker 也会将此次任务尝试标记为失败。对于死循环程序或执行时间
太长的程序,由于 TaskTracker 没有接收到进度更新,它也会将此次任务尝试标记为失败,并杀死程序对应的进程。
在以上情况中,TaskTracker将任务尝试标记为失败之后会将TaskTracker自身的任务
计数器减 1,以便想 JobTracker 申请新的任务。TaskTracker 也会通过心跳机制告诉
JobTracker 本地的一个任务尝试失败。JobTracker接到任务失败的通知后,通过重置任务
状态,将其加入到调度队列来重新分配该任务执行(JobTracker 会尝试避免将失败的任务
再次分配给运行失败的 TaskTracker)。如果此任务尝试了 4 次(次数可以进行设置)仍没
有完成,就不会再被重试,此时整个作业也就失败了。
第六章 Zookeeper
Zookeeper 是一种分布式的,开源的,应用于分布式应用的协作服务。它提供了一些
简单的操作,使得分布式应用可以基于这些接口实现诸如同步、配置维护和分集群或者命名
的服务。Zookeeper 很容易编程接入,它使用了一个和文件树结构相似的数据模型。可以
使用Java 或者C 来进行编程接入。
众所周知,分布式的系统协作服务很难有让人满意的产品。这些协作服务产品很容易陷
入一些诸如竞争选择条件或者死锁的陷阱中。Zookeeper 的目的就是将分布式服务不再需
要由于协作冲突而另外实现协作服务。
本章内容:
1) Zookeeper 数据模型
2) Zookeeper 访问控制
3) Zookeeper 应用场景 1. Zookeeper 数据模型
ZooKeeper拥有一个层次的命名空间,这个和标准的文件系统非常相似
从图中我们可以看出 ZooKeeper 的数据模型,在结构上和标准文件系统的非常相似,都是采用这种树形层次结构,ZooKeeper树中的每个节点被称为—Znode。和文件系统的
目录树一样,ZooKeeper树中的每个节点可以拥有子节点。但也有不同之处:
1) 引用方式:
Zonde 通过路径引用,如同 Unix 中的文件路径。路径必须是绝对的,因此他们必须由
斜杠字符来开头。除此以外,他们必须是唯一的,也就是说每一个路径只有一个表示,因此
这些路径不能改变。在 ZooKeeper 中,路径由 Unicode 字符串组成,并且有一些限制。
字符串zookeeper用以保存管理信息,比如关键配额信息。
2) Znode 结构
ZooKeeper命名空间中的 Znode,兼具文件和目录两种特点。既像文件一样维护着数
据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。图中的
每个节点称为一个Znode。 每个Znode 由3 部分组成:
· stat:此为状态信息, 描述该Znode的版本, 权限等信息
· data:与该Znode 关联的数据
· children:该Znode 下的子节点 ZooKeeper虽然可以关联一些数据,但并没有被设计为常规的数据库或者大数据存储,相反的是,它用来管理调度数据,比如分布式应用中的配置文件信息、状态信息、汇集位置
等等。这些数据的共同特性就是它们都是很小的数据,通常以 KB为大小单位。ZooKeeper
的服务器和客户端都被设计为严格检查并限制每个 Znode 的数据大小至多 1M,但常规使
用中应该远小于此值。
3) 数据访问
ZooKeeper 中的每个节点存储的数据要被原子性的操作。也就是说读操作将获取与节
点相关的所有数据,写操作也将替换掉节点的所有数据。另外,每一个节点都拥有自己的
ACL(访问控制列表),这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行
的操作。
4) 节点类型
Persistent Nodes:永久有效地节点,除非 client 显式的删除,否则一直存在。
Ephemeral Nodes:临时节点,仅在创建该节点 client 保持连接期间有效,一旦连接丢
失,zookeeper会自动删除该节点。
Sequence Nodes:顺序节点,client 申请创建该节点时, ZooKeeper 会自动在节点路
径末尾添加递增序号,这种类型是实现分布式锁,分布式queue 等特殊功能的关键。
5) 监控
客户端可以在节点上设置 watch,我们称之为监视器。当节点状态发生改变时(Znode
的增、删、改)将会触发 watch 所对应的操作。当 watch 被触发时,ZooKeeper 将会向客
户端发送且仅发送一条通知,因为 watch只能被触发一次,这样可以减少网络流量。
ZooKeeper可以为所有的读操作设置watch,这些读操作包括: exists、 getChildren
及getData。watch 事件是一次性的触发器,当 watch的对象状态发生改变时,将会触发此对象上watch所对应的事件。 watch事件将被异步地发送给客户端,并且ZooKeeper为
watch 机制提供了有序的一致性保证。理论上,客户端接收 watch 事件的时间要快于其看
到watch对象状态变化的时间。
2. Zookeeper 访问控制
传统的文件系统中,ACL分为两个维度,一个是属组,一个是权限,子目录文件默认
继承父目录的 ACL。而在 Zookeeper 中,node 的 ACL 是没有继承关系的,是独立控制
的。Zookeeper 的 ACL,可以从三个维度来理解:一是 scheme; 二是 user; 三是
permission,通常表示为scheme:id:permissions, 下面从这三个方面分别来介绍:
1) scheme: scheme 对应于采用哪种方案来进行权限管理,zookeeper 实现了一个
pluggable的ACL方案,可以通过扩展scheme,来扩展ACL 的机制。
模式 描述
World 它下面只有一个 id, 叫anyone, world:anyone代表任何人, zookeeper 中对
所有人有权限的结点就是属于 world:anyone 的
Auth 已经被认证的用户
Digest 通过username:password字符串的MD5 编码认证用户
Host 匹 配 主 机 名 后 缀 , 如 , host:corp.com 匹配 host:host1.corp.com,host:host2.corp.com,但不能匹配 host:host1.store.com
IP 通过IP 识别用户,表达式格式为 addrbits
2) User:与 scheme 是紧密相关的,具体的情况在上面介绍 scheme 的过程都已介
绍,这里不再赘述。
3) permission: zookeeper目前支持下面一些权限: 权限 描述 备注
Create 有创建子节点的权限
Read 有读取节点数据和子节点列表的权限
Write 有修改节点数据的权限 无创建和删除子节点的权限
Delete 有删除子节点的权限
Admin 有设置节点权限的权限
3. Zookeeper 应用场景
1) 数据发布与订阅(配置中心)
发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZK 节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服
务式服务框架的服务地址列表等就非常适合使用。
2) 分布式锁服务
分布式锁,这个主要得益于 ZooKeeper 为我们保证了数据的强一致性。锁服务可以分
为两类,一个是保持独占,另一个是控制时序。
3) 分布式队列
队列方面,简单地讲有两种,一种是常规的先进先出队列,另一种是要等到队列成员聚
齐之后的才统一按序执行。对于第一种先进先出队列,和分布式锁服务中的控制时序场景基本原理一致,这里不再赘述。 第二种队列其实是在FIFO队列的基础上作了一个增强。通常
可以在 queue 这个 znode 下预先建立一个queuenum 节点,并且赋值为 n(或者直
接给queue 赋值n),表示队列大小,之后每次有队列成员加入后,就判断下是否已经到达
队列大小,决定是否可以开始执行了。这种用法的典型场景是,分布式环境中,一个大任务
Task A,需要在很多子任务完成(或条件就绪)情况下才能进行。这个时候,凡是其中一个
子任务完成(就绪),那么就去 taskList 下建立自己的临时时序节点
(CreateMode.EPHEMERAL_SEQUENTIAL),当 taskList 发现自己下面的子节点满足
指定个数,就可以进行下一步按序进行处理了。
第七章 HBase
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存
储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
本章内容:
1) Hbase简介
2) Hbase数据模型
3) Hbase基础原理
4) Hbase系统架构
5) Hbase基础操作
1. Hbase简介
HBase 是 Apache Hadoop 中的一个子项目,Hbase 依托于 Hadoop 的 HDFS 作为
最基本存储基础单元,通过使用 hadoop的 DFS 工具就可以看到这些这些数据存储文件夹的结构,还可以通过MapReduce 的框架(算法)对HBase 进行操作。
上图描述了 Hadoop EcoSystem 中的各层系统,其中 HBase 位于结构化存储层,Hadoop HDFS 为 HBase 提供了高可靠性的底层存储支持,Hadoop MapReduce 为
HBase提供了高性能的计算能力, Zookeeper为HBase提供了稳定服务和failover机制。
Hbase适用场景:
1) 大数据量存储,大数据量高并发操作
2) 需要对数据随机读写操作
3) 读写访问均是非常简单的操作
Hbase与 HDFS对比:
· 两者都具有良好的容错性和扩展性,都可以扩展到成百上千个节点;
· HDFS适合批处理场景,但不支持数据随机查找,不适合增量数据处理,不支持数据更新
2. Hbase数据模型
HBase 以表的形式存储数据。表由行和列族组成。列划分为若干个列族(row family),其逻辑视图如下:
行健 时间戳 列族contents 列族anchor 列族 mime
“com.cnn.www” T9 Anchor:cnnsi.com=“CNN”
T8 Anchor:my.look.ca=“CNN.com”
T6 Contents:html=“……” Mime.type=“texthtml”
T5 Contents:html=“……”
T3 Contents:html=“……”
几个关键概念:
1) 行键(RowKey)
· 行键是字节数组, 任何字符串都可以作为行键;
· 表中的行根据行键进行排序,数据按照 Row key 的字节序(byte order)排序
存储;
· 所有对表的访问都要通过行键 (单个 RowKey 访问,或RowKey范围访问,或全表扫描)
2) 列族(ColumnFamily)
· CF必须在表定义时给出
· 每个 CF 可以有一个或多个列成员(ColumnQualifier),列成员不需要在表定
义时给出,新的列族成员可以随后按需、动态加入
· 数据按 CF 分开存储, HBase 所谓的列式存储就是根据CF 分开存储(每个CF
对应一个Store),这种设计非常适合于数据分析的情形
3) 时间戳(TimeStamp) ? 每个Cell可能又多个版本,它们之间用时间戳区分
4) 单元格(Cell)
· Cell 由行键,列族:限定符,时间戳唯一决定
· Cell中的数据是没有类型的,全部以字节码形式存储
5) 区域(Region)
· HBase自动把表水平(按Row)划分成多个区域(region),每个region会保
存一个表里面某段连续的数据;
· 每个表一开始只有一个region,随着数据不断插入表,region不断增大,当
增大到一个阀值的时候,region就会等分会两个新的region;
· 当 table 中的行不断增多,就会有越来越多的 region。这样一张完整的表被
保存在多个 Region 上。
· Region 虽然是分布式存储的最小单元,但并不是存储的最小单元。 Region由
一个或者多个Store组成,每个store保存一个columns family;每个Strore
又由一个 memStore 和 0 至多个 StoreFile 组成,StoreFile 包含 HFile;
memStore 存储在内存中,StoreFile存储在HDFS上。
3. Hbase架构及基本组件
从上图看到HBase 的基本组件:
1) Client:
· 包含访问 HBase的接口,并维护 cache来加快对HBase 的访问,比如region
的位置信息。
2) Master
· 为Region server分配region
· 负责Region server 的负载均衡
· 发现失效的 Region server 并重新分配其上的region
· 管理用户对 table 的增删改查操作 3) Region Server
· Regionserver维护region,处理对这些region的IO请求
· Regionserver负责切分在运行过程中变得过大的region
4) Zookeeper 作用
· 通过选举,保证任何时候,集群中只有一个Master, Master与RegionServers
启动时会向 ZooKeeper注册
· 存储所有 Region的寻址入口
· 实时监控 Region server的上线和下线信息,并实时通知给Master
· 存储HBase的 schema和 table 元数据
· 默认情况下,HBase 管理 ZooKeeper 实例,比如, 启动或者停止
ZooKeeper
· Zookeeper 的引入使得Master不再是单点故障 4. Hbase容错与恢复
每个HRegionServer 中都有一个HLog对象, HLog是一个实现Write Ahead Log的
类,在每次用户操作写入 MemStore 的同时,也会写一份数据到 HLog 文件中(HLog 文
件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到 StoreFile中
的数据)。当HRegionServer 意外终止后,HMaster 会通过Zookeeper 感知到,HMaster
首先会处理遗留的 HLog 文件,将其中不同 Region 的 Log 数据进行拆分,分别放到相应
region的目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer
在 Load Region 的过程中,会发现有历史 HLog 需要处理,因此会 Replay HLog 中的数
据到MemStore中,然后 flush 到StoreFiles,完成数据恢复
Hbase容错性:
1) Master 容错:Zookeeper 重新选择一个新的 Master
· 无Master过程中,数据读取仍照常进行;
· 无master 过程中,region切分、负载均衡等无法进行;
2) RegionServer容错:定时向Zookeeper汇报心跳,如果一旦时间内未出现心跳,Master 将该 RegionServer 上的 Region 重新分配到其他 RegionServer 上,失效服务器上“预写”日志由主服务器进行分割并派送给新的 RegionServer
3) Zookeeper 容错: Zookeeper是一个可靠地服务,一般配置3或5 个Zookeeper
实例
Region定位流程:
寻找 RegionServer 过程:ZooKeeper--> -ROOT-(单 Region)--> .META.--> 用户
表
1) -ROOT-
· 表包含.META.表所在的region 列表,该表只会有一个Region;
· Zookeeper 中记录了-ROOT-表的 location。
2) .META.
· 表包含所有的用户空间region列表,以及 RegionServer 的服务器地址。
5. Hbase基础操作
1) 进入hbase shell console
HBASE_HOMEbinhbase shell
表的管理:
2) 查看有哪些表 list
3) 创建表
语法:create





