分享

Hadoop2.2.0+HBase.96+Hive0.12配置详细过程整理

本帖最后由 pig2 于 2014-5-17 03:08 编辑

公司产品最近在往大数据方向靠拢,个人有幸能参与在其中,一路研究下来,学习到了许多,也尝到了不少辛苦,尤其是Hadoop2.2.0+Hbase.96+Hive0.12的配置,前后折腾了近一个多星期,个中艰辛,恐怕只有真正的技术人员能体会吧,没有办法,绝强,死磕,本就是我们这些人的特点,下面讲一下自己的经历,给后来学习者一个提示吧,权当抛砖引玉。
(一).首先是hadoop的下载和安装,hadoop2.2.0现在是apache官网上的最新stable版本,你可以从:http://mirror.bit.edu.cn/apache/hadoop/common/stable/来下载hadoop-2.2.0.tar.gz 包。
(二).下载后要将tar包传到我们计划的Linux系统上解压缩,一般来说我们肯定是已经准备好了Linux系统的,也许是一台真实的机器,也许只是测试玩玩的虚拟机,不管怎么样,在我们将tar包传到linux里之前,需要先在所有linux系统上准备一些环境,具体的有以下几步:

        1.安装jdk,并设置好JAVA_HOME ,比如/usr/java/jdk1.6

        2.设置主机名,一般来说hadoop集群都是多台机器的,得给他们安不同的名字以示区分 ,通过vi  /etc/sysconfig/network设置hostname ,假设为server1,集群中的其他机器记得设置其他不同的名字,如server2,server3等。说明,文中我以server1称为主机,也就是HDFS中的nameNode,HBase中的HMaster,其他机器server2,server3是HDFS中的dataNode和HBase中的regionServer和zookeeper.quorum。

        3.设置ip和hostname的映射关系,如果你还有其他的ip,也一并设置,通过 vi /etc/hosts                 

        4.关闭防火墙,如果你要配置的是多个主机集群环境,那么必须将所有主机的防火墙关闭,否则有可能出现如HDFS中的dataNode无法心跳和NameNode同步的情况。

        5.创建专门的用户,一般来说,我们不会直接用root来启停hadoop应用,如果是集群环境,建议统一设置的相同的环境变量和专门的用户,这样就不用在集群将同步的时候还考虑不同的环境变量路径问题,比如我们创建hadoop用户。先创建组:groupadd hadoop,然后创建用户:useradd -g hadoop hadoop,然后修改hadoop用户的密码:passwd hadoop,建议将密码设置的短点,因为后面你启停应用的时候要用到的,最后建议将hadoop用户加到sodu列表:vi /etc/sudoers  (hadoop  ALL=(ALL)      ALL),

        6.设置主机到其他机器的无密码ssh,hadoop会通过shell脚步去控制其他主机启停,所有必需设置ssh的无密码登入,具体步骤如下:

        a).用hadoop登入server1,cd到用户目录下,如/home/hadoop/ 运行ssh-keygen –t rsa  (连续3次回车即可)
        b).ssh拷贝到其他server上scp ~/.ssh/id_rsa.pub hadoop@server2:~/temp_key
        c).登入都各server上创建并改变.ssh权限  chmod 700 ~/.ssh
        d).转换内容及改变权限
        cat ~/temp_key >>~/.ssh/authorized_keys
        chmod 600 ~/.ssh/authorized_keys

       e).验证:从server1上ssh server2或其他server ,看看能不能直接登入,如果直接能登入不需要输入密码,则表示配置成功,否则重新配置,其他机器的配置把server2换成server3或其他即可。

7.最后用hadoop用户再确认一下环境变量,比如hostname,JAVA_HOME,service iptables status等
8.同步集群里的机器时间,是他们之间的时间差距不要超过30秒,因为如果不同步的话,后面hbase启动regionServer的时候会报错的。

(三)环境准备好后,可以将下载的hadoop的tar包传了,建议上传到/home/hadoop用户目录下,方便管理,

