圖片來源:http://hadoop.apache.org/hive/

前陣子接觸 HadoopDB 後,發現它搭配使用的 Hive 很有特色,在安裝 HadoopDB ,也必須要有些微 Hive 的相關知識,當時很幸運地找到別人安裝的筆記,才解除我的困惑。緊接著我也在 VLDB 2009 看到這篇 Hive - A Warehousing Solution Over a MapReduce Framework ,與 HadoopDB 在同一個 conference 上,HadoopDB: An Architectural Hybrid of MapReduce and DBMS Technologies for Analytical Workloads,可真巧啊。


圖片來源:Hive/Design

之後,又在網路上找到 facebook 分享的投影片,內容我覺得還算豐富,讓我想起碩班一些處理大型資料的作業與老師的經驗分享,而看這些投影片,可以很清楚的看到 Hadoop & Hive 明確的負責資料分析的部份。

其他相關的投影片:Hive/Presentations

關於 Hive 安裝部份,首先要架一個 Cluster 出來,可以參考 [Linux] 安裝 Hadoop 0.20.1 Multi-Node Cluster @ Ubuntu 9.10 (以下的內容依此篇文章當作範例),並且使用 wordcount 來驗證系統是否正常架設,若一切 OK 後,可以在 Hive/GettingStarted 查看如何取得原始碼以及使用 ant 編譯它,也可以參考 Ant Tutorial ,當然,也可以直接下載編譯好的 jar 檔案:Hive Releases,在此使用 hive-0.4.1

登入 Cluster01 並執行以下動作:

  • $ cd ~/
    $ wget http://ftp.mirror.tw/pub/apache/hadoop/hive/hive-0.4.1/hive-0.4.1-bin.tar.gz
    $ tar -xvf hive-0.4.1-bin.tar.gz
  • $ vim .profile
    export HADOOP_HOME=/home/hadoop
    export HIVE_HOME=/home/hadoop/hive-0.4.1-bin
    PATH="$HIVE_HOME/bin:$PATH"

以上就完成簡單快速的架設了。

預設 Hive 使用 embeded database - Derby 紀錄 metastore 資料(metastore_db),所以同一時間只允許一個 client 向它進行 query 。這在開發期間可能還沒問題,但一旦要上線使用時,應該要轉成 Server 的方式,可以在 Hive using Derby in Server Mode 查看如何設定。

尚未設定成 Server Mode 時,多個 Client 運行會顯示的錯訊息:

Hive history file=/tmp/hadoop/hive_job_log_hadoop_201001190939_1789192385.txt
hive> show tables;
FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 'metastore_db', see the next exception for details.
NestedThrowables:
java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

登入 Cluster01 (以它架 Derby Server) 並執行以下動作:

  • $ cd ~/
    $ wget http://apache.ntu.edu.tw/db/derby/db-derby-10.5.3.0/db-derby-10.5.3.0-bin.tar.gz
    $ tar -xvf db-derby-10.5.3.0-bin.tar.gz
    $ mkdir db-derby-10.5.3.0-bin/data
  • $ vim ~/.profile
    export DERBY_INSTALL=/home/hadoop/db-derby-10.5.3.0-bin
    export DERBY_HOME=/home/hadoop/db-derby-10.5.3.0-bin
    export HADOOP=/home/hadoop/bin/hadoop
  • $ cd ~/db-derby-10.5.3.0-bin/data/
    $ nohup ~/db-derby-10.5.3.0-bin/bin/startNetworkServer -h 0.0.0.0 &
  • $ vim ~/hive-0.4.1-bin/conf/hive-site.xml
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

    <configuration>

    <property>
      <name>hive.metastore.local</name>
      <value>true</value>
      <description>controls whether to connect to remove metastore server or open a new metastore server in Hive Client JVM</description>
    </property>

    <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:derby://Cluster01:1527/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.ClientDriver</value>
      <description>Driver class name for a JDBC metastore</description>
    </property>

    </configuration>
  • $ cp ~/db-derby-10.5.3.0-bin/lib/derbyclient.jar ~/hive-0.4.1-bin/lib/
    $ cp ~/db-derby-10.5.3.0-bin/lib/derbytools.jar ~/hive-0.4.1-bin/lib/

確保各個要跑 Hive 的 Client 要有相關 library 及 hive-site.xml 檔案來得知 Derby Server 位置,在此直接複製 Cluster01 的相關資料

Cluster01:~ $ scp ~/.profile hadoop02:~/
Cluster01:~ $ scp -r ~/hive-0.4.1-bin hadoop02:~/

當 Hive 可以提供多個 Client 進行 Query 後,還可以試試 Web Interface ,相關的設定資訊可參考 Hive Web Interface 囉。在 Hive 上使用 Jetty 當作 Web Server ,但它需要 ANT 的支援。

登入 Cluster01 (以它架 Derby Server) 並執行以下動作:

  • $ wget http://apache.ntu.edu.tw/ant/binaries/apache-ant-1.8.0RC1-bin.tar.gz
    $ tar -xvf apache-ant-1.8.0RC1-bin.tar.gz
  • $ vim ~/.profile
    export ANT_LIB=/home/hadoop/apache-ant-1.8.0RC1/lib

測試 Web Interface

  • $ hive --service hwi 
    • 錯誤訊息:FATAL hwi.HWIServer: HWI WAR file not found at ${HIVE_HOME}/lib/hive-hwi.war
    • 發現 ${HIVE_HOME}/lib 中只有 hive_hwi.war ,所以就用 hive-site.xml 來更新位置吧!
      • <property>
          <name>hive.hwi.war.file</name>
          <value>${HIVE_HOME}/lib/hive_hwi.war</value>
          <description>This is the WAR file with the jsp content for Hive Web Interface</description>
        </property>
      • 若還是一樣的錯誤訊息,那可以直接把 ${HIVE_HOME} 用 /home/hadoop/hive-0.4.1-bin 取代吧
    • 若啟動沒其他錯誤訊息,可以來測試連線囉!
      • http://Cluster01:9999/hwi/
    • 確定無誤後,可以改用這種方式啟動,但我比較喜歡用 hive --service hwi 開啟,還可以看 log 啦
      • $ nohup bin/hive --service hwi > /dev/null 2> /dev/null &
  • 從 Web 端發 Query
    • 流程請參考 Hive Web Interface
      • 使用 Create Session 建立 session
      • 從 List Sessions 去挑剛剛建立的 session ,使用 Manage,設定一下 Result file,接下來就像 command line 一樣下下指令
整體上,覺得 Web interface 好像太簡單化了,或許在現階段仍只算是個雛型。

最後,相關學習資料,大概看完 Hive/Tutorial 就差不多了解架構,別忘了也要看看 Facebook 那些投影片


changyy 發表在 痞客邦 PIXNET 留言(0) 人氣()