1. 程式人生 > >Hive安裝前掃盲之Derby和Metastore

Hive安裝前掃盲之Derby和Metastore

大資料總是有很多英文單詞,你不瞭解一下根本就沒法推進。

比如Hive要涉及到的:derby metastore hiveServer2

後面內容都是轉載的,大致內容簡單來說就是:

 

Derby是一個數據庫,非常輕量,而Hive只會把元資料存放在關係型資料庫中。這是因為這樣可以易於共享這些元資料。

Hive 將元資料儲存在 RDBMS 中,一般常用 MySQL 和 Derby。預設情況下,Hive 元資料儲存在內嵌的 Derby 資料庫中,只能允許一個會話連線,只適合簡單的測試。實際生產環境中不適用, 為了支援多使用者會話,則需要一個獨立的元資料庫,使用 MySQL 作為元資料庫,Hive 內部對 MySQL 提供了很好的支援。

內建的derby主要問題是併發效能很差,可以理解為單執行緒操作。

Derby還有一個特性。更換目錄執行操作,會找不到相關表等
比如在/usr下執行建立表,在/usr下可以找到這個表。在/etc下執行查詢這個表,就會找不到 。

內嵌的意思就是把Derby嵌入到一個程式裡,開啟和關閉都由該程式來管理,並不是Derby自己來管理。

 

metastore呢,metastore服務實際上就是一種thrift服務,通過它我們可以獲取到hive元資料,並且通過thrift獲取元資料的方式,遮蔽了資料庫訪問需要驅動,url,使用者名稱,密碼等等細節。

thrift服務的意思就是,一些牛逼人把RPC(函式遠端呼叫,這裡面涉及到兩臺伺服器之間網路傳輸的過程,比較複雜)過程封裝好,然後這些細節對我們這些菜鳥來說完全透明,只留出介面寫道.thrift檔案裡,然後通過特殊的編譯器來生成不同語言的程式碼,以滿足不同需要的開發者,比如java開發者,就可以生成java程式碼,c++開發者可以生成c++程式碼,生成的程式碼中不但包含目標語言的介面定義,方法,資料型別,還包含有RPC協議層和傳輸層的實現程式碼.挺起來真酷。。。。

 

hiveserver2,你可能又想了這tmd又是個什麼東西。其實他就是提供給客戶端執行查詢結果的介面。

HiveServer2(HS2)是一個服務端介面使遠端客戶端可以執行對Hive的查詢並返回結果。目前基於Thrift RPC的實現是HiveServer的改進版本,並支援多客戶端併發和身份驗證

 

————————————————————————————

 

 

 

derby資料庫

一、簡介

  Derby 易於管理。當嵌入到客戶機應用程式中時, Derby 系統不需要任何管理干預。

  Derby 是可嵌入的。應用程式可以將資料庫管理系統( Database Management System , DBMS )引擎嵌入應用程式程序中,從而無需管理單獨的資料庫程序或服務。通過網路伺服器( Network Server )架構或您選擇的伺服器架構,可以將 Derby 作為單獨的程序來執行。

  Derby 是Java 編寫的記憶體資料庫,屬於 Apache 的一個開源專案,是一個純 Java 的類庫:對於 Java 開發人員,這點十分重要,因為他們正試圖維護 Java 技術的優點,例如平臺無關性、易於配置以及易於安裝。

  Derby 不需要專有的 Java 虛擬機器( Java Virtual Machine , JVM )。因為完全是用 Java 語言編寫的,所以它適應所有合格的 JVM 。

  DerbyDBMS 引擎是輕量級的。類檔案大小大約是 2MB ,並且只使用了 4MB 的 Java 堆。

  Derby 支援使用 Java 編寫儲存過程和函式,這些儲存過程和函式可以在應用程式的任何層上執行。 Derby 沒有專用的儲存過程語言,它使用JDBC 。

二、兩種執行模式

  1.內嵌模式。Derby資料庫與應用程式共享同一個JVM,通常由應用程式負責啟動和停止,對除啟動它的應用程式外的其它應用程式不可見,即其它應用程式不可訪問它;

  2.網路模式。Derby資料庫獨佔一個JVM,做為伺服器上的一個獨立程序執行。在這種模式下,允許有多個應用程式來訪問同一個Derby資料庫。