加压缩:  tar xzvf  hadoop-2.2.0.tar.gz ,加压缩就能在/home/hadoop下看到hadoop-2.2.0目录了。然后vi /home/hadoop/.bash_profile配置一下HADOOP_HOME,并在PATH后再加入hadoop下的bin和sbin,运行PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin,因为hive的运行是要基于hadoop做Map-reduce的,所以必须设置,设置好后运行source /home/hadoop/.bash_profile使其生效。下一步就是具体的配置了。

(四)cd到/home/hadoop/etc/hadoop/ 目录下修改几个配置文件的参数:

                    1.vi hadoop-env.sh设置正确的java_home,如 export JAVA_HOME=/usr/java/jdk1.6

                    2.vi core-site.xml,(如果没有此文件直接生成即可)将以下内容复制过去:
  1.            <configuration>
  2. <property>
  3. <name>fs.default.name</name>
  4. <value>hdfs://server1:9000</value>
  5. </property>
  6. <property>
  7. <name>hadoop.tmp.dir</name>
  8. <value>/home/hadoop/data/tmp</value>
  9. </property>
  10. <property>
  11.       <name>dfs.name.dir</name>
  12.       <value>/home/hadoop/data/hdfslog</value>
  13. </property>
  14. <property>
  15.      <name>dfs.data.dir</name>
  16.      <value>/home/hadoop/data/hdfsdata</value>
  17. </property>
  18. </configuration>
复制代码
需要指定HDFS的地址及端口,这样HBase就能直接用此地址作为数据文件的根目录,其他照着配置就可以了。如果不配置默认是在/tmp下,一般不建议在/tmp,因为系统启动后就没了。


3.vi slaves ,即配置HDFS的dataNode,根据集群的计划,加上对应的名称即可,每行一个,如:

server2
server3


(五)基本配置完成后,需要用scp命令把整个hadoop2.2.0拷贝到其他节点上,如scp -r /home/hadoop/hadoop2.2.0 hadoop@server2:/home/hadoop/ ,其他节点把server2换成其他名字拷贝过去即可。都拷贝完成后仍只在主节点server1上运行命令即可,hadoop会自动利用前面我们配置的无密码ssh在其他节点上执行shell脚步的。

在启动服务前一定记得要格式化文件,运行:hadoop namenode -format  

一般来说如果上述你配置了HADOOP_HOME,并把$HADOOP_HOME/bin也加入到了PATH下,那么是可以直接运行的,如果不行,可以直接cd到/home/hadoop/hadoop-2.2.0/bin下运行./hadoop namenode -format.
执行完后cd 到/home/hadoop/hadoop-2.2.0/sbin下运行$HADOOP_HOME/sbin/start-dfs.sh就可以启动了。启动完后可以运行java自带的jps命令,看有没有产生namenode 和secondnamenode。另外还可以到浏览器打开http://server1:50070/dfshealth.jsp 看效果。




------------------------------------------------------------------------------------------------------------------------




(六)HDFS起来后接下来就是开始配置HBase,从http://mirror.bit.edu.cn/apache/hbase/hbase-0.96.0/ 下载hbase-0.96.0-hadoop2-bin.tar.gz

上传到/home/hadoop下并tar xzvf hbase-0.96.0-hadoop2-bin.tar.gz 加压缩,之后在此路径下我们就能看到hbase-0.96.0-hadoop2目录,接着我们开始进行配置:


1.cd 到/home/hadoop/hbase-0.96.0-hadoop2/conf下 vi hbase-env.sh设置正确的java_home.如export JAVA_HOME=/usr/java/jdk1.6,另外如果是由hbase自己管理zookeeper,还需要设置export HBASE_MANAGES_ZK=true ,如果不是,则还需要再下载zookeeper进行配置。

2.如果是单机配置,只需要如下配置hbase-site.xml:
  1.   <configuration>  
  2.     <property>  
  3.      <name>hbase.rootdir</name>  
  4.       <value>file:///home/hadoop/data/hbase</value>  
  5.     </property>  
  6.   </configuration>
