文章出處

環境:mac OS X Yosemite + hadoop 2.6.0 + hive 1.2.0 + jdk 1.7.0_79

前提:hadoop必須先安裝,且處于運行狀態(偽分式模式或全分布模式均可)

hive官網地址:http://hive.apache.org/

建議:經個人實踐,在mac OS X Yosemite 環境下,如果使用apache下載的原始hadoop 2.6.0,不管jdk安裝成什么版本(1.6\1.7\1.8都試過),hive 1.2.0啟動時,始終報jdk版本不匹配,后來在mac上將hadoop 2.6.0源編譯成mac原生版本后,就正常了。

如果有朋友也遇到類似情況,請參考  mac OS X Yosemite 上編譯hadoop 2.6.0/2.7.0及TEZ 0.5.2/0.7.0 注意事項

一、環境變量

...
export HADOOP_HOME=/home/hadoop/hadoop-2.6.0
export HIVE_HOME=/home/hadoop/hive-1.2.0
...
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
...
export PATH=${HIVE_HOME}/bin:$PATH:$HOME/bin:

三、修改hive中的xml配置

cp hive-default.xml.template hive-default.xml

cp hive-default.xml.template hive-site.xml

cp hive-exec-log4j.properties.template hive-exec-log4j.properties

cp hive-log4j.properties.template hive-log4j.properties

cp beeline-log4j.properties.template beeline-log4j.properties

即:把幾個帶.template后綴的模板文件,復制一份變成不帶.template的配置文件,注意hive-default.xml.template這個要復制二份,一個是hive-default.xml,另一個是hive-site.xml,其中hive-site.xml為用戶自定義配置,hive-default.xml為全局配置,hive啟動時,-site.xml自定義配置會覆蓋-default.xml全局配置的相同配置項。

 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 2 
 3 <configuration>
 4 
 5     <property>
 6         <name>hive.metastore.local</name>
 7         <value>true</value>
 8     </property>
 9     
10    <!-- 
11     <property>
12         <name>javax.jdo.option.ConnectionURL</name>
13         <value>jdbc:postgresql://localhost:5432/hive</value>
14     </property>
15     
16     <property>
17         <name>javax.jdo.option.ConnectionDriverName</name>
18         <value>org.postgresql.Driver</value>
19     </property>
20     -->
21    
22    
23     <property>
24         <name>javax.jdo.option.ConnectionURL</name>
25         <value>jdbc:mysql://127.0.0.1:3306/hive?characterEncoding=UTF-8</value>
26     </property>
27     
28     <property>
29         <name>javax.jdo.option.ConnectionDriverName</name>
30         <value>com.mysql.jdbc.Driver</value>
31     </property>
32     
33     <property>
34         <name>javax.jdo.option.ConnectionUserName</name>
35         <value>hive</value>
36     </property>
37     
38     <property>
39         <name>javax.jdo.option.ConnectionPassword</name>
40         <value>hive</value>
41     </property>
42     
43    
44     <property>
45         <name>hive.exec.scratchdir</name>
46         <value>/tmp/hive</value>
47     </property>
48     
49     <property>
50         <name>hive.exec.local.scratchdir</name>
51         <value>/Users/jimmy/app/hive-1.2.0/tmp</value>
52     </property>
53 
54     <property>
55         <name>hive.downloaded.resources.dir</name>
56         <value>/Users/jimmy/app/hive-1.2.0/tmp/${hive.session.id}_resources</value>
57     </property>
58 
59     <property>
60         <name>hive.metastore.warehouse.dir</name>
61         <value>/user/hive/warehouse</value>    
62     </property>
63 
64 </configuration>

注:hive中有一個元數據的概念,元數據記錄了當前有哪些表,哪些字段,字段數據類型等,由于hdfs是沒有這些額外信息的,因此hive需要借助傳統數據庫來記錄這些元數據信息,默認情況下,采用內置數據庫derby來記錄,也可以通過配置將這些元數據記錄到mssql\mysql\oracle\postgreSQL等大型RDMBS中,上面的配置中,演示了MYSQL、PostgreSQL二種配置,如果把23-41注釋掉,就變成derby獨立模式。

另:上面的配置文件中,有一些關于目錄的參數,先提前把目錄建好,

hive.exec.local.scratchdir
hive.downloaded.resources.dir

這二項對應的目錄,是指本地目錄(必須先手動建好),其它目錄為hdfs中的目錄(hive啟動時,先自動建好,如果自動創建失敗,也可以手動通過shell在hdfs中創建)

 

四、替換hadoop 2.6.0中的jline jar包

由于hive 1.2.0自帶的jline包跟hadoop 2.6.0自帶的版本不一致,因此需要將$HIVE_HOME/lib/jline-2.12.jar 這個文件替換掉$HADOOP_HOME/share/hadoop/yarn/lib 下原來的版本 (即:將舊版本刪除,復制新版本到此目錄),否則hive啟動將失敗

 

五、測試及驗證

$HIVE_HOME/bin/hive

如果能正常進入 hive> 即表示正常

a) 創建表測試

hive>create table test(id int);

b) 將hdfs中的文件內容加載到表中

hive> load data inpath '/input/duplicate.txt' into table test;

注:duplicate.txt的內容可在以前的博客文章中找到

c) 測試求平均值

hive> select avg(id) from test;

Query ID = jimmy_20150607191924_ccfb231f-6c92-47ac-88f1-eb32882a0010

Total jobs = 1

Launching Job 1 out of 1

Number of reduce tasks determined at compile time: 1

In order to change the average load for a reducer (in bytes):

  set hive.exec.reducers.bytes.per.reducer=<number>

In order to limit the maximum number of reducers:

  set hive.exec.reducers.max=<number>

In order to set a constant number of reducers:

  set mapreduce.job.reduces=<number>

Job running in-process (local Hadoop)

2015-06-07 19:19:27,980 Stage-1 map = 100%,  reduce = 100%

Ended Job = job_local1537497991_0001

MapReduce Jobs Launched: 

Stage-Stage-1:  HDFS Read: 190 HDFS Write: 0 SUCCESS

Total MapReduce CPU Time Spent: 0 msec

OK

3.909090909090909

Time taken: 3.322 seconds, Fetched: 1 row(s)

從輸出的信息看,hive底層仍然是將SQL語句翻譯成mapreduce作業,提交給hadoop的MR引擎。從使用層面看,采用SQL語句方式來分析數據,確實比MapReducePIG方式方便太多了。

 

 

 

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()