提及Hadoop,知道它是一个开源的、可运行于大规模集群上的分布式计算平台,实现了MapReduce计算模型和分布式文件系统HDFS等功能;但对Hadoop整个的生态不够了解,本着爱学习的态度,一块来探探hadoop的生态圈。java
平常生活中咱们一看到大数据和大数据相关的信息就会想到了hadoop,但要说具体点,又不知从何提及。 hadoop是基于Java开发的,因此在跨平台上有很大的优点,而且能够部署在廉价的计算机集群中,因此致使hadoop的火热程度。hadoop的核心是HDFS和MapReduce,HDFS是针对谷歌文件系统(GFS)的开源实现,具备较高的读写速度、容错性、可伸缩性,采用MapReduce的整合,能够在不了解分布式系统底层细节的状况下开发。这样就能够轻松的完成海量数据的存储和计算。git
高可靠:
采用冗余数据存储方式,这个即便一个副本发生故障,还有其它的副本保证正常对外服务。高效:
采用了分布式存储和分布式处理两大核心,可以很高效的处理大量的数据。高可扩展:
前面说了部署在廉价的计算机集群上,扩展起来很方便。成本低:
参考高可扩展。高容错:
参考高可靠,可以自动将失败任务从新分配。平台:
运行在Linux上,基于java开发的hadoop跨平台优点能够很好完成。hadoop除了HDFS和MapReduce外,还还包括了其它不少的功能组件。例如:常常听到的zookeeper、hbase、hive、pig、mahout、sqoop、flume、ambari等功能组件。 github
下面对各个组件作一个简单的概述,比较经常使用的着重描述。web
Ambari:
一种基于web的工具,就做用来讲,就是建立、管理、监视Hadoop生态圈的集群;就是为了让 Hadoop 以及相关的大数据软件更容易使用的一个工具。 算法
Zookeeper:
为分布式系统提供一致性协同服务,像配置服务、命名服务、分布式同步等,前面服务发现这篇文章中也讲到了为何Zookeeper不适合作发现服务,感兴趣的能够去了解下,还有消息中间件里面也讲到了Kafka使用Zookeeper来维护集群信息。 下面讲讲Zookeeper特性sql
最终一致性:
最重要的性能,client不论链接到哪一个server,展现都是同一个视图。可靠性:
具备简单、健壮、良好性能,若是消息被一台server接受,它将被全部server接受。实时性:
保证client在一个时间间隔范围内得到server的更新信息/失效信息,但存在网络延时等缘由,不能保证全部client同时获得,应该在读数据以前调用sync接口同步。等待无关:
互不相关,慢的或者失效的client不得干涉快的client的请求。原子性:
只有成功或者失败,没有中间状态。顺序性:
从同一客户端发起的事务请求,都会最终被严格的按照其发送顺序被应用到zk中,包括全局有序和偏序两种,全局有序好理解,就是全部的server的发布消息顺序同样;偏序存在没法比较的现象,若是一个消息B在消息A后被同一个发布者发布,A必将排在B前面。 Zookeeper的核心是原子广播,这个机制保证了各个server之间的同步,leader崩溃,由server发起选举。领导者(leader):
负责进行发起投票和决议,更新系统状态。学习者:
分为跟随着(follower)和观察者(observer),前者用于接收客户请求并向客户端返回结果,参与投票;后者接收客户端写请求,转发给领导者,不参与投票,只同步领导者的状态。客户端:
请求发起方。
Hbase:
一个实时读写、分布式的列式数据库,主要是为了弥补Hadoop对实时操做的缺陷。和传统关系型数据库有一个很重要的区别是,一个是基于行,一个是基于列。能够说它是键值存储,也能够说它是多时间版本映射的数据库。 四个描述shell
行键(rowkey):
能够理解它为惟一ID,惟一标识,Hbase是不容许跨行的事务,全部rowkey和列族的设计就尤其重要和取巧。列族/列键(column family):
一个表中必须至少有一个列族,列族是由多个列组成的,列族是能影响数据存储的物理特性。列限定符(column key):
能够理解为列。列族里的数据是经过列限定符来定位。列限定符不须要事前定义,这也是和关系型数据库的区别,支持任意扩展。时间戳(timestamp):
能够理解为行键、列族、列限定符组成了一个单元(cell),cell是有时间版本,用时间戳标识,默认是3个。Hive:
sql转换MapReduce程序语言,能够减小MapReduce jobs编写工做,Hive提供了相似sql语言的查询语言-Hive QL,能够经过Hive QL语句快速实现简单的MapReduce统计,十分适合作数据仓库的统计分析。数据库
Pig:
在MapReduce上建立了更简单的过程语言抽象,提供了一种更接近结构化查询语言(SQL)的接口,能够理解为Pig最大的做用就是对MapReduce算法(框架)实现了一套shell脚本 ,称之为:Pig Latin。编程
Mahout:
用于机器学习的一个框架,旨在帮助更方便快捷建立智能应用程序,包含许多实现,聚类、分类、推荐过滤、频繁子项挖掘等。服务器
MapReduce:
一种离线计算框架,用于大规模数据集的平行运算,将并行计算过程高度抽象到了两个函数,Map和Reduce;这样就能够在不了解分布式系统底层细节的状况下进行平行应用开发,核心思想是:“分而治之”,把输入的数据集切分为若干独立的数据库,分发给各个分节点共同平行完成,最后聚合结果获得最终结果。
YARN:
调度系统,资源管理器,最初是为了修复MapReduce实现的不足,由于MapReduce是采用了Master/Slave 模式,一个JobTracker负责做业调度和资源管理,多个TaskTracker负责执行被指派的具体任务,因此会存在单点故障、任务太重、内存溢出、资源划分不合理等缺陷。
HDFS:
Hadoop分布式文件系统,是针对谷歌文件系统GFS的开源实现,具备处理超大数据、流式处理、能够运行在廉价商用服务器上等有点。
Flume:
分布式的海量日志采集,聚合和传输的系统,Flume具备高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各类网站服务器上聚集起来存储到HDFS,HBase等集中存储器中。
Sqoop:
SQL-to-Hadoop的缩写,主要用来在Hadoop和关系数据库之间交换数据,经过Sqoop能够方便的将数据从关系数据库中导入Hadoop,或者将数据从Hadoop导出到关系数据库,Sqoop主要经过JDBC和关系数据库进行交互。
附加几个其它的功能组件
Storm:
Storm是Twitter开源的分布式实时大数据处理框架,流计算平台,优势是无延迟,缺点是不够灵活,想要统计的东西必须预知道;要达到更新实时,在数据流进来的时候就开始处理,好比广告点击计算,它的实时性要远远好于MapReduce计算框架。
Spark:
MapReduce计算框架不适合迭代计算和交互计算,MapReduce是一种磁盘计算框架,而Spark则是一种内存计算框架,它将数据尽量放到内存中提升迭代应用和交互式应用的计算效率。
Pregel:
Pregel是Google提出的大规模分布式图计算平台,专门用来解决网页连接分析、社交数据挖掘等实际应用中涉及的大规模分布式图计算问题,Pregel做为分布式图计算的计算框架,主要用于图遍历、最短路径、PageRank计算等。
针对Hadoop的改进和提高 Hadoop框架自身的改进,从1.0到2.0
组件 | Hadoop1.0的问题 | Hadoop2.0的改进 |
---|---|---|
HDFS | 单一名称节点,存在单点失效问题 | 设计了HDFS HA,提供名称节点热备份机制 |
单一命名空间,没法实现资源隔离 | 设计了HDFS联邦,管理多个命名空间 | |
MapReduce | 资源管理效率底 | 设计了新的资源管理框架YARN |
不断完善的Hadoop生态系统
组件 | 功能 | 解决Hadoop中存在的问题 |
---|---|---|
Pig | 处理大规模数据的脚本语言,用户只要编写几条简单的语句,系统会自动转换为MapReduce做业 | 抽象层次低,须要手工编写大量代码 |
Oozie | 工做流和协做服务引擎,协调Hadoop上运行的不一样任务 | 没有提供做业依赖关系管理机制,须要用户本身处理做业之间的依赖关系 |
Tez | 支持DAG做业的计算框架,对做业的操做进行从新分解和组合,造成一个搭的DAG做业,减小没必要要操做 | 不一样的MapReduce任务之间存在重复操做,下降了效率 |
Kafka | 分布式发布订阅消息系统,不一样类型的分布式系统能够统一接入到Kafka,实现和Hadoop各个组件之间的不一样类型数据的实时高效交换 | Hadoop生态系统中各个组件和其它产品之间缺少统一的、高效的数据交换中介 |
这里主要是对Hadoop生态系统的一些功能组件作一个简单的归类描述,不涉及到具体的实现。 感兴趣的能够看看个别组件功能的详细实战。
浅谈Hbase与中间的一些设计策略
我的博客~
简书~