赞
踩
看到的比较全面的介绍
Hadoop 1.0 和 2.0的区别
软件栈如下图:
Hadoop 1.0的内核主要由两部分构成:
Hadoop 2.0主要构成如下:
像其他开源软件一样,Hadoop也有自己的内核,在这个内核的基础上,很多公司做了自己的发行版。
Hadoop 2.0的内核由以下三部分构成:
如下图:
Hadoop的构成 —— HDFS (分布式文件系统、日志存储系统)
源自于Google的GFS论文(介绍了谷歌内部的分布式文件系统的设计、架构及关键技术点的设计方案),该论文发表于2003年10月。 HDFS是GFS的克隆版(2004年)。
整体上说,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集群比较空闲的时候,希望把这些空闲的资源分配给Spark,这样一来,整个集群的资源利用率会更高。反正,搭建三个集群,集群整体的资源利用率反而不高(例如三个集群都是装在多台相同的机器上,每个集群的资源都是静态/固定分配好的)。 如果把三个集群合并成一个集群,让一个集群上层的资源管理工具对三种类型的应用程序进行统一的管理和调度,这样的话,资源的利用率趋近于100%,有利于集群资源利用率的提高,同时便于集群的管理(管理一个大集群比管理三个小集群更容易)。
YARN的架构
构建在YARN之上的计算框架
源自于Google的MapReduce论文(了解MR最原始的设计动机和架构)
0.20前使用 org.apache.hadoop.mapred 旧接口,0.20版本开始引入org.apache.hadoop.mapreduce的新API。
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内核(HDFS、MapReduce、YARN)之上的软件有哪些?
基于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底层是一个Hadoop集群,用HDFS作为数据仓库进行存储,用MapReduce进行计算。。 Driver:映射驱动器、解析器,可以将编写的HQL语句转化/解析成Hadoop系统可识别的一系列MepReduce作业/任务,提交到Hadoop集群(将HQL经过编译、优化、执行后,再转化为MapReduce作业)。 Metastore: 元数据库,存储Hive表和HDFS文件以及字段映射等元数据信息,通常是存储在关系数据库如mysql、derby中。
SELECT word,COUNT(*) FROM doc LATERA VIEW explode(split(test,' ')) lTable as word GROUP BY word;
查询doc表,对每一行进行分割(split(test,' ')),分割后的单词进行分组,然后统计每一个单词出现的频率,最后输出。
Hive官网:http://hive.apache.org/
由Yahoo开源,设计动机是提供一种基于MapReduce的ad-hoc(点对点)数据分析工具,构建在Hadoop之上的数据仓库(类似Hive)。 Pig是一个基于Hadoop的大规模数据分析工具,为用户提供多种接口。它提供的SQL-LIKE语言叫Pig Latin(一种数据流语言),该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。通常用于进行离线分析。
先读取文档中的所有数据(一行行加载),读取完毕后要进行分割单词(按行分割),分词后做一个Map一样的数据结构,把每个词放在一个桶里面(分组),然后对每个桶里面的单词进行统计,最后输出。
Pig 与 Hive的对比
Pig官网:http://pig.apache.org/
Hive中Order by和Sort by的区别是什么:http://www.crazyant.net/1456.html
ASF开源项目,基于Hadoop的机器学习和数据挖掘的一个分布式计算框架库(数据挖掘库)。Mahout用MapReduce实现了部分数据挖掘算法,解决了并行挖掘的问题,提供一些可扩展的机器学习领域经典算法的实现。Mahout包含聚类、分类、推荐过滤、频繁子项挖掘等算法实现。
Mahout实现了一些常见的三大类数据挖掘算法,包括:推荐(Recommendation)、聚类(Clustering)、分类(Classification)算法。
Mahout官网:http://mahout.apache.org/
Mahout算法集:http://blog.csdn.net/it_man/article/details/14055757
源自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相关概念
Region server是实际存储数据,Master可以有多个,Zookeeper用于对多个Master进行协调。 Master和Region server之间通过Zookeeper进行通信,不会直接通信。这样的话,当Master挂掉之后,还可以通过Zookeeper来访问Region server中的数据,避免了Master挂掉后整个HBase集群就不可用了。
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,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,使得它更加易用,更加安全,更加专注。
Sqoop官网:http://sqoop.apache.org/
Hadoop生态系统 —— Apache Flume(日志收集工具)Flume由Cloudera开源的日志收集系统,和Sqoop担任的角色是一样的,负责将Hadoop之外的数据导入到Hadoop中,进行数据分析/处理。
Flume是高可靠性、高容错性、高可用、易于定制与扩展、分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
由Cloudera提供的一个开源的用于监控大型分布式系统的数据收集系统。它可以将各种各样类型的数据收集成适合 Hadoop 处理的文件保存在 HDFS 中供 Hadoop 进行各种 MapReduce 操作。用HDFS存储,用mapreduce处理数据。它提供了很多模块以支持Hadoop集群日志分析。
Oozie是一个工作流引擎服务器(框架),用于管理和协调运行在Hadoop平台上(HDFS、Pig和MapReduce等)的任务。
目前计算框架和作业类型繁多:MapReduce Java、Streaming、HQL(Hive)、Pig等。
如何对这些计算框架和作业进行统一管理和调度: 不同作业之间存在依赖关系(DAG,有向无环图) 周期性作业(如每5分钟执行一次HQL作业进行分析) 定时执行的作业 作业执行状态监控与报警(发邮件、短信等)
多种解决方案: Linux Crontab(定时执行一个Shell命令,难以做到按不同作业依赖关系来执行,没有作业监控和报警) 自己设计调度系统(如淘宝) 建议直接使用开源系统(Oozie)
Oozie提供了类似于XML语法的表达语言。
Oozie官网:http://oozie.apache.org/
是一个数据序列化系统,设计用于支持数据密集型,大批量数据交换的应用,适合于远程或本地大规模数据的存储和交换。
Avro是新的数据序列化格式与传输工具,可以将数据结构或对象转化成便于存储或传输的格式,将逐步取代Hadoop原有的IPC机制(进程间通信)
Avro支持二进制序列化方式,可以便捷,快速地处理大量数据;动态语言友好,Avro提供的机制使动态语言可以方便地处理Avro数据。
Avro简介:http://www.open-open.com/lib/view/open1369363962228.html
一种基于Web的工具,支持Hadoop集群的供应、管理和监控。Hadoop管理工具,可以快捷的监控、部署、管理集群。
Apache Ambari官网:http://ambari.apache.org/
推荐使用最新的2.x.x稳定版本,比如2.4.0 。
下载地址:http://hadoop.apache.org/releases.html
SVN地址(所有版本的代码):http://svn.apache.org/repos/asf/hadoop/common/branches/
推荐使用最新的CDH5版本,比如CDH5.0.0 。
下载地址:http://archive.cloudera.com/cdh5/cdh/
推荐使用最新的HDP 2.x版本,比如HDP2.1
下载地址:http://zh.hortonworks.com/hdp/downloads/
Hadoop家族学习路线图:http://www.open-open.com/lib/view/open1384084364227.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。