CDH5 hadoop-hive-habse单机版配置

CDH5 hadoop-hive-habse单机版配置

 

1、安装环境:

OS:CentOS6.5 64位java

JDK:jdk-7u72-linux-x64node

hadoop:hadoop-2.3.0-cdh5.0.0.mysql

hbase:hbase-0.96.1.1-cdh5.0.0.linux

hive:hive-0.12.0-cdh5.0.0.targit

我所用的都是基于CDH5.0.0的,使用CDH的发行版不会存在各个组件间不兼容,致使启动失败等异常。github

 

CDH的其余版本能够在这里下载http://archive-primary.cloudera.com/cdh5/cdh/5/web

注意下载各个组件的时候其CDH的版本号必定都要相同。sql

 

文章中全部安装包和第三方jar包和配置文件均可以在这里下载到shell

http://pan.baidu.com/s/1pJDjHQN数据库

 

2、基础准备

1.首先安装好linux系统,我这里的是:CentOS6.5,推荐为hadoop相关的操做再专门创建一个用户,由于root用户权限太大了

用root用户在shell下运行:

//建立一个叫hadoop的用户

>useradd hadoop  

//给hadoop设置密码

>passwd hadoop

2.安装jdk,jdk就用root安装好了,linux下配置jdk的方式这里就不细说了,这里用rpm安装

>rpm -ivh  jdk-7u72-linux-x64.rpm 

而后配置jdk环境变量,我把个人/etc/profile文件贴出来

JAVA_HOME=/usr/java/jdk1.7.0_72

HIVE_HOME=/home/hadoop/hive-0.12.0-cdh5.0.0

HADOOP_HOME=/home/hadoop/hadoop-2.3.0-cdh5.0.0

PATH=$JAVA_HOME/bin:$PATH:$HIVE_HOME/bin:$HADOOP_HOME/bin

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$HIVE_HOME/lib

export JAVA_HOME

export HIVE_HOME

export HADOOP_HOME

export PATH

export CLASSPATH

 

记得source一下

>source /etc/profile

 

这里已经包括了后面要用到的hadoop和hive的安装目录,就用咱们以前创建的hadoop用户安装hadoop、hbase、hive便可。因此它们都在/home/hadoop下。

 

3、安装hadoop

1.首先须要安装的是hadoop,先上传安装包再解压

用hadoop用户把hadoop、hbase、hive的tar.gz文件都上传到/home/hadoop下

2.解压hadoop-2.3.0-cdh5.0.0.tar.gz

>tar  -xzvf  ./hadoop-2.3.0-cdh5.0.0.tar.gz

这样hadoop就被安装到了/home/hadoop/hadoop-2.3.0-cdh5.0.0目录下,若是刚才在/etc/profile里没有配置HADOOP_HOME就加进去,别忘了source。

3.下一步就是配置hadoop了

注意全部cmd后缀的文件都是windows下的配置文件,对应Linux下的是sh文件,另外hadoop生态系统中的全部组件的配置文件都遵循一个统一的规则,就是若是是xxx-default.xml则是全局的配置,xxx-site.xml则是个性化的配置,这两种文件里的配置要素彻底同样,可是若是xxx-site.xml里存在配置,则会覆盖掉xxx-default.xml中一样标签内的配置,若是site.xml中没有,则会以default.xml中的配置为准

hadoop的主要配置文件到在hadoop-2.3.0-cdh5.0.0/etc这个目录下,咱们须要配置如下几个文件

hadoop-env.sh

core-site.xml

hdfs-site.xml

mapred-site.xml

yarn-site.xml

这五个文件都在hadoop-2.3.0-cdh5.0.0/etc/hadoop这个目录下

配置hadoop-env.sh,27行,由于hadoop是java开发的,运行时须要jdk,根据本身的jdk路径,加上便可,别的没有了。

export JAVA_HOME=/usr/java/jdk1.7.0_72  

配置core-site.xml

<configuration>

<property>

<name>fs.default.name</name>

<value>hdfs://localhost:8020</value>

</property>

</configuration>

