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

1、Hive介紹html

  Hive是基於Hadoop的一個數據倉庫,Hive可以將SQL語句轉化爲MapReduce任務進行運行。java

  Hive架構圖分爲如下四部分。python

   

  一、用戶接口mysql

    Hive有三個用戶接口:linux

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

  二、元數據存儲程序員

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

  三、解釋器、編譯器、優化器sql

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

  四、數據存儲數據庫

    Hive沒有專門的數據存儲格式,也沒有爲數據創建索引,Hive中全部數據都存儲在HDFS中。

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

2、Metadata,Metastore 的做用

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

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

  有了metastore服務,就能夠有多個客戶端同時鏈接,並且這些客戶端不須要知道MySQL數據庫的用戶名和密碼,只須要鏈接metastore 服務便可。

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

  因爲元數據不斷地修改、更新,因此Hive元數據不適合存儲在HDFS中,通常存在RDBMS中。

   一、內嵌模式(Embedded)

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

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

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

   二、本地模式(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>

 

  三、遠程模式(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訪問元數據庫。以下圖:    

  

4、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)

 

5、Hive的三種啓動方式

   一、hive 命令行模式

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

   二、hive web界面的啓動方式

    Hive 2.0 之後才支持Web UI的

    bin/hive –service hwi (& 表示後臺運行)

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

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

     bin/hive –service hiveserver2 &(&表示後臺運行)

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

 

6、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。

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

  一、cli:是Command Line Interface 的縮寫,是Hive的命令行界面,用的比較多,是默認服務,直接能夠在命令行裏使用。

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

  二、hiveserver:這個可讓Hive以提供Thrift服務的服務器形式來運行,能夠容許許多個不一樣語言編寫的客戶端進行通訊,使用須要啓動HiveServer服務以和客戶端聯繫,

    咱們能夠經過設置HIVE_PORT環境變量來設置服務器所監聽的端口,在默認狀況下,端口號爲10000,這個能夠經過如下方式來啓動Hiverserver:

    bin/hive --service hiveserver -p 10002

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

  五、metastore:在默認的狀況下,metastore和hive服務運行在同一個進程中,使用這個服務,可讓metastore做爲一個單獨的進程運行。

    咱們能夠經過METASTOE——PORT來指定監聽的端口號

 

 7、問題總結

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。

相關文章
相關標籤/搜索