复制代码
但一般我们都会配置集群环境,则需要如如下配置hbase-site.xml:
  1. <configuration>
  2.   <property>
  3.    <name>hbase.rootdir</name>
  4.    <value>hdfs://152server:9000/hbase</value>
  5.   </property>
  6. <property>
  7. <name>hbase.master</name>
  8. <value>hdfs://152server:60000</value>
  9. </property>
  10.   <property>
  11.     <name>hbase.zookeeper.property.dataDir</name>
  12.     <value>/home/hadoop/data/zookeeper</value>
  13.   </property>
  14.   <property>
  15.     <name>hbase.cluster.distributed</name>
  16. <value>true</value>
  17.   </property>
  18. <property>
  19. <name>hbase.zookeeper.quorum</name>
  20. <value>server2,server3</value>  <!--此处不能同时配置namenode所在的服务器 -->
  21. </property>
  22. </configuration>
复制代码
3.vi regionservers 配置regionServer,即真正存放数据信息的地方,这里我们把server2,server3设置为regionserver。每个节点一行

      server2   

       server3





(七)hbase基本的配置差不多了。但还有最重要的一个,我们从hbase的lib目录下我看到它是基于hadoop2.1.0的,所以我们需要用我们的hadoop2.2.0下的jar包来替换2.1的,保证版本的一致性,hadoop下的jar包都是在$HADOOP_HOME/share/hadoop下的,我们先cd 到 /home/hadoop/hbase-0.96.0-hadoop2/lib下运行命令: rm -rf hadoop*.jar删掉所有的hadoop相关的jar包,然后运行:

find /home/hadoop/hadoop2.2.0/share/hadoop -name "hadoop*jar" | xargs -i cp {} /home/hadoop/hbase-0.96.0-hadoop2/lib/  拷贝所有hadoop2.2.0下的jar包hbase下进行hadoop版本的统一




(八)接下来就可以启动hbase了,cd到/home/hadoop/hbase-0.96.0-hadoop2/bin下执行./start-hbase.sh,如果启动成功,用jps就能查看到HMaster应用已经起来了,而且在server2等其他regionServer上能看到HRegionServer和HQuorumPeer。你也可以在此bin目录下运行./hbase shell进入hbase的client端,运行list或create 'test','cf1' 等命令检查一下是否成功启动,同时你也可以到浏览器打开 http://server1:60010/master-status 看界面端。

----------------------------------------------------------------------------------------------------------------




(九)接下来开始安排配置hive,这个hive目前最新的版本是0.12,不过0.13版本其实已经可以编译出来了,只不过截止到我写这篇文章时hive官网上目前还没有更新,我们先从http://mirror.bit.edu.cn/apache/hive/hive-0.12.0/ 上下载hive-0.12.0.tar.gz,但是请注意,此版本基于是基于hadoop1.3和hbase0.94的,我们需要对此做一些改造,一步一步来,我们先把下载到的hive-0.12.0.tar.gz

上次到server1的/home/hadoop下,tar xzvf hive-0.12.0.tar.gz进行解压缩,这样我们就得到了/home/hadoop/hive-0.12.0,我们cd到此目录下的lib目录可以看到里面基于的hbase jar包是0.94的,无论是否与hbase整合,其配置都是一样的,不同的地方在于建表的时候是否使用hive-hbase-handle,因此先熟悉配置hvie的过程。