加上这一段便可,用来代表hdfs的访问地址,我没有修改hosts文件,因此这里就直接写localhost便可,端口能够本身定义,我这里用8020。

配置hdfs-site.xml

 <configuration>

<property>

<name>dfs.replication</name>

<value>1</value>

</property>

<property>

<name>dfs.namenode.name.dir</name>

<value>/home/hadoop/dfs/name</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>/home/hadoop/dfs/data</value>

</property>

</configuration>

dfs.replication指定数据的副本数,这里是单机的,默认是3,咱们改成1便可

dfs.namenode.name.dir指定namenode的路径

dfs.datanode.data.dir指定datanode的路径

这2个路径不用预先建立,后面格式化的时候会自动建立。

配置mapred-site.xml

<configuration>

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

</configuration>

CDH5的版本是基于apache hadoop2.0的,因此引入了yarn协助hadoop进行分布式计算。

把这一段复制进去就好了。

配置yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

</configuration>

把这一段复制进去就行。

4.格式化hdfs文件系统

第一次使用时在启动以前要进行格式化,以后就不用了,直接启动便可。一旦格式化,会删除hdfs上的全部数据,格式化的时候只须要针对namenode便可。

进入到hadoop-2.3.0-cdh5.0.0/bin目录下,执行

>./hadoop namenode -format

若是正确,能够看到以前配置的namenode的目录/home/hadoop/dfs/name被自动建立了出来。

5.启动hadoop

以上步骤都没有问题,就能够启动hadoop了,启动命令在hadoop-2.3.0-cdh5.0.0/sbin目录下,sbin目录下包含了全部hadoop各个部分的启动和中止命令,其中start-all和stop-all命令用于启动和中止全部相关部分。能够直接经过运行start-all来启动hadoop,但我推荐各个单独启动,若是有异常也方便定位哪部分出错,便于排查。

咱们先运行一下jps目录看下java线程有哪些

>jps

 

在sbin目录下依次启动

启动namenode: ./hadoop-daemon.sh start namenode

 

如图,启动日志会生成在hadoop-2.3.0-cdh5.0.0/logs目录下,若是出错,能够查看日志排查。正确启动了之后,再用jps命令查看,会看到多了一个NameNode的进程。

启动datanode: ./hadoop-daemon.sh start datanode

 

若是,一样会看到生成的日志,用jps查看后多了一个DataNode进程。

此时,在linux上打开浏览器,访问http://localhost:50070或者在客户机上访问

http://linuxip:50070,能够看到web页面

 

若是不行请关闭linux防火墙等。

启动yarn:./start-yarn.sh 

 

由于我没有配置ssh免密码登陆,因此启动的时候须要输入hadoop用户的密码,成功以后再用jps查看多了ResourceManager和NodeManager两个进程。

此时,在linux上打开浏览器,访问http://localhost:8088或者在客户机上访问

http://linuxip:8088,能够看到web页面

 

至此,hadoop就已经启动成功了。能够发现以前配置的datanode的目录/home/hadoop/dfs/data也已经自动建立了出来。

6.上传文件到hdfs

咱们从linux本地文件系统上上传一个文件到hdfs中

cd到hadoop-2.3.0-cdh5.0.0/bin目录下

>hadoop fs -put /home/hadoop/Desktop/1.txt  /

把事先准备的1.txt上传到hdfs的根目录下,而后查看

>hadoop fs -ls  /

 

如图,能够看到上传上来的1.txt。

7.中止hadoop

cd到sbin目录下。

>./stop-all.sh

一样由于没有配置ssh免密码,在中止的时候有几回须要输入密码。

以后再运行jps,发现已经没有hadoop的线程了。

一旦中止后,浏览器中也访问不到页面了。

4、安装HBase

1.解压hbase-0.96.1.1-cdh5.0.0.tar.gz

>tar  -xzvf  ./hbase-0.96.1.1-cdh5.0.0.tar.gz

这样HBase就安装在了/home/hadoop/hbase-0.96.1.1-cdh5.0.0目录下。

2.配置HBase

HBase的配置文件都在hbase-0.96.1.1-cdh5.0.0/conf目录下,须要配置以下文件: hbase-site.xml