三、安裝derby

  1.在derby官網下載derby的包,然後解壓。

 

 

  1. 建立DERBY_HOME,值:D:\db-derby-10.10.2.0-bin  
  2. 在Path加入:%DERBY_HOME%\bin  
  3. 在CLASSPATH加入:  
  4. %DERBY_HOME%\lib \derby.jar;%DERBY_HOME%\lib\derbyclient.jar;%DERBY_HOME%\lib\derbytools.jar;%DERBY_HOME%\lib\derbynet.jar 

  2.執行(使用ij指令碼)

    (1)內嵌模式

      在命令列中找到bin目錄,使用輸入ij使用ij工具(或單擊ij.bat後啟動ij工具)。然後通過如下命令建立資料庫,並與資料庫建立連線:

        connect ‘jdbc:derby:mydb;create=true';

      (通過connect命令可以與指定資料庫建立連線,通過一個JDBC URL來指定與哪個資料庫建立連線。ij命令是不區分大小寫的。引數中jdbc:derby是Derby資料庫的驅動協議;firstdb是資料庫名稱,由於沒有指定路徑,資料庫將會被建立在當前你命令列下所在的目錄下;create=true表示如果資料庫不存在,則建立該資料庫;";"是ij命令的終止符。當資料庫建立成功時,Derby會在當前你命令列下所在的目錄下建立一個與資料庫命一致(這裡是mydb)的目錄,其中存放了資料庫的檔案。)

      連線之後便可使用SQL語句操作資料庫,或通過run命令執行sql檔案:run 'E:/derby/demo/ToursDB_schema.sql';

      最後通過exit;來退出ij工具。

      在當前你命令列下所在的目錄中有一個derby.log的日誌檔案,derby在其中記錄的資料庫啟動、關閉的資訊。

      連線驅動及URL:

        driver: org.apache.derby.jdbc.EmbeddedDriver

        url: jdbc:derby:E:/shiny/DdlUtils-test/mydb

    (2)網路模式

      網路模式下,需要使用兩個控制檯視窗,一個用於啟動Derby資料庫服務端,另一個做為訪問Derby資料庫的客戶端。

      1.在命令列進入bin目錄,執行startNetworkServer.bat啟動資料庫伺服器;

      2.另一個埠跟執行內嵌模式的Derby資料庫類似,只是連線的命令不同:

         connect 'jdbc:derby://localhost:1527/E:/my/derby/mydb;create=true';

      (其中localhost:1527是本地和埠號,後面的是G盤的某個資料庫,也可以是網上的)

      連線驅動及URL:

        driver: org.apache.derby.jdbc.ClientDriver

        url: jdbc:derby://localhost:1527/E:/my/derby/mydb

    注意:兩種模式連線資料庫時使用的驅動包不同

四、jar包說明

  1.引擎庫

    derby.jar是引擎庫(必須的) 
    For embedded databases. 
    You always need this library for embedded environments. For client/server environments, you only need this library on the server.

  2.工具庫

    1. derbytools.jar: Required for running all the Derby tools (such as ij, dblook, and import/export).
    2. derbyrun.jar: Executable jar file that can be used to start the Derby tools.

  3.網路服務端庫

    如果是通過網路連線Derby(非嵌入方式),那麼需要這個jar。 
    derbynet.jar: Required to start the Derby Network Server.

  4.網路客戶端庫

    derbyclient.jar: Required to use the Derby network client driver.

  5.本地語言庫

    1. derbyLocale_cs.jar Required to provide translated messages for the Czech locale.
    2. derbyLocale_de_DE.jar Required to provide translated messages for the German locale.
    3. derbyLocale_es.jar Required to provide translated messages for the Spanish locale.
    4. derbyLocale_fr.jar Required to provide translated messages for the French locale.
    5. derbyLocale_hu.jar Required to provide translated messages for the Hungarian locale.
    6. derbyLocale_it.jar Required to provide translated messages for the Italian locale.
    7. derbyLocale_ja_JP.jar Required to provide translated messages for the Japanese locale.
    8. derbyLocale_ko_KR.jar Required to provide translated messages for the Korean locale.
    9. derbyLocale_pl.jar Required to provide translated messages for the Polish locale.
    10. derbyLocale_pt_BR.jar Required to provide translated messages for the Brazilian Portuguese locale.
    11. derbyLocale_ru.jar Required to provide translated messages for the Russian locale.
    12. derbyLocale_zh_CN.jar Required to provide translated messages for the Simplified Chinese locale.
    13. derbyLocale_zh_TW.jar Required to provide translated messages for the Traditional Chinese locale.

 

 

hiveServer2 和 metastore的一點解讀。

  剛看了hive官網的文件,對於一些概念結合自己的經驗,似乎又多了一些理解,想一想還是記下來的好,一來我是個有些健忘的人,過一段時間即便忘了,循著這個帖子,也能快速把知識點抓起來;二來或許對別人也有些啟發。不過首先宣告,只是我自己的理解,或許也有錯誤的地方。。

  1. 先吐個槽,hive的官方文件頁面導航就是坨翔,當然,內容還是比較充實的。文件並沒有分版本,只是在具體某些內容中對不同版本區別介紹;自己選單的連結點選後,是一個全新的頁面,導航實在太不友好了。

  2. metastore

  hive在部署時,要配置hive-site.xml,這裡面的配置很重要的一部分是針對metastore的。什麼是metastore?官方解釋:"All the metadata for Hive tables and partitions are accessed through the Hive Metastore. ",簡單翻一下“對所有hive原資料和分割槽的訪問都要通過Hive Metastore”。

