1. 程式人生 > >第55課:60分鐘內從零起步駕馭Hive實戰學習筆記

第55課:60分鐘內從零起步駕馭Hive實戰學習筆記

內容:        Hive本質解析        Hive安裝實戰        使用Hive操作搜尋引擎資料實戰

SparkSQL前身是Shark,Shark強烈依賴於Hive。Spark原來沒有做SQL多維度資料查詢工具,後來開發了Shark,Shark依賴於Hive的解釋引擎,部分在Spark中執行,還有一部分在Hadoop中執行。所以講SparkSQL必須講Hive。

一、Hive的本質     1. Hive是分散式資料倉庫,同時又是查詢引擎,所以SparkSQL取代的只是Hives的查詢引擎,在企業實際生產環境下,Hive+SparkSQL是目前最為經典的資料分析組合。     2. Hive本身就是一個簡單單機版本的軟體,主要負責:         a) 把HQL翻譯成Mapper(s)-Reducer-Mapper(s)的程式碼,並且可能產生很多MapReduce的JOB。         b)把生成的MapReduce程式碼及相關資源打包成jar併發布到Hadoop叢集中執行(這一切都是自動的)     3.Hive本身的架構如下所示:

    可以通過CLI(命令終端)、JDBC/ODBC、Web GUI訪問Hive。     JavaEE或.net程式可以通過Hive處理,再把處理的結果展示給使用者。     也可以直接通過Web頁面操作Hive。     4.Hive本身只是一個單機版本的的軟體,怎麼訪問HDFS的呢?        在Hive用Table的方式插入資料、檢索資料等,這就需要知道資料放在HDFS的什麼地方以及什麼地方屬於什麼資料,Metastore就是儲存這些元資料資訊的。Hive通過訪問元資料資訊再去訪問HDFS上的資料。      可以看出HDFS不是一個真實的檔案系統,是虛擬的,是邏輯上的,HDFS只是一套軟體而已,它是管理不同機器上的資料的,所以需要NameNode去管理元資料。DataNode去管理資料。      Hive通過Metastore和NameNode打交道。

二、Hive安裝和配置實戰     Spark中SparkSQL可以指定具體的Hive的版本。     1. 從apache官網下載hive-1.2.1,並解壓到/usr/local/目錄,重新命名為hive(sudo mv hive-1.2.1 hive)。     2. 配置Hive的環境變數,在檔案.bashrc中追加以下內容:

        export HIVE_HOME=/usr/local/hive
        export HIVE_CONF_DIR=/$HIVE_HOME/conf
        export PATH=$PATH:$HIVE_HOME/bin

    3. 進入/usr/local/hive/conf目錄下生成hive-env.sh:         cp hive-env.sh.template hive-env.sh

      

        export HADOOP_HOME=/usr/local/hadoop
        export HIVE_HOME=/usr/local/hive
        export HIVE_CONF_DIR=/$HIVE_HOME/conf 

    4. 拷貝一份hive-default.xml.template作為預設Hive配置        cp hive-default.xml.template hive-site.xml

    Hive預設情況下放元資料的資料庫是Derby,遺憾的是Derby是單使用者,所以在生產環境下一般會採用支援多使用者的資料庫來進行MetaStore,且進行Master-Slaves主從讀寫分離和備份(一般Master節點負責寫資料,Slaves節點負責讀資料)。最常用的是MySQL。    5.建立一個檔案hive-site.xml,並配置如下:

   <configuration>
      <property>
            <name>javax.jdo.option.ConnectionURL</name>
            <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false</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.dir</name>
            <value>/user/hive/warehouse</value>
      </property>
      <property>
           <name>hive.metastore.schema.verification</name>
           <value>false</value>
           <description>
            Enforce metastore schema version consistency.
            True: Verify that version information stored in metastore matches with one from Hive jars.  Also disable automatic
                  schema migration attempt. Users are required to manully migrate schema after Hive upgrade which ensures
                  proper metastore schema migration. (Default)
            False: Warn if the version information stored in metastore doesn't match with one from in Hive jars.
            </description>
     </property>
  </configuration>

    Hive中的DataBase和表其實就是HDFS上的目錄和簡單的文字檔案。簡單的文字檔案中有幾列資料,每列資料的型別無法直接從文字檔案中得知。但當資料放入Hive中,Hive就把元資料放入Mysql中了,這樣就可以基於資料的表進行查詢了。     6. MYSQL的安裝和配置         在hadoop使用者下執行sudo install mysql-server即可自動安裝         執行rpm -qa mysql-server可以檢視是否安裝成功及安裝的mysql版本。     7. Hive的表有兩種基本型別:一種是內部表(這種表資料屬於Hive本身,即如果原來的資料在HDFS的其他地方,此時資料會通過HDFS移動到Hive所在目錄,如果刪除Hive中的該表的話資料和元資料均會被刪除),一種是外部表(這種表資料不屬於Hive資料倉庫,元資料中會表達具體資料在哪裡,使用時和內部表的使用一樣,只是如果通過Hive去刪除的話,刪除的只是元資料,並沒有刪除資料本身)

三、 使用Hive分析搜尋資料