1.cd 到 /home/hadoop/hive-0.12.0/conf下vi hive-site.xml,其大致配置内容如下:
  1. <configuration>
  2. <property>
  3.   <name>hive.metastore.warehouse.dir</name>
  4.   <value>hdfs://152server:9000/hive/warehousedir</value>
  5. </property>
  6. <property>
  7.   <name>hive.exec.scratchdir</name>
  8.   <value>hdfs://152server:9000/hive/scratchdir</value>
  9. </property>
  10. <property>
  11.   <name>hive.querylog.location</name>
  12.   <value>/home/hadoop/hive-0.12.0/logs</value>
  13. </property>
  14. <property>  
  15.   <name>javax.jdo.option.ConnectionURL</name>  
  16.   <value>jdbc:mysql://192.168.114.32:3306/hiveMeta?createDatabaseIfNotExist=true</value>  
  17. </property>  
  18. <property>  
  19.   <name>javax.jdo.option.ConnectionDriverName</name>  
  20.   <value>com.mysql.jdbc.Driver</value>  
  21. </property>  
  22. <property>  
  23.   <name>javax.jdo.option.ConnectionUserName</name>  
  24.   <value>root</value>  
  25. </property>  
  26. <property>  
  27.   <name>javax.jdo.option.ConnectionPassword</name>  
  28.   <value>111111</value>  
  29. </property>
  30. <property>
  31.   <name>hive.aux.jars.path</name>
  32.   <value>file:///home/hadoop/hive-0.12.0/lib/hive-hbase-handler-0.13.0-SNAPSHOT.jar,file:///home/hadoop/hive-0.12.0/lib/protobuf-java-2.5.0.jar,
  33. file:///home/hadoop/hive-0.12.0/lib/hbase-client-0.96.0-hadoop2.jar,file:///home/hadoop/hive-0.12.0/lib/hbase-common-0.96.0-hadoop2.jar,file:///
  34. home/hadoop/hive-0.12.0/lib/zookeeper-3.4.5.jar,file:///home/hadoop/hive-0.12.0/lib/guava-11.0.2.jar</value>
  35. </property>
  36. <property>  
  37.   <name>hive.metastore.uris</name>  
  38.   <value>thrift://192.168.113.178:9083</value>  
  39. </property>  
  40. </configuration>
复制代码
说明,其中的红色字体部分是配置与mysql连接的,因为hive需要用到关系型数据库来存储元信息,目前只支持mysql,所以我们需要提前转好一个mysql,创建mysql 的是记得设置字符集为latin1,否则后期建表会出问题。具体hive关联mysql的配置如下:https://cwiki.apache.org/conflue ... nual+MetastoreAdmin

另外如果我们将来需要通过jdbc/odbc的方式来连接hive,需要启动metastore shfift,因此必须配置hive.metastore.uris。而hive.aux.jars.path是与hbase整合的时候需要用到的jar包,必须加上。




(十)做完基本的hive配置后,接下来一个比较大的步骤是替换一些jar包,因为你直接下载得到的hive是基于hadoop1.3和hbase0.94的,所以必须进行替换,因为我们的hbse0.96是基于hadoop2.2的,所以我们必须先解决hive的hadoop版本问题,目前我们从官网下载的hive都是用1.几的版本编译的,因此我们需要自己下载源码来用hadoop2.X的版本重新编译hive,这个过程也很简单,只需要如下步骤:

                1.先从http://svn.apache.org/repos/asf/hive/branches/branch-0.12 地址把源码下载下来,如果你不知道怎么下载,先安装一个svn客户端或在Eclipse用svn插件来下载。比如此处我们把源码下到/home/hadoop/branch-0.12下

                2.编译是需要maven的,如果你机器没有配置maven,需要从http://maven.apache.org/download.cgi 下载maven,然后解压出来并在PATH下把$maven_home/bin加入,然后在dos下或者shell下运行mvn -v就能            知道maven是否配置成功

                3.配置好maven开始编译hive,我们cd到下载源码的branch-0.12 目录,然后运行mvn clean package -DskipTests -Phadoop-2开始编译

                4.编译好后的新jar包是存放在各个模块下的target的,这些新jar包的名字都叫hive-***-0.13.0-SNAPSHOT.jar,***为hive下的模块名,我们需要运行命令将其拷贝到hive-0.12.0/lib下。当然如果是你在windows下编译的,直接    查找拷贝到lib下就好了。find /home/hadoop/branch-0.12  -name "hive*SNAPSHOT.jar"|xargs -i cp {} /home/hadoop/hive-0.12.0/lib。拷贝过去后我们比照着删除原lib下对应的0.12版本的jar包。

                 5.   接着我们同步hbase的版本,先cd到hive0.12.0/lib下,将hive-0.12.0/lib下hbase-0.94开头的那两个jar包删掉,然后从/home/hadoop/hbase-0.96.0-hadoop2/lib下hbase开头的包都拷贝过来

                              find /home/hadoop/hbase-0.96.0-hadoop/lib -name "hbase*.jar"|xargs -i cp {} ./

                 6.基本的同步完成了,重点检查下zookeeper和protobuf的jar包是否和hbase保持一致,如果不一致,已hbase的为准提过到hive下即可。

                 7.如果用mysql当原数据库,别忘了找一个mysql的jdbcjar包mysql-connector-java-3.1.12-bin.jar也拷贝到hive-0.12.0/lib下




        (十一)启动hive,这个又可以分为启动metastore和hiveserver,其中metastore用于和mysql之间的表结构创建或更新时通讯,hiveserver用于客户端连接,这这个都要启动,具体的启动命令:


         启动metastore:hive --service metastore   -hiveconf hbase.zookeeper.quorum=server2,server3 -hiveconf              base.zookeeper.property.clientPort=2181 (远程mysql需要启动)

