1. 程式人生 > >Hadoop Hive與Hbase整合+thrift

Hadoop Hive與Hbase整合+thrift

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

1.  簡介

Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合資料倉庫的統計分析。

Hive與HBase的整合功能的實現是利用兩者本身對外的API介面互相進行通訊,相互通訊主要是依靠hive_hbase-handler.jar工具類, 大致意思如圖所示:



2.  Hive專案介紹

專案結構
 

Hive配置檔案介紹
•hive-site.xml      hive的配置檔案
•hive-env.sh        hive的執行環境檔案
•hive-default.xml.template  預設模板
•hive-env.sh.template     hive-env.sh預設配置
•hive-exec-log4j.properties.template   exec預設配置
• hive-log4j.properties.template log預設配置
hive

-site.xml
< property>
  <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/hive?createData baseIfNotExist=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>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
   <description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
   <value>test</value>
   <description>password to use against metastore database</description>
</property>
  

hive-env.sh
•配置Hive的配置檔案路徑
•export HIVE_CONF_DIR= your path
•配置Hadoop的安裝路徑
•HADOOP_HOME=your hadoop home

我們按資料元的儲存方式不同安裝。


3.  使用Derby資料庫安裝

什麼是Derby安裝方式 •Apache Derby是一個完全用java編寫的資料庫,所以可以跨平臺,但需要在JVM中執行 •Derby是一個Open source的產品,基於Apache License 2.0分發 •即將元資料儲存在Derby資料庫中,也是Hive預設的安裝方式


1 .Hadoop和Hbase都已經成功安裝了

Hadoop叢集配置:http://blog.csdn.net/hguisu/article/details/723739

hbase安裝配置:http://blog.csdn.net/hguisu/article/details/7244413

2. 下載hive

hive目前最新的版本是0.12,我們先從http://mirror.bit.edu.cn/apache/hive/hive-0.12.0/ 上下載hive-0.12.0.tar.gz,但是請注意,此版本基於是基於hadoop1.3和hbase0.94的(如果安裝hadoop2.X ,我們需要修改相應的內容)

3. 安裝:

tar zxvf hive-0.12.0.tar.gz 

 cd hive-0.12.0


4. 替換jar包,與hbase0.96和hadoop2.2版本一致。

   由於我們下載的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 或者是http://svn.apache.org/repos/asf/hive/trunk   我們下載到 /home/hadoop/branch-0.12下。
    2.  branch-0.12是使用ant編譯,trunk下面是使用maven編譯,如果未按照maven,需要從 http://maven.apache.org/download.cgi  下載maven,或者使用yum install maven。然後解壓出來並在PATH下把$maven_home/bin加入或者使用連結(ln -s /usr/local/bin/mvn $maven_home/bin ).然後就是使用mvn 命令。 執行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下     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保持一致,如果不一致,

       拷貝protobuf.**.jar和zookeeper-3.4.5.jar到hive/lib下。

      7.如果用mysql當原資料庫,       別忘了找一個mysql的jdbcjar包 mysql-connector-java-3.1.12-bin.jar也拷貝到hive-0.12.0/lib下

5. 配置hive

