看到的比较全面的介绍
Hadoop 1.0 和 2.0的区别
软件栈如下图:
Hadoop 1.0的内核主要由两部分构成:
HDFS
存储大数据的平台,提供可靠性的存储服务(冗余数据,存储)。
MapReduce
构建在HDFS之上的分布式计算框架(计算、数据处理)。
Hadoop 2.0主要构成如下:
HDFS
存储大数据的平台,提供可靠性的存储服务(冗余数据,存储)。
YARN
集群资源管理框架(构建在HDFS之上)。负责管理集群的资源,类似于操作系统。操作系统只是管理单个机器的资源,并提供一些软硬件的抽象。而YARN主要管理一个集群,对集群里的所有硬件资源进行统一的抽象,为计算软件(MR、Other)提供一个统一的接口。
MapReduce
分布式计算框架(计算、数据处理)。
Other
运行在Yarn之上的其他的数据处理框架,包括Spark、Storm(流式计算框架)。
Hadoop 2.0 的内核
像其他开源软件一样,Hadoop也有自己的内核,在这个内核的基础上,很多公司做了自己的发行版。
Hadoop 2.0的内核由以下三部分构成:
HDFS
分布式存储系统(Hadoop Distributed File System)。提供了高可靠性、高扩展性和高吞吐率的数据存储服务。
YARN
资源管理系统(Yet Another Rsource Negotiator)。负责集群资源的统一管理和调度系统。它可以对集群里所有的硬件资源(CPU,内存)进行统一的抽象,以便于其他在Yarn之上的框架(MR,Spark)来使用。
MapReduce
分布式计算框架。具有易于编程、高容错性和高扩展性等优点 。
如下图:
Hadoop的构成 —— HDFS (分布式文件系统、日志存储系统)
源自于Google的GFS论文(介绍了谷歌内部的分布式文件系统的设计、架构及关键技术点的设计方案),该论文发表于2003年10月。 HDFS是GFS的克隆版(2004年)。
HDFS的特点:
良好的扩展性
例如集群目前的存储能力不够了(磁盘满了),可以购买一些廉价的机器增加到Hadoop集群中(横向扩展),来达到存储扩展的目的。同时可以根据HDFS提供的一些工具,将已有的数据进行重新分布,均匀地分不到新增的机器节点中。
高容错性
比如,集群中一个或多个节点挂了,HDFS能保证数据不丢失。因为HDFS内部会把数据存储多份(通过数据冗余实现)。
适合PB级以上海量数据的存储
HDFS基本原理:
将文件(如1G,2G)切分成等大的数据块(64M,128M),存储到多台机器上,冗余存储(一个数据块存储多份)
将数据切分、容错、负载均衡等功能透明化。例如:用户使用命令将一个文件上传到HDFS,该文件完好地存储在了HDFS上,但是数据切分、容错、负载等过程用户是看不到的。HDFS把这些复杂的功能给抽象了,用户感知不到,这也是HDFS非常好用的原因之一。
可将HDFS看成一个容量巨大、具有高容错性的磁盘
HDFS应用场景:
海量数据的可靠性存储。例如:网页、视频数据等都可以存储在HDFS上。
数据归档。例如:每天产生的监控视频数据,传统解决方案是保存在磁带上(廉价),由于硬盘价格逐渐降低,可以将监控视频数据保存在磁盘上。
HDFS架构的概述(Hadoop 2.0 HA实现方式)
整体上说,HDFS是master/slave结构。master称为NameNode(简称NN),NN有两个(Active/Standby),以防止出现单点故障(HA,高可用)。当Active NN(主)挂掉后,Hadoop可以迅速地切换到Standby NN(备用),保证了数据不丢失,同时不中断的继续提供对外服务。
slave称为DataNode(简称DN),可以有多个DN来存储实际的数据。NN是存储"元数据"(如:HDFS存储了哪些文件,这些文件分别存储在哪个DN上,这些映射关系/数据位置信息是存储在NN上)。
另外,为了协调Active 和 Standby NN之间在发生故障期间进行"热切换",还有一些辅助的工具,例如Zookeeper集群。
Zookeeper可以管理Active 和 Standby NN服务,保证Active NN挂了之后,能够迅速、可靠、透明地切换到Standby NN服务。同时Active 和 Standby NN之间通过一个共享存储服务(NFS,QJM),来同步"元数据"信息。
Hadoop的构成 —— YARN (资源管理系统) YARN是什么?
Hadoop 2.0新增的系统
负责集群的资源管理和统一调度
YRAN的引入,使得多种计算框架(MR,Spark,Storm)可以运行在一个集群中。 例如:在没有Yarn之前的Hadoop 1.0中,只有一个可用的计算框架MapReduce,后来又引入了很多除了MR之外的计算框架(Spark,Storm等),这样一来要给每一个计算框架搭建一个独立的集群,管理起来很不方便。另外多个集群之间的资源利用率可能在不同的时间是不一致的,如MR在某一时刻使用的资源是非常紧张的,甚至很多读写都要排队,同时另一个Spark集群非常空闲,但是你无法将Spark空闲的资源(CPU,内存)共享给MapReduce,因为这是静态分配好的,没有一个协调服务的系统。 直到Hadoop 2.0引入了YARN之后,可以很好的解决这个问题。
YARN的特点
良好的扩展性、高可用性。
对多种类型的应用程序(MR、Spark)进行统一管理和调度。
自带了多种多用户调度器,适合共享集群管理。 调度器非常重要,它可以把集群里的资源划分成多个队列,不同队列里的资源可以供不同的业务/部门来使用。例如调度器创建一个队列,该队列包含了集群10%的资源,把这10%资源分给了研发部门的爬虫组,另外20%资源给其他组等等。你可以对这些资源进行分配和管理。
引入YARN的原因
如果在Hadoop集群比较空闲的时候,希望把这些空闲的资源分配给Spark,这样一来,整个集群的资源利用率会更高。反正,搭建三个集群,集群整体的资源利用率反而不高(例如三个集群都是装在多台相同的机器上,每个集群的资源都是静态/固定分配好的)。 如果把三个集群合并成一个集群,让一个集群上层的资源管理工具对三种类型的应用程序进行统一的管理和调度,这样的话,资源的利用率趋近于100%,有利于集群资源利用率的提高,同时便于集群的管理(管理一个大集群比管理三个小集群更容易)。
YARN的架构
构建在YARN之上的计算框架
MapReduce
批处理/离线计算框架,性能低,高吞吐
Tez
交互式/DAG(有向无环图)计算框架,也是批处理
HBase
Storm、S4...
流式计算框架
Giraph
图计算框架
Spark
内存计算框架
MPI
并行计算框架
Hadoop、Spark、MPI三种计算框架的特点以及分别适用的场景
Hadoop
指的是MapReduce(二代称Yarn)计算框架。 Hadoop是一种分布式系统基础架构(可基于普通PC集群进行分布式存储和分布式计算的工具)。它是离线计算,基于磁盘,每次运算之后的结果需要存储在HDFS里面,下次再用的话,还需要读出来进行一次计算,磁盘IO开销比较大。底层基于HDFS存储文件系统。并且Hadoop只有Map和Reduce两种处理接口,相对于Spark来说太少了。 Hadoop主要建立在MapReduce引擎,将算法转化为Map和Reduce两种不同的操作对数据进行分布式处理。目前而言,Hadoop是最为稳定的工业级的分布式存储与处理平台,但是由于分布式运算的中间结果都会保存在磁盘中,运算速度比较慢。 Hadoop采用HDFS作为分布文件存储,有效的解决了分布式平台下文件分割问题;MapReduce算法框架,为并行计算提供了可能。Hadoop是大数据时代应运而生的产物,因此能够处理海量数据。虽然Hadoop计算能力强大,但是Hadoop启动速度慢,因此适用于离线处理。 Hadoop计算框架(特指MapReduce)的特点是可以通过集群分布式处理超大规模数据,磁盘计算,稳定性高;适用于处理海量数据的程序,开始要求高可靠、高扩展、高效、低容错、低成本的场景,即Hadoop用于海量数据对实时要求又不是特别高的场景,例如:离线获得统计报表,服务器的日志分析,网站KPI的分析。
Spark
一种可以基于内存,迭代的计算框架。基于内存的分布式计算工具,可搭建在Hadoop 2.x、Standalone。 Spark是In-Memory的分布式系统,能很好地管理内存资源,通过RDD的构建,将数据放在内存中进行计算。 Spark里面的一个核心的概念就是RDD,弹性分布式数据集。Spark支持内存计算模型,用户可以指定存储的策略,当内存不够的时候,可以放置到磁盘上。并且Spark提供了一组RDD的接口,Transformations和Action。Transformations是把一个RDD转换成为另一个RDD以便形成Lineage血统链,这样当数据发生错误的时候可以快速的依靠这种继承关系恢复数据。Action操作是启动一个Job并开始真正的进行一些计算并把返回的结果可以给Driver或者是缓存在worker里面。 Spark本质上并不依赖于YARN,它其实是一个可以与MapReducer媲美的计算框架,是一套快速出色、可扩展、能力惊人且极具灵活性的开源分布式计算平台;适用于一切需分布式的场景,特别对于流计算处理很棒。 Spark的特点是运算速度高于Hadoop,直接支持内存数据处理,因此可以实时处理流数据,但是就是由于内存的限制使得Spark处理数据规模远小于Hadoop适合数据过于繁杂,并且需要让计算通过迭代,并在内存中,极大地提高效率的场景,多次迭代等复杂的数据挖掘算法实现(计算模型),例如各种机器学习算法。 Spark应用于并行处理、实时计算、计算性能要求极高(实时要求高)的场景,如网络安全的实时监控、电商网站的实时推荐系统。 根据两者特点,可以依不同的时间要求选择Hadoop与Spark。对于实时性要求高的例如数据流的计算,可以选择Spark。 对于稳定性要求高的,离线批处理计算等任务可以选择Hadoop计算框架。
MPI
MPI(Message Passing Interface)是一种被广泛采用的消息传递标准/接口(编程模型),基于消息传递的并行编程技术,可以理解为是更原生的一种分布式模型(并行编程)。 MPI多主机联网进行协同并行计算的工具,可基于个人电脑也可使用Top10的超级计算机。 MPI适用于数据量小的处理场景,并行计算平台需要在集群上很好地应用的场景。
Hadoop、Spark的作业的对比
Hadoop
Hadoop中的作业,一段编好能运行的程序被称为MapReduce程序,也就是一个Job,每个Job下还能有若干个Task,可区分为MapTask和ReduceTask。
Spark
在Spark中,作业有很复杂的层级划分: Application —— 用户在Spark上部署的程序,由集群上的驱动程序(Driver)和执行器(Execute)组成。 Task —— 被发送到一个执行器的工作单元 Job —— 由一个或多个Spark action引起的反应task组成的并行计算的单元。 Stage —— 每个Job可以被划分成多个task的集合,称为stage(阶段),它们之间互相关联。 一个Application和一个SparkContext相关联,每个Application中可以有一个或多个Job,可以并行或者串行运行Job。Spark中的一个Action可以触发一个Job的运行。在Job里面又包含了多个Stage,Stage是以Shuffle进行划分的。在Stage中又包含了多个Task,多个Task构成了Task Set。
Hadoop的构成 —— MapReduce(分布式并行计算框架,离线日志分析系统)
源自于Google的MapReduce论文(了解MR最原始的设计动机和架构)
0.20前使用 org.apache.hadoop.mapred 旧接口,0.20版本开始引入org.apache.hadoop.mapreduce的新API。
MapReduce的特点
良好的扩展性。即如果发现MapReduce集群的计算能力不能满足要求了(发现MR集群上的队列都在排队,等待被分配或被调度时),说明集群的资源已经变得紧张了,这时就可以对集群中的资源进行线性扩展。
高容错性。 如果一个计算任务在某个节点失败了,可能是节点挂了或网络部通畅导致的,这时MapReduce可以把失败的Task重新调度到另外的节点上重新执行,这样一来保证了不会因为某个节点挂了导致作业运行失败。
适合PB级以上海量数据的离线处理。性能低,但吞吐率高。
MapReduce架构
MapReduce架构主要由master和worker构成。当用户提交程序后,按程序的输入数据量进行切分(如输入1G数据,把1G数据切分成不同的Split),每个Split交给一个MapTask处理(worker);当每个MapTask处理完数据之后,把数据(中间结果)写入本地磁盘,然后启动一些ReduceTask, 这些ReduceTask从每个MapTask上读取一片数据(中间结果)进行处理,当ReduceTask处理完后会将结果写入分布式文件系统中(HDFS)。
MapReduce流程
如上图,有3个节点(Node),在单个节点上可能启动多个Map任务(map线程),当这些map线程处理并写完中间数据之后,在同一个节点上会启动多个Reduce,每个Reduce会从每个Map读取一片数据来进行处理,当Reduce处理完之后会把数据写入HDFS。其中Map产生的中间数据会写入本地磁盘,Reduce产生的数据写入HDFS。这就是一个简单分布式的执行过程,充分利用多个节点的计算资源来并行的同时计算,当计算完成后,再把数据写入到一个大的分布式文件系统中(HDFS),以提供进一步的分析、展示或数据挖掘等。
MapReduce例子——WordCount(单词计数)
Map阶段:将输入数据切分成很多数据块(Split过程,如按行切分),对于每一个数据块,都会有一个进程来统计数据块中单词出现的频率(Map任务),统计完成后会将结果写入所在节点的本地磁盘中(在写入时,会对每一个单词进行HashMap,hash等于0的放同一个文件,hash等于1的放另外一个文件,即单词/hash相同的会写入到同一个分片中)。 Reduce阶段:在Map阶段中单词可能重复出现在不同的数据块中,如果想要获取最终结果,需要在Reduce阶段中进行归约,把Map结果中相同的单词传给同一个组件,然后进行统计(Reduce任务),统计完成后再写入HDFS (Map阶段写入中间结果时会对每个单词进行hash,当hash值相同为0的写入一个文件,Reduce编号为0的会去获取Map编号为0的数据进行统计,Map编号为0表示的是Hash值相同的单词)。
Hadoop生态系统概述
构建在Hadoop内核(HDFS、MapReduce、YARN)之上的软件有哪些?
Hadoop 1.0时代的"软件栈"
Hive
兼容传统SQL语法
Pig
流式计算引擎
Mahout
机器学习。实现了一些常见的数据挖掘算法,如推荐算法、聚类算法、分类算法等。
Oozie
对Hive、Pig、MapReduce作业进行统一管理和调度(构建在Hive、Pig、Mahout之上)。 例如:让某个作业5分钟执行一次,可以使用Oozie来触发这个调度。 另外不同的作业之间可能存在依赖关系,例如为了实现某个数据的处理,可能先做了Hive作业,处理后再交给MapReduce作业进行后续的处理,最后再交给Pig作业,这些作业之间有依赖关系,希望按照这些依赖关系来执行作业,就可以使用Oozie来识别这些作业的依赖关系,由Oozie来触发这些作业的调度。
HBase
构建在HDFS之上的分布式数据库。
Flume、Sqoop
数据收集工具。通过这两个软件,可以把Web数据、传统关系型数据库中的数据、网站产生的日志数据等导入到HDFS或者是HBase中,让构建在Hadoop内核之上的系统进行统一的分析和处理。
Ambari
Hadoop1.0生态系统中的多个软件自己一个个安装很麻烦,可以使用Ambari工具来对这些软件进行统一安装和部署。
Hadoop 2.0时代的"软件栈"
Hadoop生态系统 —— Apache Hive(数据仓库工具,离线日志分析)
基于MapReduce的数据仓库(构建在Hadoop之上)。它可以将结构化的数据文件映射为一张数据库表,通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。 由Facebook开源,用于解决海量结构化的日志数据统计问题(实际上是一个ETL工具,即数据提取、转换和加载)。数据计算使用MapReduce,数据存储使用HDFS。 为什么引入Hive?因为传统数据库管理员不想直接使用MR API来编写MR程序(MR程序写起来比较麻烦),但是对于SQL很熟悉,能否将SQL转化成MapReduce。Hive定义了一种类SQL查询语句——HQL(类似SQL,但不完全相同)。 Hive通常用于进行离线数据处理(采用MapReduce),不可用于交互式数据分析。例如处理1T数据,在一秒内返回结果,Hive是做不到的。Hive是分布式执行过程,可能需要几分钟的时间才返回结果。 Hive通常用于日志分析(统计网站数据一个时间段内的页面浏览/点击量pv、访问某个站点或点击某条新闻的不同IP地址的人数uv)、多维度数据分析、海量结构化数据离线分析、低成本进行数据挖掘/分析(不直接编写MR程序)。 可以认为Hive是一个 HQL和MapReduce 的语言翻译器。可以直接写HQL语句(不用写MR程序),Hive会将HQL语句转化成MapReduce程序。
Hive的系统架构
Hive底层是一个Hadoop集群,用HDFS作为数据仓库进行存储,用MapReduce进行计算。。 Driver:映射驱动器、解析器,可以将编写的HQL语句转化/解析成Hadoop系统可识别的一系列MepReduce作业/任务,提交到Hadoop集群(将HQL经过编译、优化、执行后,再转化为MapReduce作业)。 Metastore: 元数据库,存储Hive表和HDFS文件以及字段映射等元数据信息,通常是存储在关系数据库如mysql、derby中。
Hive(HQL)实现WordCount:
SELECT word,COUNT(*) FROM doc LATERA VIEW explode(split(test,' ')) lTable as word GROUP BY word;
查询doc表,对每一行进行分割(split(test,' ')),分割后的单词进行分组,然后统计每一个单词出现的频率,最后输出。
Hive官网:http://hive.apache.org/
Hadoop生态系统 —— Apache Pig(大数据分析平台,离线日志分析)
由Yahoo开源,设计动机是提供一种基于MapReduce的ad-hoc(点对点)数据分析工具,构建在Hadoop之上的数据仓库(类似Hive)。 Pig是一个基于Hadoop的大规模数据分析工具,为用户提供多种接口。它提供的SQL-LIKE语言叫Pig Latin(一种数据流语言),该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。通常用于进行离线分析。
Pig语言实现WordCount:
1、加载数据
input = load '/input/data' as (line:chararray); 先将/input/data目录下的数据加载到input变量中
2、分词:将字符串分割成单词
words = foreach input generate flatten(TOKENIZE(line)) as word; 在input变量之上对每一行字符串进行分词(分割),分词完成后保存在words变量中
3、分组:对单词进行分组
grpd = group words by word;
4、统计每组中单词数量
cntd = foreach grpd generate group, COUNT(words);
5、打印结果
dunmp cntd;
先读取文档中的所有数据(一行行加载),读取完毕后要进行分割单词(按行分割),分词后做一个Map一样的数据结构,把每个词放在一个桶里面(分组),然后对每个桶里面的单词进行统计,最后输出。
Pig 与 Hive的对比
Pig官网:http://pig.apache.org/
Hive中Order by和Sort by的区别是什么:http://www.crazyant.net/1456.html
Hadoop生态系统 —— Apache Mahout
ASF开源项目,基于Hadoop的机器学习和数据挖掘的一个分布式计算框架库(数据挖掘库)。Mahout用MapReduce实现了部分数据挖掘算法,解决了并行挖掘的问题,提供一些可扩展的机器学习领域经典算法的实现。Mahout包含聚类、分类、推荐过滤、频繁子项挖掘等算法实现。
Mahout实现了一些常见的三大类数据挖掘算法,包括:推荐(Recommendation)、聚类(Clustering)、分类(Classification)算法。
Mahout官网:http://mahout.apache.org/
Mahout算法集:http://blog.csdn.net/it_man/article/details/14055757
Hadoop生态系统 —— Apache HBase(分布式NoSQL列数据库,日志存储系统)
源自Google的Bigtable论文(一个结构化数据的分布式存储系统,发表于2006年11月)。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力(HBase是Google Bigtable克隆版)。
HBase是一个具有高可靠性(高可用)、高性能、面向列、良好的扩展性(可伸缩)等特点的分布式存储系统(开源数据库),利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
HBase不同于一般的关系型数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
HBase的数据模型与RDBMS(传统关系型数据库)是不一样的,HBase也有"表"的概念,每个表了有多个"行(Row)",每一行实际上都可以处于不同的"Column famlly(列簇)",每一行有多个"列",可以把这些列组装成不同的Column famlly,以便于管理。
Column famlly(列簇)是不同于传统关系型数据库的一个概念,即每一行可以有多个列,这些列可以处于不同的Column famlly中。
每一行的Key称为"Row Key",类似于主键的功能,它可以唯一标识/定位每一行。
每一行有多个列,多个列之间可以位于不同的Column famlly中,例如多个Column famlly为"contents"、"anchor",contents和anchor分别有多个列,可以通过某一行、某一列定位到一个"cell(单元)"。
HBase中通过row(行)和columns(列)确定的为一个存贮单元,称为"cell"。每个cell都保存着同一份数据的多个版本(HBase不会覆盖掉同一个"Row Key"中同一列的某一个数据,传统关系型数据库可能就覆盖掉了)。版本通过时间戳(Timestamp)来索引(HBase会增加一个时间戳,同一个单元Cell中会存储不同的不同版本、时间戳的数据,不会把之前的数据覆盖)。
HBase中的数据是根据"Row Key"进行排序的,非常有利于定位、查找数据。
HBase是一个支持随机读写的分布式系统,可以根据一个key获取对应的value值。可用于存储网站与网站更新频率等信息,以便能够根据网站快速获取它的更新频率信息;网页去重功能。
HBase数据模型
HBase相关概念
Table
表,类似于传统关系型数据库(RDBMS)中的表
Column Family
列簇,Table在水平方向由一个或多个Column Family组成,一个Column Family中可以由任意多个Column(列)组成。
Row Key
行键,Table的主键,唯一标识每一行,Table中的记录按照Row Key排序。每个Row Key中有多个列(Column),这些列会被组装成多个Column Family。通过某一行(row)和某一列(column)用于定位到一个cell(存储单元),在cell中还有一个"时间戳"概念。
Cell
通过row(行)和columns(列)确定的为一个存贮单元,即通过某一行(row)和某一列(column)用于定位到一个cell。在cell中还有一个"时间戳"概念。
Timestamp
时间戳,每一行数据均对应一个时间戳,即版本号。每个cell中可以存储不同时间戳(版本号)的数据,可以设置最大的版本号,例如设置最多可以存储三个版本(即cell只能存储最新的三份数据)。
HBase系统架构图(master/slave结构)
Region server是实际存储数据,Master可以有多个,Zookeeper用于对多个Master进行协调。 Master和Region server之间通过Zookeeper进行通信,不会直接通信。这样的话,当Master挂掉之后,还可以通过Zookeeper来访问Region server中的数据,避免了Master挂掉后整个HBase集群就不可用了。
HBase(列式) 与 RDBMS(传统行式) 数据库的区别
HBase(列式) 与 RDBMS(传统行式) 数据库的对比
HBase中为什么要有Column Family(列簇)?
HBase本身的设计目标是支持稀疏表,而稀疏表通常会有很多列,但是每一行有值的列又比较少。
如果不使用Column Family的概念,那么有两种设计方案:
1、把所有列的数据放在一个文件中(也就是传统的按行存储)。那么当我们想要访问少数几个列的数据时,需要遍历每一行,读取整个表的数据,这样子是很低效的。
2、把每个列的数据单独分开存在一个文件中(按列存储)。那么当我们想要访问少数几个列的数据时,只需要读取对应的文件,不用读取整个表的数据,读取效率很高。然而,由于稀疏表通常会有很多列,这会导致文件数量特别多,这本身会影响文件系统的效率。
而Column Family的提出就是为了在上面两种方案中做一个折中。HBase中将一个Column Family中的列存在一起,而不同Column Family的数据则分开。 由于在HBase中Column Family的数量通常很小,同时HBase建议把经常一起访问的比较类似的列放在同一个Column Family中,这样就可以在访问少数几个列时,只读取尽量少的数据。
HBase官网:http://hbase.apache.org/
HBase 学习梳理(吴超):http://www.superwu.cn/?p=1443
HBase中Cloumn Family的设计规则:http://my.oschina.net/hanzhankang/blog/199969
用Column Family作为索引:http://blog.csdn.net/zhangzhaokun/article/details/7098941
Hadoop生态系统 —— Apache Zookeeper(分布式协作服务)
源自于Google的Chubby论文(发表于2006年11月)。
由Facebook贡献,Zookeeper是一个为分布式应用所设计的分布的、开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。
主要解决分布式环境下数据管理问题:统一命名、状态同步、集群管理、配置同步 。
HDFS使用Zookeeper来解决主/备NamaNode之间进行切换的问题,YARN使用Zookeeper来解决主/备ResourceManager切换问题,HBase也是通过Zookeeper来对Master和Region server之间进行解耦,Storm、Flume、Dubbo(阿里巴巴开源的一个系统) 和 Metaq(阿里巴巴开源的消息队列)都使用到了Zookeeper。
Zookeeper官网:http://zookeeper.apache.org/
Hadoop生态系统 —— Apache Sqoop(数据同步工具)连接Hadoop与传统数据库(RDBMS)之间的桥梁,Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(MySQL, Oracle, Postgres, DB2等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
用于在HADOOP(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
Sqoop是插拔式,用户可根据需要支持新的数据库。
Sqoop本质上是一个MapReduce程序。充分利用了MR分布式并行的特点 和 容错性。
Sqoop 1体系结构
通过一个命令行工具将命令提交给Sqoop,Sqoop会启动一个MapReduce作业(只有map),里面会启动大量的Map Task将关系型数据库中的数据并行地导入到HDFS, 或者从HDFS并行地导入到关系型数据库中.
Sqoop 2体系结构
从架构、优缺点等方面比较Sqoop1和Sqoop2
架构上,Sqoop1使用MapOnly作业进行Hadoop(HDFS/HBase/Hive)同关系数据库进行数据的导入导出,用户使用命令行方式与之交互,数据传输和数据格式紧密耦合;易用性欠佳,Connector数据格式支持有限,安全性不好,对Connector的限制过死。
Sqoop2则建立了集中化的服务,负责管理完整的MapReduce作业,提供多种用户交互方式(CLI / WebUI / REST API),具有权限管理机制,具有规范化的Connector,使得它更加易用,更加安全,更加专注。
Sqoop1 和 Sqoop2的比较
Sqoop官网:http://sqoop.apache.org/
Hadoop生态系统 —— Apache Flume(日志收集工具)Flume由Cloudera开源的日志收集系统,和Sqoop担任的角色是一样的,负责将Hadoop之外的数据导入到Hadoop中,进行数据分析/处理。
Flume是高可靠性、高容错性、高可用、易于定制与扩展、分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
Hadoop生态系统 —— Apache Chukwa(日志收集工具)
由Cloudera提供的一个开源的用于监控大型分布式系统的数据收集系统。它可以将各种各样类型的数据收集成适合 Hadoop 处理的文件保存在 HDFS 中供 Hadoop 进行各种 MapReduce 操作。用HDFS存储,用mapreduce处理数据。它提供了很多模块以支持Hadoop集群日志分析。
Hadoop生态系统 —— Apache Oozie(作业流调度系统)
Oozie是一个工作流引擎服务器(框架),用于管理和协调运行在Hadoop平台上(HDFS、Pig和MapReduce等)的任务。
目前计算框架和作业类型繁多:MapReduce Java、Streaming、HQL(Hive)、Pig等。
如何对这些计算框架和作业进行统一管理和调度: 不同作业之间存在依赖关系(DAG,有向无环图) 周期性作业(如每5分钟执行一次HQL作业进行分析) 定时执行的作业 作业执行状态监控与报警(发邮件、短信等)
多种解决方案: Linux Crontab(定时执行一个Shell命令,难以做到按不同作业依赖关系来执行,没有作业监控和报警) 自己设计调度系统(如淘宝) 建议直接使用开源系统(Oozie)
Oozie提供了类似于XML语法的表达语言。
Oozie架构
Oozie官网:http://oozie.apache.org/
Hadoop生态系统 —— Apache Avro
是一个数据序列化系统,设计用于支持数据密集型,大批量数据交换的应用,适合于远程或本地大规模数据的存储和交换。
Avro是新的数据序列化格式与传输工具,可以将数据结构或对象转化成便于存储或传输的格式,将逐步取代Hadoop原有的IPC机制(进程间通信)
Avro的特点
丰富的数据结构类型
快速可压缩的二进制数据形式,对数据二进制序列化后可以节约数据存储空间和网络传输带宽
存储持久数据的文件容器
可以实现远程过程调用RPC(远程过程调用协议)
简单的动态语言结合功能,Avro和动态语言结合后,读写数据文件和使用RPC协议都不需要生成代码,而代码生成作为一种可选的优化只值得在静态类型语言中实现。
Avro支持二进制序列化方式,可以便捷,快速地处理大量数据;动态语言友好,Avro提供的机制使动态语言可以方便地处理Avro数据。
Avro简介:http://www.open-open.com/lib/view/open1369363962228.html
Hadoop生态系统 —— Apache Ambari
一种基于Web的工具,支持Hadoop集群的供应、管理和监控。Hadoop管理工具,可以快捷的监控、部署、管理集群。
Apache Ambari官网:http://ambari.apache.org/
Hadoop版本衍化
Apache Hadoop发行版
推荐使用最新的2.x.x稳定版本,比如2.4.0 。
下载地址:http://hadoop.apache.org/releases.html
SVN地址(所有版本的代码):http://svn.apache.org/repos/asf/hadoop/common/branches/
CDH 发行版(Cloudera Distributed Hadoop)
推荐使用最新的CDH5版本,比如CDH5.0.0 。
下载地址:http://archive.cloudera.com/cdh5/cdh/
HDP发行版(Hortonworks Data Platform)
推荐使用最新的HDP 2.x版本,比如HDP2.1
下载地址:http://zh.hortonworks.com/hdp/downloads/
数据平台架构图
Hadoop家族学习路线图:http://www.open-open.com/lib/view/open1384084364227.html