《Hadoop海量数据处理》(第2版)阅读整理

[img]http://dl.iteye.com/upload/picture/pic/136745/8c8659cd-f6e4-3b9b-95eb-1ccb42797037.jpg[/img]

[b]《Hadoop海量数据处理——技术详解与项目实战》(第2版)阅读整理。[/b]

[b]Hadoop官网[/b]: [url]http://hadoop.apache.org[/url]

-------------------------------------------------------------------------
[b]以下是我本人的书评 [/b]
云计算的概念是在2006年提出来的,而2013年被称为“大数据元年”,标志着世界正式进入了大数据时代。我们有幸在技术飞述发展的当下,见证着一个个伟大的技术诞生,开源意味着每个人都能学习、使用。作为Apache软件基金会的项级项目——Hadoop的学习,我选用了《Hadoop海量数据处理——技术详解与项目实战》(第2版)作为我的入门书籍。原因是它第2版是在2016年6月出版,时间上比较新。另一原因是本书不仅有基础概念的解释,还有实战的演示,做为一本入门技术书籍,是很不错的选择。在此,感谢作者的分享。

另外,Hadoop的官网上的文档写的非常全且详细,但是由于Hadoop涉及的内容实在太多了,一时间竟不知道从何学起,所以有本书带着进入Hadoop的世界,事半功倍!(我的体验是可以结合着看)。

最后,书摘写的有点多,但都是我随手记的,没有具体参考意义,我只拜读了基础篇,即前9章,对于应用篇,还需要一点时间去做demo。

重要: 若要系统的学习Hadoop,建议买书学习。

-------------------------------------------------------------------------
[b]本书目录[/b]
[list]
[*]第1章,绪论
[*]第2章,环境准备
[*]第3章,Hadoop的基石: HDFS
[*]第4章,YARN: 统一资源管理和调度
[*]第5章,分而治之的智慧: MapReduce
[*]第6章,SQL on Hadoop: Hive
[*]第7章,SQL to Hadoop: Sqoop
[*]第8章,HBase: HadoopDataBase
[*]第9章,Hadoop性能调优和运维
[/list]
-------------------------------------------------------------------------

[b]如何阅读本书[/b]
本书一共分为三个部分: 基础篇、应用篇和结束篇:
[list]
[*]基础篇: 1-9章,第3-8章主要介绍HDFS、YARN、MapReduce、Hive、Sqoop、Hbase的原理和使用。
[*]应用篇: 10-19章,主要内容为一个基于Hadoop的在线图书销售商业智能系统的设计和实现。
[*]结束篇: 对全书进行总结。
[/list]
-------------------------------------------------------------------------
[b]以下是摘录:[/b]

[color=blue][b]【第1章】绪论[/b][/color]
Hadoop的特点:
1. Hadoop是一个框架。
2. Hadoop适合处理大规模数据。
3. Hadoop被部署在一个集群上

Hadoop的组成(这部分Hadoop官网上的首页就有介绍,贴上英文介绍):
[u][b]狭义的Hadoop: 由以下四个模块组成[/b][/u]
[list]
[*][b]Hadoop Common[/b]: The common [u]utilities[/u] that support the other Hadoop modules.
[*][b]Hadoop Distributed File System (HDFS™)[/b]: A [u]distributed file system[/u] that provides high-throughput access to application data.
[*]H[b]adoop YARN(Yet Another Resource Negotiator)[/b]: A framework for job scheduling and cluster [u]resource management[/u].
[*][b]Hadoop MapReduce[/b]: A YARN-based system for [u]parallel processing[/u] of large data sets.
[/list]
[u][b]Hadoop生态圈(广义上):[/b][/u]
[img]http://dl.iteye.com/upload/picture/pic/136747/9fe83770-5fc2-3a25-8cff-f8587e3f1f45.png[/img]

[list]
[*][b]Spark[/b]: 由Scala语言开发的新一代[u]计算框架[/u]。Spark在多个领域和MapReduce展开正面交锋,并且具有很多MapReduce所没有的特性,潜力巨大。
[*][b]HBase[/b]: 分布式的、面向列族的开源[u]数据库[/u]。
[*][b]ZooKeeper[/b]: 分布式的服务框架,提供[u]配置维护、名字服务、分布式同步、组服务[/u]等。
[*][b]Hive[/b]: 最早由Facebook开发并使用,是基于Hadoop的一个数据仓库工具。Hive对于Hadoop来说是非常重要的模块,大大降低了Hadoop的使用门槛。
[*][b]Pig[/b]: 和Hive类似,是对大型数据集进行分析和评估的工具。
[*][b]Impala[/b]: 由Cloudera公司开发,对存储在HDFS、HBase的海量数据提供交互式查询的SQL接口。
[*][b]Mahout[/b]: 机器学习和数据挖掘库。
[*][b]Flume[/b]: 由Cloudera公司提供的分布式的海量[u]日志[/u]采集、聚合和传输系统。
[*][b]Sqoop[/b]: [u]SQL to Hadoop[/u],在结构化的数据存储(关系型数据库)与Hadoop之间进行数据双向交换。
[*][b]Kafka[/b]: 分布式订阅[u]消息系统[/u],连接了平台里面的各种组件。
[/list]
(Hadoop官网上所列的其它模块和本书作者列的有交集,但也略有不同,可以结合看。具体戳Hadoop官网。)

围绕Hadoop做[b]二次开发[/b]的公司如: Cloudera、Hortonworks、MapR。

[color=blue][b]云计算[/b][/color],由Google首席执行官埃里克.施密特于2006年8月9日在搜索引擎大会上提出。

云计算定义: 是一种通过网络方便地接入共享资源池,按需获取计算资源的服务模型。共享资源池中的资源可以通过较少的管理代价和简单业务交互过程而快速部署和发布。

之所以称这“云”,是因为云计算在某些地方和现实中的云非常符合,云的规模可以动态伸缩,它的边界是模糊的,云在空中飘忽不定,无法也无需确定它的具体位置,但它确实存在于某处。

云计算的类型:
[list]
[*]基础设施即服务(Infrastructure as a Service, IaaS): 如目前大热的Docker。
[*]平台即服务(Platform as a Service, PaaS): 如Hadoop。
[*]软件即服务(Software as a service, SaaS)
[/list]
Hadoop是云计算的产物,可以看做云计算技术的一种实现。而云计算的概念则更广阔,并不拘泥于某种技术。

[color=blue][b]大数据[/b][/color](Big Data): 庞大容量、极快速度和种类丰富的数据。

大数据的结构类型:
[list]
[*]结构化: 数据库中的数据
[*]半结构化: 如XML
[*]准结构化: 具有不规则数据格式的文本数据,使用工具可以使之格式化。
[*]非结构化: 如text,PDF,图片,视频等
[/list]
云计算和大数据之间的关系: 云计算是你在做的事情,而大数据是你所拥有的东西。从另一个角度讲,云计算是一种IT理念、技术架构和标准,而云计算不可避免地会产生大量的数据。

[color=blue]对于Hadoop来说,首先HDFS解决了海量数据存储的问题,Hive负责结构化数据的分而,而半结构化、非结构化数据的分析和数据清洗可根据需要编写MapReduce作业完成,整个过程都是基于分布式存储的数据进行分布式计算。
另外Hadoop生态圈的Sqoop、Flume等实现了传统商业智能的一些功能模块。如日志收集、数据抽取等。[/color]

【第2章】环境准备
下载:
1. 官网下载
2. 由Cloudera公司提供的名为CDH的版本(Cloudera‘s Deistribution for Hadoop),也是开源的。Cloudera公司针对目前Hadoop各个组件存在兼容性问题,为各种不同的生产环境提供安装文件。同一个CDH版本之间的组件不存在兼容性问题。
目前: 最新版本是CDH5,基于Hadoop2.6开发。

结论: 选择Hadoop的版本取决于用户想要的功能和是否稳定,[u]对于稳定的需求,一般就考虑Cloudera的CHD[/u]。

以下是Hadoop架构的内容:
[b]HDFS架构:[/b] 以[color=blue][b]主从(master/slave)模式[/b][/color]组成的节点。

HDFS守护进程
[table]
|守护进程|集群中的数目|作用|
|NameNode|1|存储文件系统的元数据,存储文件与数据块映射,并提供文件系统的全景图。|
|SecondaryNameNode|1|是NameNode的一种,备份NameNode数据,并负责镜像与NameNode日志数据的合并。|
|DataNode|1个或多个|存储块数据|
[/table]

[b]YARN架构:[/b] 构成YARN集群的是两类节点: ResourceManager和NodeManager。同HDFS类似,YARN也采用主从(marster/slave)架构。

YARN守护进程
[table]
|守护进程|集群中的数量|作用|
|ResourceManager|1个|负责集群中所有的资源的统一管理和调度。|
|NodeManager|1个或多个|负责管理单个计算节点、容器的生命周期管理、追踪节点健康状况。|
[/table]

DataNode和NodeManager需要配对部署在同一个节点上。

安装Hadoop: 略
安装Hive: 略
安装HBase: 略
安装Sqoop: 略

【第3章】认识HDFS
HDFS的设计理念源于非常朴素的思想: 当数据集的大小超过单台计算机的存储能力时,就有必要将其进行分区(partition)并存储到若干台单独的计算机上,而管理网络中跨多台计算机存储的文件系统称为分布式文件系统(distribute filesystem)。

HDFS的设计理论
作为Hadoop生态圈的基础,HDFS非常适合运行在廉价硬件集群之上,[b]以流式数据访问模式来存储超大文件[/b]。

[color=blue]缺点(或叫短板): [/color]
[list]
[*]实时的数据访问弱: 如果应用要求数据访问的时间在秒或是毫秒级别,那么HDFS是做不到的。由于HDFS针对高数据吞吐量做了优化,因而牺牲了读取数据的速度,[color=blue]对于响应时间是秒或是毫秒的数据访问,可以考虑使用HBase。[/color]
[*]大量的小文件: 如果NameNode的内存为16GB的话,大概只能存放480万个文件。
[*]多用户写入,任意修改文件: HDFS中的文件只能有一个写入者。不支持多个写入者。
[/list]
HDFS架构
[u]SecondaryNameNode -- NameNode -(1:n)- DataNode -(1:n) Block[/u]
SecondaryNameNode -- NameNode -(1:n)- HDFS客户端

[b]所有的数据均存放在运行DataNode进程的节点的块(block)里。[/b]

[color=blue]1. 块(block)[/color]
如果HDFS的块大小没有经过配置,默认为64MB(如此大的原因是为了最小化寻址开销)。与其它文件系统不同的是,HDFS小于一个块大小的文件不会占据整个块的空间。

比如一个大小为150MB的文件,存放到HDFS中,block1 = 64MB,block2=64MB,block3=22MB。

hdfs-site.xml配置文件中,dfs.replication: 表示每个HDFS的block在Hadoop集群中保存的份数,值越高,冗余性越好(就是备份数越多)。

块的设计实际上就是对文件进行分片,从而使文件可以保存在集群的任意节点上,从而使文件存储跨越了磁盘甚至机器的限制。

NameNode是HDFS的大脑,它维护着整个文件系统的目录树,以及目录树里所有的文件和目录。

NodeNode中的[b]FSImage[/b]文件是文件系统元数据的一个永久性检查点。另一种是编辑日志([b]edit log[/b])。
DataNode: 数据节点,它在NameNode的指导下完成I/O任务。
HDFS客户端: 如命令行接口、Java API、Thrift接口、C语言库、用户空间文件系统等。

[b]如何访问HDFS[/b]
1. 以shell命令的形式访问本地文件系统,如hadoop dfs -ls /
2. Java API:
Hadoop是由Java编写的,所以通过Java API可以调用所有的HDFS的交互操作接口。
代码示例:
[list]
[*]读取文件
[*]写入文件
[*]创建HDFS目录
[*]删除HDFS上的文件或目录
[*]查看文件
[*]列出目录下的文件或目录名称
[*]文件存储的位置信息
[*]写入SequenceFile
[*]读取SequenceFile
[/list]
3. Web UI: 通过Namenode的50070端口号访问HDFS,如本地的[url]http://localhost:50070/[/url]

[color=blue]NameNode HA(High Availability)架构[/color]: 解决了一代Hadoop的NameNode的单点故障,[u]是目前生产环境必备的功能。[/u]该架构其实是将单点故障转移到了共享存储。

NameNode Federation: 解决NameNode的扩展性、隔离性,以及单个NameNode性能方面的问题。当集群规模在1000台以下时,几乎是不需要NameNode Federation的。
(Federation的意思是联邦)

HDFS snapshots

[color=blue][b]【第4章】YARN: 统一资源管理和调度平台[/b][/color]
YARN: 统一资源管理和调度平台。YARN脱胎于MRv1,并克服了MRv1的种种不足。

整个Hadoop是以YARN为中心的,计算框架都是可插拔的。而MapReduce(v2)失去了所有资源管理的功能,进而退化为单一的计算框 架,并且所有的计算框架都可以共享底层的数据。

目前的资源管理和调度平台:
[list]
[*]集中式调度器(monolithic scheduler): 全局只运行一个中央调度器。如MRv1的JobTracker,目前已经被淘汰。
[*][color=blue]双层调度器(two-level scheduler)[/color]: 将整个调度工作划分为两层: 中央调度器和框架调度器。目前的主流调度器,具体的实现如: Apache YARN,Apache Mesos。
[*]状态共享调度器(shared-state scheduler): 该框架还不太成熟,具体提出者: Google的Omega调度系统。
[/list]
YARN的架构
(官网上有图片,讲的也不错: [url]https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/YARN.html[/url])
双层调度范型中,ResourceManager属于中央调度器(一级),而ApplicationMaster属于二级调度器。

1. ResourceManager的主要职责是资源调度,当多个作业同时提交时,它在多个竞争的作业之间权衡优先级并进行仲裁资源。

访问ResourceManagerUI: 8088端口,如单个节点的YARN就是: [url]http://localhost:8088[/url]

2. NodeManager
是YARN集群中单个节点的代理,和理YARN集群中的单个计算节点。包括与ResourceManager同步,管理Container生命周期(核心功能)等。

3. ApplicationMaster
生命周期随着应用的开始而开始,结束而结束。它的启动是由ResourceManager完成的。[u]当作业被提交后,ResourceManager会在集群中任选一个Container,启动作为ApplicationMaster。[/u]

4. Container
YARN的Container模型,对不同计算框架都是无差别对待的,即Container中完全没有计算框架的逻辑,非常简洁和干净。

YARN的工作流程,略

YARN调度器的不同实现: FIFO Scheduler,Fair Scheduler,Fair Scheduler,Capacity Scheduler等。[color=blue]资源调度器是YARN中最核心的组件之一[/color],并且是可插拔的,用户可以根据它的一整套接口,编写自己的Scheduler,实现自己所需的调度逻辑(第一层调度逻辑)。

YARN命令行: yarn version等

[b]介绍Apache Mesos: [/b] 和Spark一样,是加州伯克利大学AMP实验室出品,对Spark支持的很好。

[color=blue][b]Apache Mesos VS Apache YARN:[/b][/color]
虽然都是双层调度,而且YARN和Mesos有很多相同的地方,如调度模型、主从可用性、资源隔离,但是它们也有一些不同之处,如二级调度器实现等,不过它们之间最大的不同是设计目标有一些差别。YARN和Hadoop结合的非常紧密,使得它非常适合处理大数据作业(如MR,Spark,Storm),但是YARN对其它长服务类型的作业(如Web Service)却支持得较差,需要通过Apache Slider(一个孵化器项目,旨在让不同应用运行在YARN上)。而Mesos在设计之初就是面向整个数据中心的,而不单单是大数据处理平台,它可以支持各种各样的计算服务框架,包括数据库服务,Web Service等,从这方向来说,Mesos的愿景比YARN还要大。

[color=blue][b]【第5章】分而治之的智慧: MapReduce[/b][/color]
MapReduce介绍: 将一个数据处理过程拆分为主要的[color=blue]Map(映射)和Reduce(化简)两步[/color]。这样,即使用户不懂分布式计算框架的内部运行机制,[u]只要能用Map和Reduce的思想描述清楚要处理的问题,即编写map和reduce函数[/u],就能轻松地使问题的计算实现分布式,并在Hadoop上运行。

MapReduce的编程思想:
(input) -> map -> -> combine -> -> reduce -> (output)

要理解MapReduce的编程思想,[u]其核心的一点就是将数据用键值对表示[/u]。在现实生活中,很多数据要么本身就是键值对的形式,要么可以用键值对这种方式来表示,例如电话号码和通话记录,文件名和文件存储的数据等,键值对并不是很高端数据挖掘独有的数据模型,而是存在于我们身边非常普通的模式。

MapReduce运行环境
因为采用了YARN来进行统一资源管理和调用,所以新一代的MapReduce的运行环境可以说就是YARN。

MapReduce的局限性:
1. MapReduce的执行速度慢。
2. MapReduce过于底层,与SQL相比,MapReduce显得过于底层。
3. 不是所有算法都能用MapReduce实现。

Example1: Word Count V1.0
官网上的参考: [url]http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Example:_WordCount_v1.0[/url]

MapReduce的过程:
一个MapReduce作业经过了input、map、combine、reduce和output五个阶段。

MapReduce的工作机制。

MapReduce编程:
旧的API: org.apache.hadoop.mapred
新的API: org.apache.hadoop.mapreduce

[b]1. Writable接口[/b]: Hadoop序列化
实现的类有很多,如BooleanWritable, ByteWritable, IntWritable等,也能自己手动实现Writable类。
[b]2. Mapper类[/b]: 作为map函数的执行者,Mapper类对于整个MapReduce作业有着很重要的作用。编写自己的Mapper类需要继承org.apache.hadoop.mapreduce.Mapper类。
方法: setup(), map(), cleanup(), run()
[b]3. Reduce类[/b]: 编写自己的Recude类需要继承org.apache.hadoop.mapreduce.Reduce类。
方法同Mapper类。
[b]4. 控制shuffle[/b]: shuffle的工作主要是将中间结果分发到Reducer上。
[b]5. 控制sort[/b]
[b]6. 编写Main函数[/b]: 代码略,可以看官网的word countV1.0
Configuration类代表了作业的配置,该类会加载mapred-site.xml、hdfs-site、core-site.xml、yarn-site.xml,而Job类代表了一个作业。

总结
[color=blue]在学习MapReduce时,对于过程和工作机制要深入理解,这样在调优时才更有针对性。MapReduce编程不是大数据处理的重点,难点在于优化。[/color]

[color=blue][b]【第6章】SQL on Hadoop: Hive[/b][/color]
Hadoop最常用的工具——Hive。

Hive是由Facebook开发的海量数据查询工具,目前已经捐献给Apache软件基金会,是Apache的顶级项目。

[color=blue]在实际开发中,80%的操作都不会由MapReduce程序直接完成,而是由Hive来完成,所以说Hive本身实践性非常强,具体使用频率非常高,它没有高深的原理,只需要用户对SQL熟练即可。掌握Hive对于使用Hadoop来说非常重要。[/color]

Hive可以说是HiveQL(SQL)到MapReduce的映射器: HiveQL ————>(Hive)————>MapReduce;

顺带提: Hadoop生态圈里还有一个叫Pig的组件,作用类似Hive: Pig Latin ————>(Pig)————> MapReduce;(相对来说Pin Latin更加灵活但学习成本更高。)

Pig Latin和HiveQL都是对MapReduce进行了一种封装,使用户不必直接编写MapReduce程序,所以它们可以说是Hadoop的“高级语言”。

访问Hive:
[list]
[*]CLI(命令行接口),这种方式比较常见。
[*]HWI(Hive网络界面)
[*]Thrift Server(JDBC、ODBC)
[/list]
Hive架构:
Hive不是分布式的,独立于集群之外,可以看做是一个Hadoop的客户端。
Hive通过与YARN通信来初始化MapReduce作业,所以Hive并不需要部署在YARN节点上,通常在大型的生产环境集群,Hive被独立部署在集群之外的节点。