hbase-env.sh

配置hbase-site.xml

<configuration>

<property>

<name>hbase.rootdir</name>

<value>hdfs://localhost:8020/hbase</value>

</property>

</configuration>

注意这里的hdfs://localhost:8020/hbase是和hadoop中的core-site.xml下的fs.default.name的值hdfs://localhost:8020对应的。只须要再加一个后缀/hbase便可。

配置hbase-env.sh

第29行附近,

export JAVA_HOME=/usr/java/jdk1.7.0_72

指向JDK的目录。

第122行附近,

export HBASE_MANAGES_ZK=true

指定HBase是否本身管理zookeeper,由于咱们这里是单机版,而且并无安装zk,因此选true。

3.启动HBase

启动前先要启动hadoop,而后进入hbase-0.96.1.1-cdh5.0.0/bin

>./start-hbase.sh

成功后使用jps命令查看

 

发现多了HMaster,就是HBase的进程。还可使用

>./hbase hbck

命令查看HBase的状态,若是正常会显示Status: OK。

HBase也有web接口页面,但要先启动HBase REST服务

>./hbase rest start

若是成功则能够访问linux上的HBase REST服务,地址为http://linuxip:60010/,方法和以前访问hadoop的web页面相同。

 

此时再运行jps,能够看到多了一个RESTServer进程。

4.建立HBase表

咱们建立一张表试试,在hbase-0.96.1.1-cdh5.0.0/bin目录下执行

>./hbase shell

若是成功会进入HBase的shell操做界面,以下图

 

建立表

>create 'table1','col1'

注意结尾没有分号

再用list命令查看已经存在的表

>list

 

能够看到刚建立的表table1。

此时在web页面上也能够看到

 

5.中止HBase

退出shell

>quit

在shell下运行quit命令便可,以下图

 

中止HBase服务

在hbase-0.96.1.1-cdh5.0.0/bin目录下运行

>./stop-hbase.sh

再运行jps,发现已经没有HMaster进程了,虽然RESTServer进程还在,但由于HBase已经中止了,HBase的web页面也打不开了。

 

5、安装hive

1.解压hive-0.12.0-cdh5.0.0.tar.gz

>tar  -xzvf  ./hive-0.12.0-cdh5.0.0.tar.gz

这样hive就安装在/home/hadoop/hive-0.12.0-cdh5.0.0目录下了。

2.配置hive

hive的配置文件在hive-0.12.0-cdh5.0.0/conf和hive-0.12.0-cdh5.0.0/bin目录下,须要配置以下文件:

hive-config.sh

hive-default.xml

hive-site.xml

hive-env.sh

配置 hive-config.sh

hive-config.sh在hive-0.12.0-cdh5.0.0/bin目录下,在70行最后加上以下配置

JAVA_HOME=/usr/java/jdk1.7.0_72

HIVE_HOME=/home/hadoop/hive-0.12.0-cdh5.0.0

HADOOP_HOME=/home/hadoop/hadoop-2.3.0-cdh5.0.0

PATH=$JAVA_HOME/bin:$PATH:$HIVE_HOME/bin:$HADOOP_HOME/bin

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$HIVE_HOME/lib:/home/hadoop/hbase-0.96.1.1-cdh5.0.0/lib

export JAVA_HOME

export HIVE_HOME

export HADOOP_HOME

export PATH

export CLASSPATH

配置hive-default.xml

这个只须要把hive-default.xml.template重命名成hive-default.xml便可

>mv hive-default.xml.template hive-default.xml

配置hive-site.xml

hive-site.xml里的配置会覆盖掉hive-default.xml中的配置,这里主要有2处须要注意,一处是肯定hive使用什么样的元数据库,一处是若是要想启动hive的web管理页面,须要配置hive的web端war包。

由于hive的元数据库能够用自身的derby,也能够用mysql,选择用什么数据库在130行和136行附近,默认的是derby的配置,若是想用mysql能够把

<property>

  <name>javax.jdo.option.ConnectionURL</name>

  <value>jdbc:derby:;databaseName=metastore_db;create=true</value>

  <description>JDBC connect string for a JDBC metastore</description>

