Hive 學習筆記(啟動方式,內置服務)


一、Hive介紹

  Hive是基於Hadoop的一個數據倉庫,Hive能夠將SQL語句轉化為MapReduce任務進行運行。

  Hive架構圖分為以下四部分。

   

  1、用戶接口

    Hive有三個用戶接口:

    • 命令行接口(CLI):以命令行的形式輸入SQL語句進行數據數據操作
    • Web界面:通過Web方式進行訪問。     
    • Hive的遠程服務方式:通過JDBC等方式進行訪問。              

  2、元數據存儲

    將元數據存儲在關系數據庫中(MySql、Derby),元數據包括表的屬性、表的名稱、表的列、分區及其屬性以及表數據所在的目錄等。

  3、解釋器、編譯器、優化器

    分別完成SQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計划的生成。生成的查詢計划存儲在HDFS中,並在隨后由MapReduce調用執行。

  4、數據存儲

    Hive沒有專門的數據存儲格式,也沒有為數據建立索引,Hive中所有數據都存儲在HDFS中。

    Hive包含以下數據模型:表、外部表、分區和桶

二、Metadata,Metastore 的作用

  Metadata即元數據:   元數據包含用Hive創建的database、tabel等的元信息。元數據存儲在關系型數據庫中。如Derby、MySQL等。

  Metastore的作用是:  客戶端連接metastore服務,metastore再去連接MySQL數據庫來存取元數據。

  有了metastore服務,就可以有多個客戶端同時連接,而且這些客戶端不需要知道MySQL數據庫的用戶名和密碼,只需要連接metastore 服務即可。

三、Hive的元數據存儲(Metastore三種配置方式)

  由於元數據不斷地修改、更新,所以Hive元數據不適合存儲在HDFS中,一般存在RDBMS中。

   1、內嵌模式(Embedded)

     hive服務和metastore服務運行在同一個進程中,derby服務也運行在該進程中.

     內嵌模式使用的是內嵌的Derby數據庫來存儲元數據,也不需要額外起Metastore服務。

     這個是默認的,配置簡單,但是一次只能一個客戶端連接,適用於用來實驗,不適用於生產環境。

   2、本地模式(Local):本地安裝mysql 替代derby存儲元數據

    這種安裝方式和嵌入式的區別在於,不再使用內嵌的Derby作為元數據的存儲介質,而是使用其他數據庫比如MySQL來存儲元數據。

    hive服務和metastore服務運行在同一個進程中,mysql是單獨的進程,可以同一台機器,也可以在遠程機器上。

    這種方式是一個多用戶的模式,運行多個用戶client連接到一個數據庫中。這種方式一般作為公司內部同時使用Hive。

    每一個用戶必須要有對MySQL的訪問權利,即每一個客戶端使用者需要知道MySQL的用戶名和密碼才行。

  <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://127.0.0.1:3306/hive? createDatabaseIfNotExit=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>root</value>
    </property>
    <property>
      <name>hive.metastore.uris</name>
      <value></value>
      <description>指向的是運行metastore服務的主機,這是hive客戶端配置,metastore服務不需要配置</description>
   </property>
    <property>
      <name>hive.metastore.warehouse.dir</name>
      <value>/user/hive/warehouse</value>
      <description>hive表的默認存儲路徑,為HDFS的路徑location of default database for the warehouse</description>
    </property>

 

  3、遠程模式(Remote): 遠程安裝mysql 替代derby存儲元數據

    Hive服務和metastore在不同的進程內,可能是不同的機器,該模式需要將hive.metastore.local設置為false,將hive.metastore.uris設置為metastore服務器URL,

    如果有多個metastore服務器,將URL之間用逗號分隔,metastore服務器URL的格式為thrift://127.0.0.1:9083。

    遠程元存儲需要單獨起metastore服務,然后每個客戶端都在配置文件里配置連接到該metastore服務。

    將metadata作為一個單獨的服務進行啟動。各種客戶端通過beeline來連接,連接之前無需知道數據庫的密碼。

    僅連接遠程的mysql並不能稱之為“遠程模式”,是否遠程指的是metastore和hive服務是否在同一進程內.

    hive metastore 服務端啟動命令:
    hive --service metastore -p <port_num>
    如果不加端口默認啟動:hive --service metastore,則默認監聽端口是:9083 。

    注意客戶端中的端口配置需要和啟動監聽的端口一致。服務端啟動正常后,客戶端就可以執行hive操作了。

      客戶端連接metastore服務配置如下

 <property>
    <name>hive.metastore.uris</name>
    <value>thrift://127.0.0.1:9083,thrift://127.0.0.1:9084</value>
    <description>指向的是運行metastore服務的主機</description>
  </property>

  在服務器端啟動一個MetaStoreServer,客戶端利用Thrift協議通過MetaStoreServer訪問元數據庫。如下圖:    

  

四、Thrift 服務 

  通過hiveServer/hiveServer2啟動Thrift服務,客戶端連接Thrift服務訪問Hive數據庫(JDBC,JAVA等連接Thrift服務訪問Hive)。

 <property>
    <name>hive.server2.thrift.port</name>
    <value></value>
    <description>Port number of HiveServer2 Thrift interface when hive.server2.transport.mode is 'binary'.</description>
  </property>

  <property>
    <name>hive.server2.thrift.bind.host</name>
    <value>127.0.0.1</value>
    <description>Bind host on which to run the HiveServer2 Thrift service.</description>
  </property>

  <property>
    <name>hive.server2.enable.doAs</name>
    <value>false</value>
    <description> Setting this property to true will have HiveServer2 execute Hive operations as the user making the calls to it.
    如果為True:Hive Server會以提交用戶的身份去執行語句
    如果為False:會以hive server daemon的admin user來執行語句
