Hive簡介
- 什麼是Hive
hive是基於Hadoop的一個數據倉儲工具,可以將結構化的數據文件映射爲一張數據表,並提供SQL查詢功能,可以將SQL語句轉化爲MapReduce任務進行執行。hive是基於Hadoop的一個數據倉儲工具,可以將結構化的數據文件映射爲一張數據表,並提供SQL查詢功能,可以將SQL語句轉化爲MapReduce任務進行執行。 - Hive的優點
學習成本年低,可以通過類SQL語句快速實現簡單的MapReduce統計計算,不必開發專門的MapReduce,十分適合數據倉儲的統計與分析。 - Hive的缺點
雖然用類SQL簡化了操作,但是實際上還是在hdfs上調用了MapReduce,這樣的話,效率還是有所降低的。 - Hive數據倉儲與數據庫的區別
Hive:數據倉儲
Hive:解釋器、編譯器、優化器等。
Hive:運行時,元數據存儲在關係型數據庫裏面。
數據倉儲主要用來保存數據,對數據進行分析計算,一次寫入,多次讀取,不能修改,不能刪除單條數據,除非把整個文件刪除。我們用的修改其實是覆蓋,先把整個文件下載下來,修改後重新上傳。
Hive的主要功能可以將一條數據轉換爲MapReduce,Hive依賴於HDFS和Yarn。
Hive架構
- 用戶接口:包括CLI,JDBC/ODBC,web UI
- 元數據存儲,通常是存儲在關係型數據庫中mysql,derby中
- 解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,並在隨後有MapReduce調用執行。
- Hive的真實數據(源數據)存儲在HDFS中,大部分的查詢、計算由MapReduce完成(包含*的查詢,比如select * from tbl不會生成MapRedcue任務)。
Hive與傳統數據庫進行比較
查詢語言 | HQL | SQL |
---|---|---|
數據存儲位置 | HDFS | 本地FS |
數據格式 | 用戶定義 | 系統決定 |
數據更新 | 不支持 | 支持 |
索引 | 新版本有,但弱 | 有 |
執行 | MapReduce | Executor |
執行延遲 | 高 | 低 |
可擴展性 | 高 | 低 |
數據規模 | 大 | 小 |
Hive 中沒有定義專門的數據格式,數據格式可以由用戶指定,用戶定義數據格式需要指定三個屬性:列分隔符(通常爲空格、”\t”、”\x001″)、行分隔符 (”\n”)以及讀取文件數據的方法(Hive 中默認有三個文件格式 TextFile,SequenceFile 以及 RCFile)。由於在加載數據的過程中,不需要從用用戶數據格式到 Hive 定義的數據格式的轉換,因此,Hive 在加載的過程中不會對數據本身進行任何修改,而只是將數據內容複製或者移動到相應的 HDFS 目錄中。而在數據庫中,不同的數據庫有不同的存儲引擎,定義了自己的數據格式。所有數據都會按照一定的組織存儲,因此,數據庫加載數據的過程會比較耗時。
Hive的搭建
hive三種方式區別和搭建
按照Hive中metastore(元數據存儲)不同位置分爲三種方式:
a)內嵌Derby方式
b)Local方式
c)Remote方式
1,安裝Hive
解壓下載好的apache-hive-1.2.1-bin.tar.gz安裝包到 /opt/apache-hive-1.2.1目錄下
tar -zxvf apache-hive-1.2.1-bin.tar.gz /opt/apache-hive-1.2.1
2,配置環境變量
export HIVE_HOME=/opt/apache-hive-1.2.1
export PATH=$HIVE_HOME/bin:$PATH
3,三種方式的搭建(配置文件的不同)
①Derby方式
修改hive-site.xml
配置文件,修改如下
<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>
啓動hive
./hive
注意:將hive/lib目錄下的jline jar包拷貝到hadoop的yarn lib下
這種模式的弊端
使用derby存儲方式時,運行hive會在當前目錄生成一個derby文件和一個metastore_db目錄。這種存儲方式的弊端是在同一個目錄下同時只能有一個hive客戶端能使用數據庫,否則會提示如下錯誤
[html] view plaincopyprint?
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
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
②Local(mysql)方式
這種存儲方式需要在本地運行一個mysql服務器,並作如下配置(下面兩種使用mysql的方式,需要將
mysql的jar包拷貝到$HIVE_HOME/lib目錄下)。
即是hive和mysql都配置在客戶端
修改hive-site.xml,配置如下
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_meta/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.23.129/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>123456</value>
</property>
</configuration>
注意一個坑:
權限,雖然hive用戶對hive_meta數據庫是由操作權限的,但是這個數據庫如果不存在,hive用戶也是沒有權限創建這個數據庫,所以需要提前創建好hive_remote數據庫
安裝mysql
Yum install mysql-server -y
修改mysql權限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
flush privileges;
刪除多餘會對權限造成影響的數據
刷新權限
添加用戶:
CREATE USER 'hive'@'%' IDENTIFIED BY '123';
授權用戶:
grant all privileges on hive_meta.* to hive@"%" identified by '123';
flush privileges;
設置開機啓動
chkconfig mysqld on
注意每次修改後要刷新權限,否則不起作用
配置過程中出現的錯誤
[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不一致
③多用戶模式
將hive-site.xml配置文件拆爲如下兩部分
服務端配置文件
<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>
客戶端配置文件
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.57.5:9083</value>
</property>
</configuration>
啓動hive服務端程序
hive --service metastore
或者,上面的那條語句執行比較慢,可以採用下面的讓他在後臺啓動
./hive --service metastore >> meta.log 2>&1 &