1. 程式人生 > >hive(01)、基於hadoop叢集的資料倉庫Hive搭建實踐

hive(01)、基於hadoop叢集的資料倉庫Hive搭建實踐

在前面hadoop的一系列文中,我們對hadoop有了初步的認識和使用,以及可以搭建完整的叢集和開發簡單的MapReduce專案,下面我們開始學習基於Hadoop的資料倉庫Apache Hive,將結構化的資料檔案對映為一張資料庫表,將sql語句轉換為MapReduce任務進行執行的實踐,hadoop系列深入學習的文章還會繼續。

分享之前我還是要推薦下我自己建立的大資料學習資料分享群 232840209,不管你是小白還是大牛,小編我都挺歡迎,今天的原始碼已經上傳到群檔案,不定期分享乾貨,包括我自己整理的一份最新的適合2017年學習的前端資料和零基礎入門教程,歡迎初學和進階中的小夥伴

一、Apache Hive簡介

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

        Hive是建立在 Hadoop 上的資料倉庫基礎構架。它提供了一系列的工具,可以用來進行資料提取轉化載入(ETL),這是一種可以儲存、查詢和分析儲存在 Hadoop 中的大規模資料的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的使用者查詢資料。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 無法完成的複雜的分析工作。Hive 沒有專門的資料格式。 Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允許使用者指定資料格式。

二、Apache Hive場景

        Hive 構建在基於靜態批處理的Hadoop 之上,Hadoop 通常都有較高的延遲並且在作業提交和排程的時候需要大量的開銷。因此,Hive 並不能夠在大規模資料集上實現低延遲快速的查詢,例如,Hive 在幾百MB 的資料集上執行查詢一般有分鐘級的時間延遲。因此,

        Hive 並不適合那些需要低延遲的應用,例如,聯機事務處理(OLTP)。Hive 查詢操作過程嚴格遵守Hadoop MapReduce 的作業執行模型,Hive 將使用者的HiveQL 語句通過直譯器轉換為MapReduce 作業提交到Hadoop 叢集上,Hadoop 監控作業執行過程,然後返回作業執行結果給使用者。Hive 並非為聯機事務處理而設計,Hive 並不提供實時的查詢和基於行級的資料更新操作。Hive 的最佳使用場合是大資料集的批處理作業,例如,網路日誌分析。

        Hive 是一種底層封裝了Hadoop 的資料倉庫處理工具,使用類SQL 的HiveQL 語言實現資料查詢,所有Hive 的資料都儲存在Hadoop 相容的檔案系統(例如,Amazon S3、HDFS)中。Hive 在載入資料過程中不會對資料進行任何的修改,只是將資料移動到HDFS 中Hive 設定的目錄下,因此,Hive 不支援對資料的改寫和新增,所有的資料都是在載入的時候確定的。Hive 的設計特點如下:

        1.支援索引,加快資料查詢。

        2.不同的儲存型別,例如,純文字檔案、HBase 中的檔案。

        3.將元資料儲存在關係資料庫中,大大減少了在查詢過程中執行語義檢查的時間。

        4.可以直接使用儲存在Hadoop 檔案系統中的資料。

        5.內建大量使用者函式UDF 來操作時間、字串和其他的資料探勘工具,支援使用者擴充套件UDF 函式來完成內

           置函式無法實現的操作。

        6.類SQL 的查詢方式,將SQL 查詢轉換為MapReduce 的job 在Hadoop叢集上執行。

三、環境準備

        1.hadoop叢集環境

        2.mysql資料庫服務

        3.mysql資料庫驅動

           下載地址:https://dev.mysql.com/downloads/connector/j/

        4.Apache Hive安裝包

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

           下載地址:http://www.apache.org/dyn/closer.cgi/hive/

            

            環境說明:

            和hadoop的主節點公用機器:

            192.168.1.10   Master主節點

            192.168.1.50   Mysql資料庫服務