</property>

 

<property>

  <name>javax.jdo.option.ConnectionDriverName</name>

  <value>org.apache.derby.jdbc.EmbeddedDriver</value>

  <description>Driver class name for a JDBC metastore</description>

</property>

改为

<property>

  <name>javax.jdo.option.ConnectionURL</name>   <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>

  <description>JDBC connect string for a JDBC metastore</description>

</property>

 

<property>

  <name>javax.jdo.option.ConnectionDriverName</name>

  <value>com.mysql.jdbc.Driver</value>

  <description>Driver class name for a JDBC metastore</description>

</property>

还有160行附近填写数据库的用户名和密码。

而且把mysql的jdbc驱动jar包放在hive-0.12.0-cdh5.0.0/lib目录下。我这里用的是mysql。由于若是用derby的话一次只能有一个用户连接使用hive,mysql则没有限制。另外注意要修改mysql的访问权限,让hive能够本地访问mysql。否则可能会报java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)错误。

若是要启用hive的web管理页面,在hive-site.xml的724行附近把

<property>

  <name>hive.hwi.war.file</name>

  <value>lib/hive-hwi-@VERSION@.war</value>

  <description>This sets the path to the HWI war file, relative to ${HIVE_HOME}. </description>

</property>

改为

<property>

  <name>hive.hwi.war.file</name>

  <value>lib/hive-hwi-0.12.0-cdh5.0.0.war</value>

  <description>This sets the path to the HWI war file, relative to ${HIVE_HOME}. </description>

</property>

由于CDH5.0的版本中没有自带hive-hwi-0.12.0-cdh5.0.0.war(apache之前的老版本可能会自带此war包),因此须要下载hive的源代码,本身编译成war。我已经把这篇文章中所讲的对应版本的war包编译好了,下载下来后放在hive-0.12.0-cdh5.0.0/lib目录下便可。

配置hive-env.sh

>mv hive-env.sh.template hive-env.sh

先从模版文件复制出hive-env.sh,再编辑hive-env.sh,从48行开始修改以下

HADOOP_HOME=/home/hadoop/hadoop-2.3.0-cdh5.0.0

 

# Hive Configuration Directory can be controlled by:

export HIVE_CONF_DIR=/home/hadoop/hive-0.12.0-cdh5.0.0/conf

 

# Folder containing extra ibraries required for hive compilation/execution can be controlled by:

export HIVE_AUX_JARS_PATH=/home/hadoop/hive-0.12.0-cdh5.0.0/lib

3.启动hive

先启动好hadoop,再启动HBase,若是不须要经过hive使用HBase,能够不启动HBase最后启动hive。hive的启动命令在hadoop/hive-0.12.0-cdh5.0.0/bin目录下。启动hive时有几种不一样的命令

./hive  直接启动hive,进入到hive的命令行下,在命令行模式下进行hive操做

./hive -hiveconf hive.root.logger=DEBUG,console  带日志启动hive,仍是在命令行模式下使用hive,可是会输出详细的信息,调试错误时很是有用

./hive --service hwi  带web接口启动hive,此时能够在浏览器打开hive的管理页面,前提是部署了hive-hwi-0.12.0-cdh5.0.0.war。

./hive --service hiveserver  若是要在java代码里调用hive,必须这样启动

我用第二种方式启动,进入命令行

>./hive -hiveconf hive.root.logger=DEBUG,console

启动成功后用jps查看,会看到一个RunJar进程。

 

若是启动多个hvie或者以多种方式启动hive,会看到相应数目的RunJar进程。

4.中止hive

在shell下直接输入quit命令

>quit;

注意hive的命令结尾要加分号,和hbase不一样。

这个时候再用jps命令就看不到RunJar进程了。

5.建立hive表

5.1外部表

建立外部表的时候hive只保存表的元数据,能够在hbase中先建立一个表,而后在hive里建立一个外部表来关联hbase中的表。如今咱们先建立一个hbase的表。

进入到hbase的shell下执行:

>create 'member','id','address'

>put 'member','r1','id:address','dabaojiao'

