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數據庫
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下。
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或者在客戶機上訪問
至此,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的線程了。
一旦中止後,瀏覽器中也訪問不到頁面了。
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頁面也打不開了。
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;