四、安裝準備

        1.使用FTP上傳Hive程式包到機器上

           

        2.解壓上傳的hive程式包

           

        3.刪除程式包修改目錄名稱

           

五、安裝過程

        1.環境變數配置

           執行vi /etc/profile輸入以下hive的環境變數

           export HIVE_HOME=/home/hive/hive-2.3.2
           export PATH=$HIVE_HOME/bin:$PATH

           

          執行source /etc/profile使其立即生效

       2.修改hive指令碼檔案

          修改 hive-env.sh指令碼檔案

          首先cp hive-env.sh.template  hive-env.sh

           

           然後編輯 vi  hive-env.sh指令碼

           HADOOP_HOME=/home/hadoop/hadoop-2.8.2

           

          修改hive-site.xml 配置檔案

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

           

          然後編輯vi hive-site.xml 配置檔案,配置mysql元資料庫資訊

          <configuration>
          <!--源資料儲存資料庫地址-->
          <property>
                   <name>javax.jdo.option.ConnectionURL</name>
                   <value>jdbc:mysql://hdpc05:3306/hive?createDatabaseIfNotExist=true&amp;

                                 characterEncoding=utf8&amp;useSSL=true</value>
                   </property>
          <!--源資料儲存資料庫驅動-->
          <property>
                   <name>javax.jdo.option.ConnectionDriverName</name>
                   <value>com.mysql.jdbc.Driver</value>
          </property>
          <!--源資料儲存資料庫使用者-->
          <property>
                   <name>javax.jdo.option.ConnectionUserName</name>
                   <value>root</value>
          </property>
          <!--源資料儲存資料庫密碼-->
          <property>
                   <name>javax.jdo.option.ConnectionPassword</name>
                   <value>123456</value>
          </property>
          <!--自動建立Schema-->
          <property>
                   <name>datanucleus.autoCreateSchema</name>
                   <value>true</value>
          </property>
          <!--自動建立Tables-->
          <property>
                   <name>datanucleus.autoCreateTables</name>
                   <value>true</value>
          </property>
          <!--自動建立Columns-->
          <property>
                   <name>datanucleus.autoCreateColumns</name>
                   <value>true</value>
          </property>
          <!--設定hive倉庫的HDFS上的位置-->
          <property>
                   <name>hive.metastore.warehouse.dir</name>
                   <value>/user/hive/warehouse</value>
          </property>
          <!--資源臨時檔案存放位置-->
          <property>
                   <name>hive.downloaded.resources.dir</name>
                   <value>/home/hive/hive-2.3.2/tmp/resources</value>
          </property>
          <!--修改日誌位置-->
          <property>
                   <name>hive.exec.local.scratchdir</name>
                   <value>/home/hive/hive-2.3.2/logs/HiveJobsLog</value>
          </property>
          <property>
                   <name>hive.downloaded.resources.dir</name>
                   <value>/home/hive/hive-2.3.2/logs/ResourcesLog</value>
          </property>
          <property>
                   <name>hive.querylog.location</name>
                   <value>/home/hive/hive-2.3.2/logs/HiveRunLog</value>
          </property>
          <property>
                   <name>hive.server2.logging.operation.log.location</name>
                   <value>/home/hive/hive-2.3.2/logs/OpertitionLog</value>
          </property>
          <!--配置HWI介面-->
          <property>  
                   <name>hive.hwi.war.file</name>  
                   <value>/home/hive/hive-2.3.2/lib/hive-hwi-2.1.1.jar</value>  
          </property>  
          <property>  
                    <name>hive.hwi.listen.host</name>  
                    <value>hdpc01</value>  
          </property>  
          <property>  
                   <name>hive.hwi.listen.port</name>  
                   <value>9999</value>  
          </property>
          <!--thrift服務配置-->
          <property>
                   <name>hive.server2.thrift.bind.host</name>
                   <value>hdpc01</value>
           </property>
           <property>
                    <name>hive.server2.thrift.port</name>
                    <value>10000</value>
           </property>
           <property>
                    <name>hive.server2.thrift.http.port</name>
                    <value>10001</value>
           </property>
           <property>
                    <name>hive.server2.thrift.http.path</name>
                    <value>cliservice</value>
           </property>
           <!--HiveServer2的WEBUI-->
           <property>
                    <name>hive.server2.webui.host</name>
                    <value>hdpc01</value>
           </property>
           <property>
                    <name>hive.server2.webui.port</name>
                    <value>10002</value>
           </property>
           <property>
                    <name>hive.scratch.dir.permission</name>
                    <value>755</value>
           </property>
           </configuration>

            

           由於hive是預設將元資料儲存在本地內嵌的 Derby 資料庫中,但是這種做法缺點也很明顯,Derby不

           支援多會話連線,因此本文將選擇mysql作為元資料儲存,以上就是配置Hive使用mysq作為元資料的

        3. 配置日誌地址hive-log4j.properties檔案

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

            

            然後vi hive-log4j.properties

            將hive.log日誌的位置改為hive下的tmp目錄下:

            property.hive.log.dir = /home/hive/hive-2.3.2/logs/${sys:user.name}

            

                       

        3.上傳資料庫驅動

            將下載的mysql資料庫驅動上傳到hive的lib目錄下面

                  

        4.在主節點hosts檔案中配置元資料主機地址

           192.168.1.50 hdpc05

                                