另有一段,附我的翻譯:

複製程式碼

 1 Remote Metastore Server
 2 In remote metastore setup, all Hive Clients will make a connection to a metastore server which in turn queries the datastore (MySQL in this example) 
 3 for metadata. Metastore server and client communicate using Thrift Protocol. Starting with Hive 0.5.0, you can start a Thrift server by executing 
 4 the following command:
 5 
 6 遠端metastore服務:
 7 啟動遠端metastore後,hive客戶端連線metastore服務,從而可以從資料庫(本例中位mysql)查詢到原資料資訊。metastore服務端和客戶端通訊是通過thrift協議。從hive 0.5.0版本開始,你可以通過執行
 8 以下命令來啟動thrift服務。
 9 
10 hive --service metastore

複製程式碼

  所以,metastore服務實際上就是一種thrift服務,通過它我們可以獲取到hive原資料,並且通過thrift獲取原資料的方式,遮蔽了資料庫訪問需要驅動,url,使用者名稱,密碼等等細節。

另外需要說明,以上說的是metastore服務(metastore server)的概念。我們後面還會提到metastore資料庫(metastore database),metastore 客戶端(metastore client)的概念,但其實metastore服務(metastore server)是理解metastore最重要的概念,所以在這裡提前單獨提到了。

 

hive中對metastore的配置包含3部分,metastore database,metastore server,metastore client。

其中,metastore database分為Local/Embedded Metastore Database (Derby)和Remote Metastore Database,metastore server也分為Local/Embedded Metastore Server和Remote Metastore Server,本地配置既無太大意義,又要佔不少篇幅,我就不講了,後面的例子都是遠端相關配置。

需要注意的幾點:

  1)Remote metastore server並不需要額外配置,只要Remote Metastore Database配置好了,"hive --service metastore" 啟動metastore會尋找database相關配置。

  2)通常我配置了database,就不配置client了。一般我們的hive都是做服務端的情況較多,不用作為客戶端,當然不用客戶端的配置了。但是如果僅作為客戶端,database配置就不需要了,服務端連元資料庫,和客戶端沒半毛錢直接關係,當然就不需要配置了,但如果作為客戶端,而且還要啟動hiveServer2服務(該服務也需要訪問元資料),那database也是必須配置的。還有一種情況,既是服務端又是客戶端,不用說了,都配置上吧。 廢話了一大堆,總結一句話,配置多了,一般不會出問題,配少了,就呵呵呵了。。

  3)metastore服務端,客戶端的應用場景。spark sql,spark shell終端連線應該就是以客戶端的形式連線 hive的metastore服務的。難怪看到官方文件中說準備在3.0版本將metastore獨立出去。本來嘛,獲取元資料的小活,為什麼非得要整合在hive中。

Remote Metastore Database:

Config Param

Config Value

Comment

javax.jdo.option.ConnectionURL

jdbc:mysql://<host name>/<database name>?createDatabaseIfNotExist=true

metadata is stored in a MySQL server

javax.jdo.option.ConnectionDriverName

com.mysql.jdbc.Driver

MySQL JDBC driver class

javax.jdo.option.ConnectionUserName

<user name>

user name for connecting to MySQL server

javax.jdo.option.ConnectionPassword

<password>

password for connecting to MySQL server

 

metastore client Parameters

Config Param

Config Value

Comment

hive.metastore.uris

thrift://<host_name>:<port>

host and port for the Thrift metastore server

hive.metastore.local

false

Metastore is remote.  Note: This is no longer needed as of Hive 0.10.  Setting hive.metastore.uri is sufficient.

hive.metastore.warehouse.dir

<base hdfs path>

Points to default location of non-external Hive tables in HDFS.

 

  3. hiveServer2 

  同樣,看一段官方解釋:

HiveServer2 (HS2) is a server interface that enables remote clients to execute queries against Hive and retrieve the results (a more detailed intro here). 
The current implementation, based on Thrift RPC, is an improved version of HiveServer and supports multi-client concurrency and authentication.

HiveServer2(HS2)是一個服務端介面,使遠端客戶端可以執行對Hive的查詢並返回結果。目前基於Thrift RPC的實現是HiveServer的改進版本,並支援多客戶端併發和身份驗證

  hiveServer2的啟動方式有2種:

1 $HIVE_HOME/bin/hiveserver2
2 或者
3 $HIVE_HOME/bin/hive --service hiveserver2

 啟動hiveServer2服務後,就可以使用jdbc,odbc,或者thrift的方式連線。 用java編碼jdbc或則beeline連線使用jdbc的方式,據說hue是用thrift的方式連線的hive服務。

 

我的一點疑問,hiveServer2和metastore都會訪問元資料,他們的訪問方式是怎樣的?是相同的,還是相似的。元資料的訪問有沒有可能僅需要一個服務?我現在訪問hive服務需要啟動hiveServer2,訪問sparksql需要啟動metastore,如果兩個都會啟動metastore,我覺得有些奇怪。