启动hiveservice:hive --service hiveserver  -hiveconf hbase.zookeeper.quorum=server2,server3,179server -hiveconf hbase.zookeeper.property.clientPort=2181 (启动服务,这样jdbc:hive就能连上,默认10000端口,后面的部分一定要带上,否则用eclipse连接不上的)

起来后我们在eclipse就可以使用jdbc:hive来连接了。如


        Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");

        Connection conn = DriverManager.getConnection("jdbc:hive://server1:10000/hiveMeta","root","111111");
        return conn;
其实使用上和普通的数据库已经很相似了,除了建表的语句有一些差别。




    (十二)当然你也可以在hive-0.12.0/bin运行hive -hiveconf hive.root.logger=DEBUG,console -hiveconf hbase.zookeeper.quorum=server2,server3 -hiveconf hbase.zookeeper.property.clientPort=2181

进入hive客户端,运行show tables;查看表的情况或者运行create table test3(time string,amount string) row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile;   创建本地表,非hbase对应表,或者运行CREATE TABLE hivetest(key int, val string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") TBLPROPERTIES ("hbase.table.name" = "hivetest");来创建于hbase关联的表,这样在hbase shell下也能看到,两笔新增数据都能实时看到。




    (十三)至此,整个整合过程都完成了,你可以在linux用各种shell来测试,也可以通过eclipse连接到hive来测试,和通过jdbc连接普通数据库一致,不过有一些注意分享给大家:


1.如果要insert 与hbase整合的表,不能像本地表一样load,需要利用已有的表进行,如insert overwrite table hivetest select * from test;  其中test的语句(create table test4(key int,val string) row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile; ),注意类型要一致,否则用insert overwrite table hivetest select * from test; 导不进去数据

2.在hive中的 修改能同步反应到hbase中,但是如果在hbase中对新的列做了数据修改,则不会反应到hive中,因为hive的原数据文件并没有更新。


(十四)说明,这篇文章前后写了三天,都是利用零散的时间,但是我觉得很值,一是给自己一个总结的机会,而且前期自己研究的时候得到了网上很多朋友的帖子启示,有很大的帮助,希望我写的对大家也能有帮助,技术在于分享,当然希望大家转载的时候保留我的署名:Dimmacro.也不枉我码字一番。  

本帖被以下淘专辑推荐:

已有(6)人评论

跳转到指定楼层
lidahe 发表于 2014-1-14 16:06:25
支持一下,谢谢!
回复

使用道具 举报

tksky 发表于 2014-10-28 17:25:00
mark, 支持下,下班回去照着这个test一把
回复

使用道具 举报

admln 发表于 2014-10-28 22:09:54
1.不需要配置yarn吗?
2.regionservers不是要为奇数吗?
回复

使用道具 举报

chuyuan_zhou 发表于 2014-12-19 16:16:58
顶一个,学习 !
回复

使用道具 举报

ggggying12 发表于 2017-4-1 14:18:34
顶一个,学习下
回复

使用道具 举报

老街的腔调 发表于 2017-12-19 11:19:37
loooooooook
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条