六、驗證服務

        1.啟動hadoop叢集

           在主節點上啟動hadoop叢集start-all.sh

           

       2.啟動元資料儲存服務mysql服務

           遠端連線我們的mysql主機,然後啟動MYSQL服務(如果設定了自啟動,則此步驟可以忽略)

              

          啟動hive服務端程式hive --service metastore      

          檢視metastore服務是否啟動nohup hive --service metastore > metastore.log 2>&1 &

           

           檢視hive服務是否啟動nohup hive --service hiveserver2 > hiveserver2.log 2>&1 &

       3.啟動hive服務

           

           使用jps -ml檢視啟動的服務程序:

           

      4.驗證hive服務

          在主節點執行hive命令,然後在終端執行show databases;

          

七、問題反饋

       1.使用hive服務時報如下錯誤:

       Thu Jan 04 00:18:55 EST 2018 WARN: Establishing SSL connection without server's identity

       verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements

       SSL connection must be established by default if explicit option isn't set. For compliance with

       existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need

       either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore

       for server certificate verification.

                

       是因為MySQL 5.5.45+, 5.6.26+ and 5.7.6+版本上都要求使用ssl去連線,因此我們需要在連線時使用

       useSSL=true

      2.啟動hive報如下錯誤:

       Exception in thread "main" java.lang.RuntimeException: org.xml.sax.SAXParseException; systemId:

       file:/home/hive/hive-2.3.2/conf/hive-site.xml; lineNumber: 6; columnNumber: 93; The reference to

       entity "useSSL" must end with the ';' delimiter.

       

       因為在xml檔案中 &符號 需要轉義 這個根據轉義規則更改&為&amp;於是便解決了

      3.使用hive連線元資料庫報如下錯誤:

         FAILED:SemanticExceptionorg.apache.hadoop.hive.ql.metadata.HiveException:

         java.lang.RuntimeException: Unable to instantiate

         org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

         

         問題找到了,原來Hive2需要hive元資料庫初始化,我們在終端執行:

         schematool -dbType mysql -initSchema

         

八、總結

          本文主要是對hive資料倉庫叢集的搭建實踐,在過程中遇到很多問題,在上名的問題中也都列了出

來,還有問題的解決辦法,hive的Metastore服務配置一般有三種方式,後面我們會有專門的一片文章來說

明這三種方式,本文中使用的是第三種方式,這種方式也是生產環境中的使用方式。