[b]Metastore[/b]是Hive的元数据的集中存放地(表名,列名,字段名等)。包括两个部分,元数据服务和元数据存储。

Metastore三种安装方式:
[list]
[*]内嵌模式;
[*]本地模式;(推荐)
[*]远程模式;(推荐)
[/list]
[b]Hive与关系型数据库(RBDMS)的区别:[/b]
[table]
||Hive|RMDBS|
|查询语言|HQL|SQL|
|数据存储位置|HDFS|Raw Device或者Local FS|
|数据格式|用户定义|系统决定|
|数据更新|[u][b]无[/b][/u]|有|
|执行|MapReduce|Executor|
|执行延迟|高|低|
|可扩展性|高|低|
|数据规模|大|小|
|支持事务|[u][b]不支持[/b][/u]|支持|
[/table]
Hive数据类型:
[list]
[*]基本数据类型: TINYINT, INT, STRING等8种。
[*]复杂数据类型: STRUCT, MAP, ARRAY
[/list]
Hive存储格式
[list]
[*]TEXTFILE: 默认格式,即文件格式,CSV\TSV。
[*]SEQUENCEFILE: 二进制格式。
[*]RCFILE: 行列存储相结合的存储。(优点较明显)
[*]PARQUET: 面向分析型业务的列式存储格式。
[/list]
HQL语法介绍:
数据库、数据表的操作。
数据的插入、导出。
数据查询:select from/where/group having/join/order by/sorted by/...等

Hive函数: 系统标准函数、自定义函数。

[color=blue][b]【第7章】SQL to Hadoop: Sqoop[/b][/color]
Sqoop是Apache顶级项目,主要用来在Hadoop和关系型数据库中传递数据。使用Sqoop我们可以方便地将数据从关系型数据库导入HDFS,或者将数据从HDFS导出到关系型数据库。(双向)。

Sqoop和Hive一样,都属于Hadoop的客户端,Sqoop作为一种高效的数据导入导出手段在大数据平台,得到了广泛的使用。

导入过程
Sqoop是通过MapReduce作业进行导入工作。
Sqoop命令: 将数据从数据库——>导入HDFS
Sqoop命令: 将数据库数据库——> HDFS——>Hive

导出则反之。

Sqoop的本质还是一个命令行工具。

[color=blue][b]【第8章】HBase: Hadoop Database[/b][/color]
[color=blue]NoSQL并不意味着排斥SQL技术,相反,它意味着Not Only SQL,代表的是对SQL技术的有益补充。[/color]

[color=blue]CAP定理是由Eric Brewer在2000年首次提出,表明任何分布式数据系统最多只能满足C(consistency,一致性)、A(availability,可用性)、P(partition tolerance,分区容错性)三个特性中的两个,不可能三个同时满足。[/color]

CA: RDBMS(关系型数据库)
CP: MongoDB, HBase, Redis
AP: Couch DB, Cassandra, DynanoDB, Riak

在目前的分布式系统中,分区容错性是很难绕开的,所以只能在C和A之间做选择。

NoSQ的构构模式:
1. 键值存储(Redis)
2. 图存储(Bigdata)
3. 列族存储(如HBase, Cassandra)
4. 文档存储(如MongoDB, CounchDB)

HMaster可以认为是HBase的管理节点,它不存在单点故障,通过Zookeeper选举机制保证总有一个HMaster节点正在运行。主要负责Table和Region的管理。

RegionServer -- (1:n) --> Region(可以认为是分片)-- (1:n) --> Store -- (1:n) --> StoreFile

Zookeeper
HBase使用Zookeeper作为其博同服务组件,其主要功能包括跟综RegionServer,保存根region地址。

[u]HBase最好的查询数据方式是用行键加列名去定位某个值(单元格)。[/u]

HBase基础API:
JAVA代码: 创建表、插入、读取、扫描、删除单元格、删除表等。

你可能感兴趣的:(大数据,java,数据库)