•進入hive-0.12/conf目錄 •依據hive-env.sh.template,建立hive-env.sh檔案 •cp  hive-env.sh.template hive-env.sh •修改hive-env.sh •指定hive配置檔案的路徑 •export HIVE_CONF_DIR=/home/hadoop/hive-0.12/conf •指定Hadoop路徑 • HADOOP_HOME=/home/hadoop/hadoop-2.2.0
hive-site.xml [html] view plain copy print ?
  1. <code class="language-html"><?xml version="1.0"?>  
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
  3. <configuration>  
  4.   
  5. <!-- Hive Execution Parameters -->  
  6.   
  7. <property>  
  8.   <name>hive.exec.reducers.bytes.per.reducer</name>  
  9.   <value>1000000000</value>  
  10.   <description>size per reducer.The default is 1G, i.e if the input size is 10G, it will use 10 reducers.</description>  
  11. </property>  
  12.   
  13. <property>  
  14.   <name>hive.exec.reducers.max</name>  
  15.   <value>999</value>  
  16.   <description>max number of reducers will be used. If the one  
  17.         specified in the configuration parameter mapred.reduce.tasks is  
  18.         negative, hive will use this one as the max number of reducers when  
  19.         automatically determine number of reducers.</description>  
  20. </property>  
  21.   
  22. <property>  
  23.   <name>hive.exec.scratchdir</name>  
  24.   <value>/hive/scratchdir</value>  
  25.   <description>Scratch space for Hive jobs</description>  
  26. </property>  
  27.   
  28. <property>  
  29.   <name>hive.exec.local.scratchdir</name>  
  30.   <value>/tmp/${user.name}</value>  
  31.   <description>Local scratch space for Hive jobs</description>  
  32. </property>  
  33. <property>  
  34.   <name>javax.jdo.option.ConnectionURL</name>  
  35.   <value>jdbc:derby:;databaseName=metastore_db;create=true</value>  
  36.   <description>JDBC connect string for a JDBC metastore</description>  
  37. </property>  
  38.   
  39. <property>  
  40.   <name>javax.jdo.option.ConnectionDriverName</name>  
  41.   <value>org.apache.derby.jdbc.EmbeddedDriver</value>  
  42.   <description>Driver class name for a JDBC metastore</description>  
  43. </property>  
  44.   
  45. <property>  
  46.   <name>javax.jdo.PersistenceManagerFactoryClass</name>  
  47.   <value>org.datanucleus.api.jdo.JDOPersistenceManagerFactory</value>  
  48.   <description>class implementing the jdo persistence</description>  
  49. </property>  
  50.   
  51. <property>  
  52.   <name>javax.jdo.option.DetachAllOnCommit</name>  
  53.   <value>true</value>  
  54.   <description>detaches all objects from session so that they can be used after transaction is committed</description>  
  55. </property>  
  56.   
  57. <property>  
  58.   <name>javax.jdo.option.ConnectionUserName</name>  
  59.   <value>APP</value>  
  60.   <description>username to use against metastore database</description>  
  61. </property>  
  62.   
  63. <property>  
  64.   <name>javax.jdo.option.ConnectionPassword</name>  
  65.   <value>mine</value>  
  66.   <description>password to use against metastore database</description>  
  67. </property>  
  68.   
  69. <property>  
  70.   <name>hive.metastore.warehouse.dir</name>  
  71.   <value>/hive/warehousedir</value>  
  72.   <description>location of default database for the warehouse</description>  
  73. </property>  
  74.   
  75.   
  76. <property>  
  77.  <name>hive.aux.jars.path</name>  
  78.   <value>  
  79.   file:///home/hadoop/hive-0.12.0/lib/hive-ant-0.13.0-SNAPSHOT.jar,  
  80.   file:///home/hadoop/hive-0.12.0/lib/protobuf-java-2.4.1.jar,  
  81.   file:///home/hadoop/hive-0.12.0/lib/hbase-client-0.96.0-hadoop2.jar,  
  82.   file:///home/hadoop/hive-0.12.0/lib/hbase-common-0.96.0-hadoop2.jar,  
  83.   file:///home/hadoop/hive-0.12.0/lib/zookeeper-3.4.5.jar,  
  84.   file:///home/hadoop/hive-0.12.0/lib/guava-11.0.2.jar  
  85.   </value>  
  86. </property></code>  