</description> </property>

  啟動Thrift服務:hive --service hiveserver2

   測試Thrift服務:

   新開一個命令行窗口,執行beeline命令:

shuwendeMBP:~ shuwen$ beeline
Beeline version 1.2.1.spark2 by Apache Hive
beeline> !connect jdbc:hive2://127.0.0.1:10000
Connecting to jdbc:hive2://127.0.0.1:10000
Enter username for jdbc:hive2://127.0.0.1:10000: shuwen
Enter password for jdbc:hive2://127.0.0.1:10000: ******
log4j:WARN No appenders could be found for logger (org.apache.hive.jdbc.Utils).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Connected to: Apache Hive (version 1.2.2)
Driver: Hive JDBC (version 1.2.1.spark2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://127.0.0.1:10000> show databases;
+----------------+--+
| database_name  |
+----------------+--+
| db_2_1         |
| default        |
| netuml         |
+----------------+--+
3 rows selected (1.941 seconds)

 

五、Hive的三種啟動方式

   1、hive 命令行模式

    進入hive安裝目錄,輸入bin/hive的執行程序,或者輸入 hive –service cli,用於linux平台命令行查詢,查詢語句基本跟mysql查詢語句類似

   2、hive web界面的啟動方式

    Hive 2.0 以后才支持Web UI的

    bin/hive –service hwi (& 表示后台運行)

    用於通過瀏覽器來訪問hive,感覺沒多大用途,瀏覽器訪問地址是:127.0.0.1:9999/hwi

   3、hive 遠程服務 (端口號10000) 啟動方式 (Thrift服務)

     bin/hive –service hiveserver2 &(&表示后台運行)

     用java,python等程序實現通過jdbc等驅動的訪問hive就用這種起動方式了,這個是程序員最需要的方式了

 

六、Hive幾種內置服務 

  執行bin/hive --service help 如下:

shuwendeMBP:~ shuwen$ hive --service help
Usage ./hive <parameters> --service serviceName <service parameters>
Service List: beeline cli help hiveburninclient hiveserver hiveserver2 hwi jar lineage metastore metatool orcfiledump rcfilecat schemaTool version 
Parameters parsed:
  --auxpath : Auxillary jars 
  --config : Hive configuration directory
  --service : Starts specific service/component. cli is default
Parameters used:
  HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory
  HIVE_OPT : Hive options
For help on a particular service:
  ./hive --service serviceName --help
Debug help:  ./hive --debug --help

  我們可以看到上邊輸出項Server List,里邊顯示出Hive支持的服務列表,beeline cli help hiveserver2 hiveserver hwi jar lineage metastore metatool orcfiledump rcfilecat。

  下面介紹最有用的一些服務

  1、cli:是Command Line Interface 的縮寫,是Hive的命令行界面,用的比較多,是默認服務,直接可以在命令行里使用。

  3、hwi:其實就是hive web interface的縮寫它是hive的web借口,是hive cli的一個web替代方案。

  2、hiveserver:這個可以讓Hive以提供Thrift服務的服務器形式來運行,可以允許許多個不同語言編寫的客戶端進行通信,使用需要啟動HiveServer服務以和客戶端聯系,

    我們可以通過設置HIVE_PORT環境變量來設置服務器所監聽的端口,在默認情況下,端口號為10000,這個可以通過以下方式來啟動Hiverserver:

    bin/hive --service hiveserver -p 10002

    其中-p參數也是用來指定監聽端口的
  
  4、jar:與hadoop jar等價的Hive接口,這是運行類路徑中同時包含Hadoop 和Hive類的Java應用程序的簡便方式

  5、metastore:在默認的情況下,metastore和hive服務運行在同一個進程中,使用這個服務,可以讓metastore作為一個單獨的進程運行。

    我們可以通過METASTOE——PORT來指定監聽的端口號

 

 七、問題總結

Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083

遇到這種情況大家都找不到頭緒,是因為你開始運行了hive的metastore,可以輸入jps
查看有沒有RunJar
然后再輸入
hive --service metastore啟動

 

Hive在spark2.0.0啟動時無法訪問spark-assembly-*.jar的解決辦法

ls: /usr/local/share/spark-2.0.0-bin-hadoop2.7/lib/spark-assembly-*.jar: No such file or directory
發現主要原因是:在/<PathToHive>/bin/hive文件中,有這樣的命令:加載spark中相關的JAR包

if [[ -n "$SPARK_HOME" ]]
then
sparkAssemblyPath=`ls ${SPARK_HOME}/lib/spark-assembly-*.jar`
CLASSPATH="${CLASSPATH}:${sparkAssemblyPath}"
fi

但是spark升級到spark2以后,原有lib目錄下的大JAR包被分散成多個小JAR包,原來的spark-assembly-*.jar已經不存在,所以hive沒有辦法找到這個JAR包。

解決方法:修改/<PathToHive>/bin/hive文件,將加載原來的lib/spark-assembly-*.jar`替換成jars/*.jar,就不會出現這樣的問題。

 

 

1.hive.metastore.uris指向的是運行metastore服務的主機,並不是指向運行hiveserver的主機,那台主機不用啟動hiveserver也ok;

2.直接使用hive命令啟動shell環境時,其實已經順帶啟動了hiveserver,所以遠程模式下其實只需要單獨啟動metastore,然后就可以進入shell環境正常使用

3.hiveserver和metastore進程名都叫RunJar。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM