5-Hadoop之旅-Hive(一)

Hive能作什麼?html

  • Hive是基於Hadoop的一個數據倉庫工具,能夠將結構化的數據文件映射爲一張數據庫表,並提供完整的sql查詢功能,能夠將sql語句轉換爲MapReduce任務進行運行。其優勢是學習成本低,能夠經過類SQL語句快速實現簡單的MapReduce統計,沒必要開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
  • Hive是創建在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,能夠用來進行數據提取轉化加載(ETL http://www.javashuo.com/article/p-uuxsovvc-cd.html),這是一種能夠存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱爲 HQL(Hive SQL),它容許熟悉 SQL 的用戶查詢數據。同時,這個語言也容許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 沒法完成的複雜的分析工做(HQL函數庫)。

 

爲何要使用Hive?java

  • 操做接口採用類SQL語法,提供快速開發的能力
  • 避免了去寫MapReduce,減小開發人員的學習成本
  • 擴展功能很方便

 

Hive與傳統數據庫對比mysql

  Hive RDBMS
查詢語言 HQL SQL
數據存儲 HDFS Raw Device or Local FS
執行 MapReduce Excutor
執行延遲
處理數據規模
數據類型 所有數據(歷史和在線---分析) 在線數據
冗餘程度     高冗餘 低冗餘(經過範式)
... ... ...
... ...

...sql

 

Hive的架構數據庫

  • 用戶接口主要有三個:CLI,Client 和WUI。其中最經常使用的是CLI,Cli啓動的時候,會同時啓動一個Hive副本。Client是Hive的客戶端,用戶鏈接至Hive Server。在啓動Client模式的時候,須要指出Hive Server所在節點,而且在該節點啓動Hive Server。WUI是經過瀏覽器訪問Hive。
  • Hive將元數據存儲在數據庫中,如mysql、derby。Hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否爲外部表等),表的數據所在目錄等。
  • 解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,並在隨後有MapReduce調用執行。
  • Hive的數據存儲在HDFS中,大部分的查詢、計算由MapReduce完成(包含*的查詢,好比select * from tbl不會生成MapRedcue任務)。
  • Thriff (參考http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/

 

Hive相關概念apache

  • Operator(最小的處理單元):每一個操做符表明HDFS的一個操做或者一道MapReduce做業    
  • Operator都是Hive定義的一個處理過程
  • Operator定義(樹狀結構):
  • protectedList<Operator<?extendsSerializable>>childOperators;
    protectedList<Operator<?extendsSerializable>>parentOperators;
    protectedbooleandone;// 初始化值爲false

     

  • ANTLR詞法語法分析工具解析HQL

 

 

 

 

 

 

 

 

 

 

 

 

Hive的三種模式瀏覽器

  • Local模式:該模式鏈接到一個In-memory的數據庫Derby,通常用於Unit Test

        

  • Hive單用戶模式:經過網絡鏈接到一個數據庫中,是最常常使用到的模式
  • Hive多用戶模式:用於非Java客戶端訪問元數據庫,在服務器端啓動MetaStoreServer,客戶端利用Thrift協議經過MetaStoreServer訪問元數據庫
1.本地 derby

這種方式是最簡單的存儲方式,只須要在 hive-site.xml 作以下配置即可

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name> <value>jdbc:derby:;databaseName=metastore_db;create=true</value> </property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
 
注:使用 derby 存儲方式時,運行 hive 會在當前目錄生成一個 derby 文件和一個 metastore_db
目錄。這種存儲方式的弊端是在同一個目錄下同時只能有一個 hive 客戶端能使用數據庫,不然會提示以下錯誤

[html] view plaincopyprint? hive> show tables;
FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 'metast ore_db', see the next exception for details.
NestedThrowables:
java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask hive> show tables;
FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 'metastore_db', see the next exception for details.
NestedThrowables:
java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

2.本地 mysql

這種存儲方式須要在本地運行一個 mysql 服務器,並做以下配置(須要將 mysql 的驅動 jar 包拷貝到$HIVE_HOME/lib 目錄下)。
# /opt/hive-1.2.1/conf/hive-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name> <value>/user/hive_remote/warehouse</value> </property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=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>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
</property>
</configuration>

附:

安裝 mysql
Yum install mysql-server -y
啓動服務
service mysqld start
mysql
修改 mysql 權限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION; flush privileges;
delete from user where Host != '%';

刪除多餘會對權限形成影響的數據刷新權限
[ERROR] Terminal initialization failed; falling back to unsupported java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
at jline.TerminalFactory.create(TerminalFactory.java:101)

錯誤的緣由: Hadoop jline 版本和 hive 的 jline 不一致

3.遠端 mysql
3.1.remote 一體

這種存儲方式須要在遠端服務器運行一個 mysql 服務器,而且須要在 Hive 服務器啓動 meta
服務。
這裏用 mysql 的測試服務器,ip 位 192.168.1.214,新建 hive_remote 數據庫,字符集位 latine1 <?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.57.6:3306/hive?createDatabaseIfNotExist=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>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.1.188:9083</value>
</property>
</configuration>

注:這裏把 hive 的服務端和客戶端都放在同一臺服務器上了。服務端和客戶端能夠拆開,

3.2.Remote 分開

將 hive-site.xml 配置文件拆爲以下兩部分

-服務端配置文件 啓動:hive --service metastore

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.57.6:3306/hive?createDatabaseIfNotExist=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>
</configuration>

-客戶端配置文件 啓動:hive

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
<property>
<name>hive.metastore.uris</name>
<value>thrift://slave2:9083</value>
</property>
</configuration>
相關文章
相關標籤/搜索