<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><!-- Hive Execution Parameters --><property>  <name>hive.exec.reducers.bytes.per.reducer</name>  <value>1000000000</value>  <description>size per reducer.The default is 1G, i.e if the input size is 10G, it will use 10 reducers.</description></property><property>  <name>hive.exec.reducers.max</name>  <value>999</value>  <description>max number of reducers will be used. If the one        specified in the configuration parameter mapred.reduce.tasks is        negative, hive will use this one as the max number of reducers when        automatically determine number of reducers.</description></property><property>  <name>hive.exec.scratchdir</name>  <value>/hive/scratchdir</value>  <description>Scratch space for Hive jobs</description></property><property>  <name>hive.exec.local.scratchdir</name>  <value>/tmp/${user.name}</value>  <description>Local scratch space for Hive jobs</description></property><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.PersistenceManagerFactoryClass</name>  <value>org.datanucleus.api.jdo.JDOPersistenceManagerFactory</value>  <description>class implementing the jdo persistence</description></property><property>  <name>javax.jdo.option.DetachAllOnCommit</name>  <value>true</value>  <description>detaches all objects from session so that they can be used after transaction is committed</description></property><property>  <name>javax.jdo.option.ConnectionUserName</name>  <value>APP</value>  <description>username to use against metastore database</description></property><property>  <name>javax.jdo.option.ConnectionPassword</name>  <value>mine</value>  <description>password to use against metastore database</description></property><property>  <name>hive.metastore.warehouse.dir</name>  <value>/hive/warehousedir</value>  <description>location of default database for the warehouse</description></property><property> <name>hive.aux.jars.path</name>  <value>  file:///home/hadoop/hive-0.12.0/lib/hive-ant-0.13.0-SNAPSHOT.jar,  file:///home/hadoop/hive-0.12.0/lib/protobuf-java-2.4.1.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>

Hive使用Hadoop,這意味著你必須在PATH裡面設定了hadoop路徑,或者匯出export HADOOP_HOME=<hadoop-install-dir>也可以。 另外,你必須在建立Hive庫表前,在HDFS上建立/tmp和/hive/warehousedir(也稱為hive.metastore.warehouse.dir的),並且將它們的許可權設定為chmod g+w。完成這個操作的命令如下:
$ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp
$ $HADOOP_HOME/bin/hadoop fs -mkdir /hive/warehousedir
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w/hive/warehousedir
    我同樣發現設定HIVE_HOME是很重要的,但並非必須。
$ export HIVE_HOME=<hive-install-dir>
    在Shell中使用Hive命令列(cli)模式:
$ $HIVE_HOME/bin/hive

5. 啟動hive

1).單節點啟動

#bin/hive -hiveconf hbase.master=master:490001

2) 叢集啟動:

#bin/hive -hiveconf hbase.zookeeper.quorum=node1,node2,node3

如何hive-site.xml檔案中沒有配置hive.aux.jars.path,則可以按照如下方式啟動。

bin/hive --auxpath /usr/local/hive/lib/hive-hbase-handler-0.96.0.jar, /usr/local/hive/lib/hbase-0.96.jar, /usr/local/hive/lib/zookeeper-3.3.2.jar -hiveconf hbase.zookeeper.quorum=node1,node2,node3

啟動直接#bin/hive 也可以。

6 測試hive

•建立測試表 pokes hive> CREATE TABLE pokes (foo INT, bar STRING);
OK
Time taken: 1.842 seconds
hive> show tables;                             
OK
pokes
Time taken: 0.182 seconds, Fetched: 1 row(s)
  •資料匯入 pokes
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO pokse

然後檢視hadoop的檔案: bin/hadoop dfs -ls /hive/warehousedir
看到新增一個檔案: drwxr-xr-x   - hadoop supergroup     0  09:06 /hive/warehousedir/pokes

注:使用derby儲存方式時,執行hive會在當前目錄生成一個derby檔案一個metastore_db目錄。這種儲存方式的弊端是在同一個目錄下同時只能有一個hive客戶端能使用資料庫,否則報錯。


4.  使用MYSQL資料庫的方式安裝

安裝MySQL
• Ubuntu 採用apt-get安裝
• sudo apt-get install mysql-server
• 建立資料庫hive
• create database hivemeta
• 建立hive使用者,並授權
• grant all on hive.* to [email protected]'%'  identified by 'hive';  
• flush privileges;  

我們直接修改hive-site.xml就可以啦。

修改hive-site.xml <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>


<property>
  <name>hive.exec.scratchdir</name>
  <value>/hive/scratchdir</value>
  <description>Scratch space for Hive jobs</description>
</property>


<property>
  <name>hive.exec.local.scratchdir</name>
  <value>/tmp/${user.name}</value>
  <description>Local scratch space for Hive jobs</description>
</property>
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://192.168.1.214:3306/hiveMeta?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>


<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hive</value>
  <description>username to use against metastore database</description>
</property>


<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>hive</value>
  <description>password to use against metastore database</description>