要用hive关联hbase的表须要把hbase/lib和hadoop/share/hadoop/common/lib下的一些jar包拷贝到hive/lib目录下。

Hbase下的

hbase-client-0.96.1.1-cdh5.0.0.jar,

hbase-server-0.96.1.1-cdh5.0.0.jar,

hbase-common-0.96.1.1-cdh5.0.0.jar,

hbase-protocol-0.96.1.1-cdh5.0.0.jar,

htrace-core-2.01.jar

Hadoop下的

hadoop-common-2.3.0-cdh5.0.0.jar

复制完后要重启hive。

进入hive的shell,关联hbase中的member表,注意此时hbase必定要启动哦。

在shell下输入

>CREATE EXTERNAL TABLE hbase_member(key string, value string)   

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'   

WITH SERDEPROPERTIES ("hbase.columns.mapping" = "id:address")   

TBLPROPERTIES("hbase.table.name" = "member");

 

 

若是不成功就用日志模式启动hive,会有详细的错误堆栈信息,关联hbase表时比较常见的异常是ClassNotFoundException和ClassNotFoundException。这是由于缺乏了hadoop或者hbase的jar包,只要找到这些jar包拷贝到hive/lib目录下便可。

5.2内部表

hbase中没有建立表,直接在hive中建立内部表,间接在hbase中建立出表

>create table hbase_table_1(key int, value string)

stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

with serdeproperties ("hbase.columns.mapping" = ":key,cf1:val")

tblproperties ("hbase.table.name" = "xyz");

6.使用serde导入json到hive中:

实际使用时可能会有这样的场景,就是把json格式的文件数据导入到hive中,能够经过serde的方式,常见的有2种serde分别介绍下。

6.1经过hive-json-serde-0.2.jar(google code)导入:把hive-json-serde-0.2.jar拷贝到hive/lib下

执行建表

CREATE TABLE thxd

(

    callType STRING,

    callMobile STRING,

    callTime STRING,

    callTimeCost STRING

)

ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.JsonSerde'

STORED AS TEXTFILE;

再导入json文件

LOAD DATA LOCAL INPATH "/home/hadoop/thxd.txt" OVERWRITE INTO TABLE thxd;

注意1)thxd.txt是在linux文件系统上的,不是hdfs里,因此从local导入。也能够从hdfs里导入。

2)txhd.txt里并非合法的json格式,若是改为合法的hive-json-serde-0.2.jar将没法工做。

7.2经过https://github.com/rcongiu/Hive-JSON-Serde 的serde

把json-serde-1.3-jar-with-dependencies.jar拷贝到hive/lib

>CREATE TABLE complex_json (

  DocId string,

  User struct<Id:int,

              Username:string,

              Name: string,

              ShippingAddress:struct<Address1:string,

                                     Address2:string,

                                     City:string,

                                     State:string>,

              Orders:array<struct<ItemId:int,

                                  OrderDate:string>>>

)

ROW FORMAT SERDE'org.openx.data.jsonserde.JsonSerDe';                            

>LOAD DATA LOCAL INPATH'/home/hadoop/test.json' OVERWRITE INTO TABLE complex_json;

>SELECT User.Orders FROM complex_json;

8.经过内置函数json_tuple和get_json_object导入json进入hive

因为get_json_object效率低下,官方推荐使用json_tuple

8.1经过json_tuple导入

8.1.1先建表:

>CREATE TABLE thxd_json ( json string );

8.1.2导入数据(这个是标准的json格式文件,后缀名不要紧,但格式要对。可在http://www.bejson.com/在线检查json格式)

>LOAD DATA LOCAL INPATH '/home/hadoop/test.json' INTO TABLE json_table;

8.1.3使用json_tuple查询

>select v1.code, v1.errorDescription, v2.callMobile, v2.callTimeCost

from thxd_json jt

     LATERAL VIEW json_tuple(jt.json,'code','errorDescription','dataObject') v1

     as code, errorDescription, dataObject

     LATERAL VIEW json_tuple(v1.dataObject,'callMobile','callTimeCost') v2

     as callMobile, callTimeCost;

相关文章
相关标签/搜索