Hadoop发展过程.docx
《Hadoop发展过程.docx》由会员分享,可在线阅读,更多相关《Hadoop发展过程.docx(13页珍藏版)》请在冰点文库上搜索。
Hadoop发展过程
1.Hadoop版本演化
总体说来,Hadoop当前存在两种发行版,分别是闭源发行版和开源发行版,其中,Intel发行版、华为发行版、IBM发行版等商业公司发行的版本都属于闭源发行版,这几个公司在开源Hadoop基础上进行了若干的改进和优化,提出了自己的发行版,并打包到硬件中出售,目前intel和华为发行版买的不错,在此不细谈闭源发行版,主要谈开源发行版。
目前主要有三大非常有名的开源发行版,分别是apache、hortonworks、cloudera,第一个是一个开源公益组织,后两个是开源公司,
由于Hadoop版本混乱多变,因此,Hadoop的版本选择问题一直令很多初级用户苦恼。
本文总结了ApacheHadoop和ClouderaHadoop的版本衍化过程,并给出了选择Hadoop版本的一些建议。
apachehadoop和clouderahadoop的版本的演化.
apachehadoop官方给出的版本说明是:
下图可以简单说明apachehadoop和clouderahadoop版本之间的变化关系
0.20.x版本最后演化成了现在的1.0.x版本
0.23.x版本最后演化成了现在的2.x版本
hadoop1.0指的是1.x(0.20.x),0.21,0.22
hadoop2.0指的是2.x,0.23.x
CDH3,CDH4分别对应了hadoop1.0hadoop2.0
1ApacheHadoop版本衍化
截至2012年12月23日,ApacheHadoop版本分为两代,我们将第一代Hadoop称为Hadoop1.0,第二代Hadoop称为Hadoop2.0。
第一代Hadoop包含三个大版本,分别是0.20.x,0.21.x和0.22.x,其中,0.20.x最后演化成1.0.x,变成了稳定版,而0.21.x和0.22.x则NameNodeHA等新的重大特性。
第二代Hadoop包含两个版本,分别是0.23.x和2.x,它们完全不同于Hadoop1.0,是一套全新的架构,均包含HDFSFederation和YARN两个系统,相比于0.23.x,2.x增加了NameNodeHA和Wire-compatibility两个重大特性。
经过上面的大体解释,大家可能明白了Hadoop以重大特性区分各个版本的,总结起来,用于区分Hadoop版本的特性有以下几个:
(1)Append支持文件追加功能,如果想使用HBase,需要这个特性。
(2)RAID在保证数据可靠的前提下,通过引入校验码较少数据块数目。
详细链接:
https:
//issues.apache.org/jira/browse/HDFS/component/12313080
(3)Symlink支持HDFS文件链接,具体可参考:
https:
//issues.apache.org/jira/browse/HDFS-245
(4)SecurityHadoop安全,具体可参考:
https:
//issues.apache.org/jira/browse/HADOOP-4487
(5) NameNodeHA具体可参考:
https:
//issues.apache.org/jira/browse/HDFS-1064
(6) HDFSFederation和YARN
需要注意的是,Hadoop2.0主要由Yahoo独立出来的hortonworks公司主持开发。
2ClouderaHadoop(CDH)版本衍化
Apache当前的版本管理是比较混乱的,各种版本层出不穷,让很多初学者不知所措,相比之下,Cloudera公司的Hadoop版本管理的要很多。
我们知道,Hadoop遵从Apache开源协议,用户可以免费地任意使用和修改Hadoop,也正因此,市面上出现了很多Hadoop版本,其中比较出名的一是Cloudera公司的发行版,我们将该版本称为CDH(ClouderaDistributionHadoop)。
截至目前为止,CDH共有4个版本,其中,前两个已经不再更新,最近的两个,分别是CDH3(在ApacheHadoop0.20.2版本基础上演化而来的)和CDH4在ApacheHadoop2.0.0版本基础上演化而来的),分别对应Apache的Hadoop1.0和Hadoop2.0,它们每隔一段时间便会更新一次。
Cloudera以patchlevel划分小版本,比如patchlevel为923.142表示在原生态ApacheHadoop0.20.2基础上添加了1065个patch(这些patch是各个公司或者个人贡献的,在Hadoopjira上均有记录),其中923个是最后一个beta版本添加的patch,而142个是稳定版发行后新添加的patch。
由此可见,patchlevel越高,功能越完备且解决的bug越多。
Cloudera版本层次更加清晰,且它提供了适用于各种操作系统的Hadoop安装包,可直接使用apt-get或者yum命令进行安装,更加省事。
3Hortonworks(HDP)发行版
Hortonworks这个公司是从yahoo分出来的,yahoo是hadoop的提出者和主要贡献者,而hortonworks从一成立就成为apachehadoop的主要贡献者,他目前推出自己的版本HDP(hortonworksDataPlatform),目前刚刚发布了HDP2,是基于最新的apacheHadoop2.20开发的。
4如何选择Hadoop版本
当前Hadoop版本比较混乱,让很多用户不知所措。
实际上,当前Hadoop只有两个版本:
Hadoop1.0和Hadoop2.0,其中,Hadoop1.0由一个分布式文件系统HDFS和一个离线计算框架MapReduce组成,而Hadoop2.0则包含一个支持NameNode横向扩展的HDFS,一个资源管理系统YARN和一个运行在YARN上的离线计算框架MapReduce。
相比于Hadoop1.0,Hadoop2.0功能更加强大,且具有更好的扩展性、性能,并支持多种计算框架。
当我们决定是否采用某个软件用于开源环境时,通常需要考虑以下几个因素:
(1)是否为开源软件,即是否免费。
(2)是否有稳定版,这个一般软件官方网站会给出说明。
(3)是否经实践验证,这个可通过检查是否有一些大点的公司已经在生产环境中使用知道。
(4)是否有强大的社区支持,当出现一个问题时,能够通过社区、论坛等网络资源快速获取解决方法。
考虑到以上几个因素,我们分析一下开源软件Hadoop。
对于Hadoop2.0而言,目前尚不稳定,无法用于生产环境,因此,如果当前你正准备使用Hadoop,那么只能从Hadoop1.0中选择一个版本,而目截至目前(2012年12月23日),Apache和Cloudera最新的稳定版分别是Hadoop1.0.4和CDH3U4,因此,你可以从中任选一个使用。
如今Hadoop2.0已经发布了最新的稳定版2.2.0,推荐使用该版本,具体介绍可阅读:
“Hadoop2.0稳定版本2.2.0新特性剖析”,升级方法可参考:
“Hadoop升级方案
(二):
从Hadoop1.0升级到2.0
(1)”。
2.安Hadoop配套项目HBase和Hive版本关系
1.Habse版本
……以前老版本
●hbase-0.90.0
●hbase-0.92.0
●hbase-0.94.0
●hbase-0.94.6.1oldstable
●hbase-0.94.7oldstable
●hbase-0.94.12stableversion
●hbase-0.95currentdevelop
官网镜像文件列表,目前最新稳定版本是habse-0.94.16
选择Hadoop版本对HBase部署很关键。
下表显示不同HBase支持的Hadoop版本信息。
基于HBase版本,应该选择合适的Hadoop版本
HBase-0.92.x
HBase-0.94.x
HBase-0.96
Hadoop-0.20.205
S
X
X
Hadoop-0.22.x
S
X
X
Hadoop-1.0.x
S
S
S
Hadoop-1.1.x
NT
S
S
Hadoop-0.23.x
X
S
NT
Hadoop-2.x
X
S
S
S=supportedandtested,
X=notsupported,
NT=itshouldrun,butnottestedenough.
2.Hive版本
官网镜像文件列表,目前稳定版本为hive-0.11.0
3.hadoop、hbase、hive版本匹配问题
hadoop由于快速发展,版本更新很快,已经由hadoop0.x发展到hadoop2.x,目前hadoop2.x还处于beta测试,但是hadoop0.x--hadoop1.2都是稳定版的。
由hadoop的相关项目,hbase、hive、pig、zookeeper等,他们依托于hadoop,但是开发和版本又不完全统一,就导致在学习和应用的过程中,经常出现由于版本不一致,导致莫名奇秒的错误。
下面是网上一些版本问题的经验性总结
hadoop1.2+hbase0.95.0 没问题
hadoop1.2+hbase0.94.9 没问题
hadoop1.2+hbase0.95.0+hive0.11.0会产生hbase+hive的不兼容,创建hive+hbase的关联表就会报pair对异常。
hadoop1.2+hbase0.94.9+hive0.10.0没问题,解决了上个版本的不兼容问题。
Hadoop0.20.203+hbase-0.09.3+hive-0.71没有问题。
3.Hadoop相关问题及解决
1.Habse和hive整合后,hive中使用select*和selectfiled的区别
在hive中创建分区的表与hbase整合后,使用
Select*fromhbase_test;命令无法看到表中的记录,使用selectid,namefromhbase_test;可以看到记录
分析原因:
select*在普通表中直接读取HDFS文件,在这里是直接从Habse进行查询,应该是查询成功了,但是hive并不会显示。
2.Hive、habse数据映射
Hive与Habse整合后,进行数据映射的方法:
3.Hive中插入数据,habse查询不到
问题描述:
在Hbase中有一张表TB_1
FNAME:
"C1
随后,在Hive中创建了一张映射表TB_1
当HBASE的数据发生改变时,Hive可以读取到
但我往HIVE里插入新数据后,HBASE里却看不到,求解~~
分析原因:
HIVE的映射表无法更新HBASE中已存在的数据表
创建映射表,同时创建HBASE对接表
--Hive SHELL
--创建HIVE和HBASE表单
CREATE TABLE hbase_table(key int, value string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":
key,_0:
val")
TBLPROPERTIES ("hbase.table.name" = "hive_table");
--插入测试数据
insert overwrite table hbase_table select key as key,'00' as Test from OtherHivetb;
--HBASE SHELL
scan 'hive_table',{LIMIT=>1};
4.Hbase数据版本管理
按照官方文档说明HBase的操作(包含版本操作),如下
4.1.Get
默认情况下,如果你没有指定版本,当你使用Get操作的时候,会返回最近版本的Cell(该Cell可能是最新写入的,但不能保证)。
默认的操作可以这样修改:
∙如果想要返回返回两个以上的把版本,参见Get.setMaxVersions()
∙如果想要返回的版本不只是最近的,参见Get.setTimeRange()
要向查询的最新版本要小于或等于给定的这个值,这就意味着给定的'最近'的值可以是某一个时间点。
可以使用0到你想要的时间来设置,还要把maxversions设置为1.
1)默认Get例子
下面的Get操作会只获得最新的一个版本。
Getget=newGet(Bytes.toBytes("row1"));
Resultr=htable.get(get);
byte[]b=r.getValue(Bytes.toBytes("cf"),Bytes.toBytes("attr"));
//returnscurrentversionofvalue
2)含有的版本的Get例子
下面的Get操作会获得最近的3个版本。
Getget=newGet(Bytes.toBytes("row1"));
get.setMaxVersions(3);//willreturnlast3versionsofrow
Resultr=htable.get(get);
byte[]b=r.getValue(Bytes.toBytes("cf"),Bytes.toBytes("attr"));//returnscurrentversionofvalue
Listkv=r.getColumn(Bytes.toBytes("cf"),Bytes.toBytes("attr"));//returnsallversionsofthiscolumn
4.2. Put
一个Put操作会给一个cell,创建一个版本,默认使用当前时间戳,当然你也可以自己设置时间戳。
这就意味着你可以把时间设置在过去或者未来,或者随意使用一个Long值。
要想覆盖一个现有的值,就意味着你的row,column和版本必须完全相等。
1)不指明版本的例子
下面的Put操作不指明版本,所以HBase会用当前时间作为版本。
Putput=newPut(Bytes.toBytes(row));
put.add(Bytes.toBytes("cf"),Bytes.toBytes("attr1"),Bytes.toBytes(data));
htable.put(put);
2)指明版本的例子
下面的Put操作,指明了版本。
Putput=newPut(Bytes.toBytes(row));
longexplicitTimeInMs=555;//justanexample
put.add(Bytes.toBytes("cf"),Bytes.toBytes("attr1"),explicitTimeInMs,Bytes.toBytes(data));
htable.put(put);
4.3.Delete
有三种不同类型的内部删除标记
∙Delete:
删除列的指定版本.
∙Deletecolumn:
删除列的所有版本.
∙Deletefamily:
删除特定列族所有列
当删除一行,HBase将内部对每个列族创建墓碑(非每个单独列)。
删除操作的实现是创建一个墓碑标记。
例如,我们想要删除一个版本,或者默认是currentTimeMillis。
就意味着“删除比这个版本更早的所有版本”.HBase不会去改那些数据,数据不会立即从文件中删除。
他使用删除标记来屏蔽掉这些值。
若你知道的版本比数据中的版本晚,就意味着这一行中的所有数据都会被删除。
4.4.控制版本数量
hbase为了避免数据存在过多版本造成的的管理(包括存贮和索引)负担,hbase提供了两种数据版本回收方式。
一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。
用户可以针对每个列族进行设置。
Ø最大版本数
行的版本的数量是HColumnDescriptor设置的,每个列族可以单独设置,默认是3。
这个设置是很重要的,因为HBase是不会去覆盖一个值的,他只会在后面在追加写,用时间戳来区分、过早的版本会在执行主紧缩的时候删除。
这个版本的值可以根据具体的应用增加减少。
不推荐将版本最大值设到一个很高的水平(如,成百或更多),除非老数据对你很重要。
因为这会导致存储文件变得极大。
Ø最小版本数
和行的最大版本数一样,最小版本数也是通过HColumnDescriptor 在每个列族中设置的。
最小版本数缺省值是0,表示该特性禁用。
最小版本数参数和存活时间一起使用,允许配置如“保存最后T秒有价值数据,最多N个版本,但最少约M个版本”(M是最小版本数,M该参数仅在存活时间对列族启用,且必须小于行版本数
4.知识点解释
1HDFSFederation
HDFSFederation是Hadoop最新发布版本Hadoop-0.23.0中为解决HDFS单点故障而提出的namenode水平扩展方案。
该方案允许HDFS创建多个namespace以提高集群的扩展性和隔离性。
但HDFSFederation并没有完全解决单点故障问题。
虽然namenode/namespace存在多个,但是从单个namenode/namespace看,仍然存在单点故障:
如果某个namenode挂掉了,其管理的相应的文件便不可以访问。
Federation中每个namenode仍然像之前HDFS上实现一样,配有一个secondarynamenode,以便主namenode挂掉一下,用于还原元数据信息。
2YARN
Hadoop2.0由三个子系统组成,分别是HDFS、YARN和MapReduce,其中,YARN是一个崭新的资源管理系统,而MapReduce则只是运行在YARN上的一个应用,如果把YARN看成一个云操作系统,那么MapReduce可认为是运行在这个操作系统上的App