</property>



<property>
  <name>hive.metastore.warehouse.dir</name>
  <value>/hive/warehousedir</value>
  <description>location of default database for the warehouse</description>
</property>

<property>
 <name>hive.aux.jars.path</name>
  <value>
  file:///home/hadoop/hive-0.12.0/lib/hive-ant-0.13.0-SNAPSHOT.jar,
  file:///home/hadoop/hive-0.12.0/lib/protobuf-java-2.4.1.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>

jdbc:mysql://192.168.1.214:3306/hiveMeta?createDatabaseIfNotExist=true 其中hiveMeta是mysql的資料庫名createDatabaseIfNotExist沒有就自動建立

本地mysql啟動hive :


直接執行#bin/hive 就可以。


遠端mysql方式,啟動hive:


伺服器端(192.168.1.214上機master上):


     在伺服器端啟動一個 MetaStoreServer,客戶端利用 Thrift 協議通過 MetaStoreServer 訪問元資料庫。

   啟動hive,這個又可以分為啟動metastore和hiveserver,其中metastore用於和mysql之間的表結構建立或更新時通訊,hiveserver用於客戶端連線,這這個都要啟動,具體的啟動命令: 啟動metastore: hive --service metastore     -hiveconf hbase.zookeeper.quorum=node1,node2,node3 -hiveconf hbase.zookeeper.property.clientPort=2222   (遠端mysql需要啟動)
啟動hiveservice: hive --service hiveserver    -hiveconf hbase.zookeeper.quorum= node1, node2,node3   -hiveconf hbase.zookeeper.property.clientPort=2222  (啟動服務,這樣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=2222 其中 hbase.zookeeper.property.clientPort就是hbase-site.xml配置的zookeeper的埠號。

客戶端hive 的hive-site.xml配置檔案:
<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration><property>  <name>hive.metastore.warehouse.dir</name>  <value>/hive/warehousedir</value></property> <property>  <name>hive.metastore.local</name>  <value>false</value></property><property>  <name>hive.metastore.uris</name>  <value>thrift://192.168.1.214:9083</value></property></configuration>
這一步,我們新加了配置 <property>  
  <name>hive.metastore.uris</name>  
  <value>thrift://192.168.1.214:9083</value>  
</property>  
這個就是使用thrift訪問的埠配置。thrift://192.168.1.214:9083就是hive元資料訪問路徑

進入hive客戶端,執行show tables;
至此,可以在linux用各種shell來測試,也可以通過eclipse連線到hive來測試,和通過jdbc連線普通資料庫一致
hive的服務端和客戶端都可以放在同一臺伺服器上:
hive-site.xml

<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><property>  <name>hive.exec.scratchdir</name>  <value>/hive/scratchdir</value>  <description>Scratch space for Hive jobs</description></property><property>  <name>hive.exec.local.scratchdir</name>  <value>/tmp/${user.name}</value>  <description>Local scratch space for Hive jobs</description></property><property>  <name>javax.jdo.option.ConnectionURL</name>  <value>jdbc:mysql://192.168.1.214:3306/hiveMeta?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><property>  <name>javax.jdo.option.ConnectionUserName</name>  <value>hive</value>  <description>username to use against metastore database</description></property><property>  <name>javax.jdo.option.ConnectionPassword</name>  <value>hive</value>  <description>password to use against metastore database</description></property><property>  <name>hive.metastore.warehouse.dir</name>  <value>/hive/warehousedir</value>  <description>location of default database for the warehouse</description></property><property> <name>hive.aux.jars.path</name>  <value>  file:///home/hadoop/hive-0.12.0/lib/hive-ant-0.13.0-SNAPSHOT.jar,  file:///home/hadoop/hive-0.12.0/lib/protobuf-java-2.4.1.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>    <name>hive.metastore.uris</name>    <value>thrift://192.168.1.214:9083</value>  </property>  </property>




4.  與Hbase整合

之前我們測試建立表的都是建立本地表,非hbase對應表。現在我們整合回到hbase。

1.建立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");  

hbase.table.name 定義在hbase的table名稱

hbase.columns.mapping 定義在hbase的列族