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;

相關文章
相關標籤/搜索