nettman 发表于 2014-5-5 20:41:35

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

本帖最后由 pig2 于 2014-5-22 15:15 编辑

问题导读:
1.如何修改主机名?
2.如何确定防火墙已经关闭?
3.多次格式化容易出现什么问题?
4.hadoop、hbase整合要注意什么问题?



static/image/hrline/4.gif



公司产品最近在往大数据方向靠拢,个人有幸能参与在其中,一路研究下来,学习到了许多,也尝到了不少辛苦,尤其是Hadoop2.2.0+Hbase.96+Hive0.12的配置,前后折腾了近一个多星期,个中艰辛,恐怕只有真正的技术人员能体会吧,没有办法,绝强,死磕,本就是我们这些人的特点,下面讲一下自己的经历,给后来学习者一个提示吧,权当抛砖引玉。

补充:所以编译好的jar包均分享到百度云盘:链接: http://pan.baidu.com/s/1kTG72kB 密码: j85h ,可自行下载

(一).首先是hadoop的下载和安装
hadoop2.2.0现在是apache官网上的最新stable版本,你可以从:http://mirror.bit.edu.cn/apache/hadoop/common/stable/来下载hadoop-2.2.0.tar.gz 包。(下载地址:http://pan.baidu.com/s/1sjGvjsT)

(二).下载后要将tar包传到我们计划的Linux系统上解压缩
一般来说我们肯定是已经准备好了Linux系统的,也许是一台真实的机器,也许只是测试玩玩的虚拟机,不管怎么样,在我们将tar包传到linux里之前,需要先在所有linux系统上准备一些环境,具体的有以下几步:
1.安装jdk,并设置好JAVA_HOME ,比如/usr/java/jdk1.6
具体可以查看
linux(ubuntu)安装Java jdk环境变量设置及小程序测试


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

此步骤不太详细,详细可参考hadoop2完全分布式最新高可靠安装文档
Hadoop2.2.0安装配置手册!完全分布式Hadoop集群搭建过程


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


4.关闭防火墙,如果你要配置的是多个主机集群环境,那么必须将所有主机的防火墙关闭,否则有可能出现如HDFS中的dataNode无法心跳和NameNode同步的情况。
(关闭防火墙,应该注意防火墙关闭是有级别,设置完毕后,查看一下防火墙状态)


5.创建专门的用户,一般来说,我们不会直接用root来启停hadoop应用,如果是集群环境,建议统一设置的相同的环境变量和专门的用户,这样就不用在集群将同步的时候还考虑不同的环境变量路径问题,比如我们创建hadoop用户。先创建组:groupadd hadoop,然后创建用户:useradd -g hadoop hadoop,然后修改hadoop用户的密码:passwd hadoop,建议将密码设置的短点,因为后面你启停应用的时候要用到的,最后建议将hadoop用户加到sodu列表:vi /etc/sudoers(hadoopALL=(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 xzvfhadoop-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,(如果没有此文件直接生成即可)将以下内容复制过去:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://server1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/tmp</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/data/hdfslog</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/data/hdfsdata</value>
</property>
</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 看效果。

------------------------华丽分割线 edited By Dimamcro----------------

(六)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:   
<configuration>
<property>
    <name>hbase.rootdir</name>
    <value>file:///home/hadoop/data/hbase</value>
</property>
</configuration>
但一般我们都会配置集群环境,则需要如如下配置hbase-site.xml:
<configuration>
<property>
   <name>hbase.rootdir</name>
   <value>hdfs://152server:9000/hbase</value>
</property>
<property>
<name>hbase.master</name>
<value>hdfs://152server:60000</value>
</property>
<property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/home/hadoop/data/zookeeper</value>
</property>
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>server2,server3</value><!--此处不能同时配置namenode所在的服务器 -->
</property>
</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 看界面端。

-------------------------------------华丽分割线 edited By Dimamcro---------------------------

(九)接下来开始安排配置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,其大致配置内容如下:
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>hdfs://152server:9000/hive/warehousedir</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>hdfs://152server:9000/hive/scratchdir</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/home/hadoop/hive-0.12.0/logs</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.114.32:3306/hiveMeta?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>111111</value>
</property>
<property>
<name>hive.aux.jars.path</name>
<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,
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:///
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>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.113.178:9083</value>
</property>
</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 hbase.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的原数据文件并没有更新。

后记:hive的本地模式配置安装:
需要重新hive-site.xml文件。配置文件如下:
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
   
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
   
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://172.16.77.15/hive_remote?createDatabaseIfNotExist=true</value>
</property>
   
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
   
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
   
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123</value>
</property>
</configuration>
上面需要明白他们的含义:根据自己的实际情况修改:
下面的配置项目去掉:
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.113.178:9083</value>
</property>










参考:Dimmacro




sunshine_junge 发表于 2014-5-6 08:29:36

好东西,,,

stwen 发表于 2016-2-26 14:50:04

不错,学习

shihao55 发表于 2016-5-26 13:59:51

很好,写的非常的详细,学习了

louxl2008 发表于 2016-11-18 10:17:12

学习了

YTP520YTP 发表于 2017-11-17 16:46:44

6666666666666666666很好,学习了{:3_46:}
页: [1]
查看完整版本: Hadoop2.2.0+HBase.96+Hive0.12配置详细过程整理