一、概述 Hive是基於Hadoop的一個數據倉庫(Data Aarehouse,簡稱數倉、DW),可以將結構化的數據文件映射為一張資料庫表,並提供類SQL查詢功能。是用於存儲、分析、報告的數據系統。 在Hadoop生態系統中,HDFS用於存儲數據,Yarn用於資源管理,MapReduce用於數據處 ...
目錄
一、概述
Hive是基於Hadoop的一個數據倉庫(Data Aarehouse,簡稱數倉、DW),可以將結構化的數據文件映射為一張資料庫表,並提供類SQL查詢功能。是用於存儲、分析、報告的數據系統。
在Hadoop生態系統中,HDFS用於存儲數據,Yarn用於資源管理,MapReduce用於數據處理,而Hive是構建在Hadoop之上的數據倉庫,包括以下方面:
- 使用HQL作為查詢介面;
- 使用HDFS存儲;
- 使用MapReduce或其它計算框架計算;
- 執行程式運行在Yarn上。
Hive的本質是:將Hive SQL轉化成MapReduce程式,其靈活性和擴展性比較好,支持UDF,自定義存儲格式等;適合離線數據處理。
Hive相關網站
官網:http://hive.apache.org
文檔:https://cwiki.apache.org/confluence/display/Hive/GettingStarted
https://cwiki.apache.org/confluence/display/Hive/Home
下載:http://archive.apache.org/dist/hive
Github地址:https://github.com/apache/hive
二、Hive優點與使用場景
1)優點
- 操作介面採用類SQL語法,提供快速開發的能力(簡單、容易上手);
- 避免了去寫MapReduce,減少開發人員的學習成本;
- 統一的元數據管理,可與impala/spark等共用元數據;
- 易擴展(HDFS+MapReduce:可以擴展集群規模;支持自定義函數);
- 數據的離線處理;比如:日誌分析,海量結構化數據離線分析。
2)使用場景
- Hive的執行延遲比較高,因此hive常用於數據分析的,對實時性要求 不高的場合;
- Hive優勢在於處理大數據,對於處理小數據沒有優勢,因為Hive的執 行延遲比較高。
三、Hive架構
由上圖可知,hadoop和mapreduce是hive架構的根基。Hive架構包括如下組件:CLI(command line interface)、JDBC/ODBC、Thrift Server、WEB GUI、metastore和Driver(Complier、Optimizer和Executor),這些組件我可以分為兩大類:服務端組件和客戶端組件。
1)服務端組件
1、Driver組件
該組件包括Complier、Optimizer和Executor,它的作用是將我們寫的HiveQL(類SQL)語句進行解析、編譯優化,生成執行計劃,然後調用底層的mapreduce計算框架。
2、Metastore組件
Metastore是元數據服務組件,這個組件存儲hive的元數據,hive的元數據存儲在關係資料庫里,hive支持的關係資料庫有derby、mysql。元數據對於hive十分重要,因此hive支持把metastore服務獨立出來,安裝到遠程的伺服器集群里,從而解耦hive服務和metastore服務,保證hive運行的健壯性。
3、Thrift服務
Thrift是facebook開發的一個軟體框架,它用來進行可擴展且跨語言的服務的開發,hive集成了該服務,能讓不同的編程語言調用hive的介面。
2)客戶端組件
1、CLI
command line interface,命令行介面。
2、Thrift客戶端
上面的架構圖裡沒有寫上Thrift客戶端,但是hive架構的許多客戶端介面是建立在Thrift客戶端之上,包括JDBC和ODBC介面。
3、WEBGUI
hive客戶端提供了一種通過網頁的方式訪問hive所提供的服務。這個介面對應hive的hwi組件(hive web interface),使用前要啟動hwi服務。
3)Metastore詳解
- Hive的metastore組件是hive元數據集中存放地。
- Metastore組件包括兩個部分:metastore服務和後臺數據的存儲。
- 後臺數據存儲的介質就是關係資料庫,例如hive預設的嵌入式磁碟資料庫derby,還有mysql資料庫。
- Metastore服務是建立在後臺數據存儲介質之上,並且可以和hive服務進行交互的服務組件,預設情況下,metastore服務和hive服務是安裝在一起的,運行在同一個進程當中。
- 我也可以把metastore服務從hive服務里剝離出來,metastore獨立安裝在一個集群里,hive遠程調用metastore服務,這樣我們可以把元數據這一層放到防火牆之後,客戶端訪問hive服務,就可以連接到元數據這一層,從而提供了更好的管理性和安全保障。
- 使用遠程的metastore服務,可以讓metastore服務和hive服務運行在不同的進程里,這樣也保證了hive的穩定性,提升了hive服務的效率。
四、Hive的工作原理
簡單的將就是說sql或者HQL(Hive SQL)會被Hive解釋,編譯,優化並生成查詢計劃,一般情況而言查詢計劃會被轉化為MapReduce任務進而執行。
具體工作過程如下:
- 詞法分析/語法分析
使用antlr將SQL語句解析成抽象語法樹(AST)
- 語義分析
從Megastore獲取模式信息,驗證SQL語句中隊表名,列名,以及數據類型的檢查和隱式轉換,以及Hive提供的函數和用戶自定義的函數(UDF/UAF)
- 邏輯計劃生成
生成邏輯計劃--運算元樹
- 邏輯計劃優化
對運算元樹進行優化,包括列剪枝,分區剪枝,謂詞下推等
- 物理計劃生成
將生成包含由MapReduce任務組成的DAG(Directed acyclic graph:有向無環圖)的物理計劃
- 物理計劃執行
將DAG發送到Hadoop集群進行執行
- 最後把查詢結果返回
【溫馨提示】新版本的Hive也支持使用Tez或Spark等作為執行引擎。
五、安裝
1)local模式(內嵌derby)
內嵌derby資料庫(一個會話連接,常用於簡單測試)derby是個in-memory的資料庫。
安裝方法如下:
1、下載hive
$ cd /opt/bigdata/hadoop/software
# 下載
$ wget http://archive.apache.org/dist/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
# 解壓
$ tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/bigdata/hadoop/server/
2、配置環境變數
$ cd /opt/bigdata/hadoop/server/apache-hive-3.1.2-bin/conf/
# 把模板文件複製一份
$ cp hive-env.sh.template hive-env.sh
- 在/etc/profile文件中追加如下內容:
export HIVE_HOME=/opt/bigdata/hadoop/server/apache-hive-3.1.2-bin
export PATH=$HIVE_HOME/bin:$PATH
source 載入生效
$ source /etc/profile
- hive-site.xml,這個文件不存在,創建文件,內容如下:
# 創建在hdfs存儲目錄,下麵配置文件會用到
$ hadoop fs -mkdir -p /user/hive/warehouse
# 切到hive conf目錄
$ cd /opt/bigdata/hadoop/server/apache-hive-3.1.2-bin/conf
hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?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.schema.verification</name>
<value>false</value>
</property>
<!-- 數據在hdfs中的存儲位置 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
</configuration>
- hive-env.sh #底部追加兩行
export HADOOP_HOME=/opt/bigdata/hadoop/server/hadoop-3.3.1
export HIVE_CONF_DIR=/opt/bigdata/hadoop/server/apache-hive-3.1.2-bin/conf
export HIV_AUX_JARS_PATH=/opt/bigdata/hadoop/server/apache-hive-3.1.2-bin/lib
3、啟動驗證
$ hive
# 查看資料庫
hive> show databases;
# 查看當前庫(預設是default庫)的表
hive> show tables;
# 查看當前庫
hive> select current_database();
查看當前目錄,發現多了derby文件和一個metastore_db目錄
【註意】使用derby存儲方式時,運行hive會在當前目錄生成一個derby文件和一個metastore_db目錄。這種存儲方式的弊端是在同一個目錄下同時只能有一個hive客戶端能使用資料庫,否則會提示如下錯誤:
2)單用戶模式(mysql)
該模式下就是客戶端和服務端在一個節點上,使用關係型資料庫(mysql、oracle等帶jdbc驅動的資料庫)來對元數據進行存儲。這裡使用mysql,mysql可以在安裝同一臺機器上,也可以在遠程機器上。
hive包上面已經下載了,這裡就不重覆了。
1、安裝mysql資料庫
- yum源安裝
$ yum -y install mysql-server
# 啟動資料庫
$ systemctl start mysqld
$ systemctl status mysqld
# 開機自啟動
$ systemctl enable mysqld
- 連接mysql8.x授權(無密碼,直接進入)
$ mysql
# 創建可遠程連接用戶
CREATE USER 'root'@'%' IDENTIFIED BY '123456';
# 修改用戶密碼
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 授權給用戶
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
# 查看
select user,host from mysql.user;
show grants for 'root'@'%';
# 許可權撤回,這裡不執行,瞭解即可
revoke all privileges on *.* from 'root'@'%';
通過密碼登錄mysql
$ mysql -uroot -h 192.168.0.113 -p
輸入密碼:123456
2、解決Hive與Hadoop之間guava版本的差異
$ cd /opt/bigdata/hadoop/server
$ ls -l apache-hive-3.1.2-bin/lib/guava-*.jar
$ ls -l hadoop-3.3.1/share/hadoop/common/lib/guava-*.jar
# 刪除hive中guava低版本
$ rm -f apache-hive-3.1.2-bin/lib/guava-*.jar
# copy hadoop中的guava到hive
$ cp hadoop-3.3.1/share/hadoop/common/lib/guava-*.jar apache-hive-3.1.2-bin/lib/
$ ls -l apache-hive-3.1.2-bin/lib/guava-*.jar
3、下載對應版本的mysql驅動包
# 查看mysql版本
$ mysql --version
這裡的mysql版本是8.0.26,所以就得下載對應版本的驅動包
官網下載地址:https://dev.mysql.com/downloads/
如果小伙伴的mysql版本(8.0.26)跟我的一樣,也可以使用百度的地址下載:
鏈接:https://pan.baidu.com/s/1uczpnH0PHxbq258vMoYlgA
提取碼:8888
# 包放在這個目錄下
$ cd /opt/bigdata/hadoop/software
# 解壓
$ unzip mysql-connector-java-8.0.26.zip
把對應的驅動包copy到hive lib目錄下
$ cp mysql-connector-java-8.0.26/mysql-connector-java-8.0.26.jar ../server/apache-hive-3.1.2-bin/lib/
4、配置
$ cd /opt/bigdata/hadoop/server/apache-hive-3.1.2-bin/conf
# 先備份一下
$ mv hive-site.xml local-derby-hive-site.xml
# 複製一份
$ cp hive-default.xml.template hive-site.xml
hive-site.xml內容如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 配置hdfs存儲目錄 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_remote/warehouse</value>
</property>
<!-- 本地模式 -->
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<!-- 所連接的 MySQL 資料庫的地址,hive_local是資料庫,程式會自動創建,自定義就行 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop-node1:3306/hive_local?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=Asia/Shanghai</value>
</property>
<!-- MySQL 驅動 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- mysql連接用戶 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- mysql連接密碼 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!--元數據是否校驗-->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>system:user.name</name>
<value>root</value>
<description>user name</description>
</property>
</configuration>
5、初始化元數據
# 初始化,--verbose:查詢詳情,可以不加
$ schematool -initSchema -dbType mysql --verbose
出現上圖Initialization script completed和schemaTool completed,就初始化完成了。
通過mysql 客戶端工具取連接數據,發現新增量了hive_local,這個庫里有74張表。
6、啟動驗證
# 進入hive
$ hive
# 查看資料庫
hive> show databases;
# 查看當前庫(預設是default庫)的表
hive> show tables;
# 查看當前庫
hive> select current_database();
3)多用戶模式(mysql)
該模式下就是客戶端和服務端在不同的節點上,因此需要單獨啟動metastore服務。該模式需要hive.metastore.local設置為false,並將hive.metastore.uris設置為metastore伺服器URI,如有多個metastore伺服器,URI之間用逗號分隔。
- 客戶端hadoop-node2和服務端hadoop-node1分佈在不同的節點上,客戶端通過遠程的方式連接。
- 客戶端hadoop-node2節點操作,基本和服務端差不多操作,區別是他不需要初始化。
在hadoop-node2部署客戶端
1、copy hive包到客戶端hadoop-node2(在hadoop-node1服務端執行)
$ cd /opt/bigdata/hadoop/server
$ scp -r apache-hive-3.1.2-bin hadoop-node2:/opt/bigdata/hadoop/server/
2、在客戶端添加環境變數(hadoop-node2)
- 在/etc/profile文件中追加如下內容:
export HIVE_HOME=/opt/bigdata/hadoop/server/apache-hive-3.1.2-bin
export PATH=$HIVE_HOME/bin:$PATH
source 載入生效
$ source /etc/profile
3、配置hive-site.xml(hadoop-node2)
$ cd /opt/bigdata/hadoop/server/apache-hive-3.1.2-bin/conf/
hive-site.xml內容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?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>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop-node1:9083</value>
</property>
</configuration>
4、服務端後臺開啟metastore(hadoop-node1)
$ nohup hive --service metastore &
$ ss -atnlp|grep 9083
5、在客戶端執行hive操作(hadoop-node2)
# 這裡使用新命令beeline,跟hive命令差不多
$ hive
$ show databases;
$ show tables;
$ create table users(id int,name string);
$ insert into users values(1,'zhangsan');
通過上面數據的插入操作,發現hive的操作最終會變成一個mapreduce任務在運行,也正驗證了之前所述。
五、Hive客戶端
Hive發展至今,總共歷經了兩代客戶端工具:
- 第一代客戶端(deprecated不推薦使用):$HIVE_HOME/bin/hive,是一個shellUtil。主要功能:一是可用於以交互或批處理運行Hive查詢;二是用於Hive相關服務的啟動,比如metastore服務。
- 第二代客戶端(recommend 推薦使用):$HIVE_HOME/bin/beeline,是一個JDBC客戶端,是官方強烈推薦使用的Hive命令行工具,和第一代客戶端相比,性能加強安全性提高。
1)Hive CLI
1、查看幫助
使用 hive -H 或者 hive --help 命令可以查看所有命令的幫助,顯示如下:
usage: hive
-d,--define <key=value> Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B --定義用戶自定義變數
--database <databasename> Specify the database to use -- 指定使用的資料庫
-e <quoted-query-string> SQL from command line -- 執行指定的 SQL
-f <filename> SQL from files --執行 SQL 腳本
-H,--help Print help information -- 列印幫助信息
--hiveconf <property=value> Use value for given property --自定義配置
--hivevar <key=value> Variable subsitution to apply to hive --自定義變數
commands. e.g. --hivevar A=B
-i <filename> Initialization SQL file --在進入交互模式之前運行初始化腳本
-S,--silent Silent mode in interactive shell --靜默模式
-v,--verbose Verbose mode (echo executed SQL to the console) --詳細模式
2、互動式命令行
直接使用 hive 命令,不加任何參數,即可進入互動式命令行。
3、非互動式
在不進入互動式命令行的情況下,可以使用 hive -e 執行 SQL 命令。
示例:
$ hive -e 'show databases';
4、接SQL文件非互動式執行SQL腳本
用於執行的 sql 腳本可以在本地文件系統,也可以在 HDFS 上。
準備一個sql文件test001.sql
$ cat test001.sql
show databases;
show tables;
本地文件系統執行
hive -f ./test001.sql
HDFS文件系統執行
# 先把sql文件傳到hdfs上
$ hadoop fs -put test001.sql /
$ hadoop fs -ls hdfs://hadoop-node1:8082/test001.sql
$ hive -f hdfs://hadoop-node1:8082/test001.sql
5、配置Hive變數
$ hadoop fs -mkdir -p /user/hive/warehouse/test
$ hive -e 'select * from users' \
--hiveconf hive.exec.scratchdir=/user/hive/warehouse/test \
--hiveconf mapred.reduce.tasks=4;
發現hdfs的目錄沒有寫許可權
添加許可權再執行
$ hadoop fs -chmod -R 777 /user/hive/warehouse/test
$ hive -e 'select * from users' \
--hiveconf hive.exec.scratchdir=/user/hive/warehouse/test \
--hiveconf mapred.reduce.tasks=4;
2)Beeline CLI(推薦)
HiveServer2
- Hive 內置了 HiveServer 和 HiveServer2 服務,兩者都允許客戶端使用多種編程語言進行連接,但是 HiveServer 不能處理多個客戶端的併發請求,所以產生了 HiveServer2。
- HiveServer2(HS2)允許遠程客戶端可以使用各種編程語言向 Hive 提交請求並檢索結果,支持多客戶端併發訪問和身份驗證。HS2 是由多個服務組成的單個進程,其包括基於 Thrift 的 Hive 服務(TCP 或 HTTP)和用於 Web UI 的 Jetty Web 伺服器。
- HiveServer2 擁有自己的 CLI(Beeline),Beeline 是一個基於 SQLLine 的 JDBC 客戶端。由於 HiveServer2 是 Hive 開發維護的重點 (Hive0.15 後就不再支持 hiveserver),所以 Hive CLI 已經不推薦使用了,官方更加推薦使用 Beeline。
1、查看幫助
Beeline 擁有更多可使用參數,可以使用 beeline --help 查看,完整參數如下:
$ beeline --help
Usage: java org.apache.hive.cli.beeline.BeeLine
-u <database url> the JDBC URL to connect to
-r reconnect to last saved connect url (in conjunction with !save)
-n <username> the username to connect as
-p <password> the password to connect as
-d <driver class> the driver class to use
-i <init file> script file for initialization
-e <query> query that should be executed
-f <exec file> script file that should be executed
-w (or) --password-file <password file> the password file to read password from
--hiveconf property=value Use value for given property
--hivevar name=value hive variable name and value
This is Hive specific settings in which variables
can be set at session level and referenced in Hive
commands or queries.
--property-file=<property-file> the file to read connection properties (url, driver, user, password) from
--color=[true/false] control whether color is used for display
--showHeader=[true/false] show column names in query results
--headerInterval=ROWS; the interval between which heades are displayed
--fastConnect=[true/false] skip building table/column list for tab-completion
--autoCommit=[true/false] enable/disable automatic transaction commit
--verbose=[true/false] show verbose error messages and debug info
--showWarnings=[true/false] display connection warnings
--showNestedErrs=[true/false] display nested errors
--numberFormat=[pattern] format numbers using DecimalFormat pattern
--force=[true/false] continue running script even after errors
--maxWidth=MAXWIDTH the maximum width of the terminal
--maxColumnWidth=MAXCOLWIDTH the maximum width to use when displaying columns
--silent=[true/false] be more silent
--autosave=[true/false] automatically save preferences
--outputformat=[table/vertical/csv2/tsv2/dsv/csv/tsv] format mode for result display
--incrementalBufferRows=NUMROWS the number of rows to buffer when printing rows on stdout,
defaults to 1000; only applicable if --incremental=true
and --outputformat=table
--truncateTable=[true/false] truncate table column when it exceeds length
--delimiterForDSV=DELIMITER specify the delimiter for delimiter-separated values output format (default: |)
--isolation=LEVEL set the transaction isolation level
--nullemptystring=[true/false] set to true to get historic behavior of printing null as empty string
--maxHistoryRows=MAXHISTORYROWS The maximum number of rows to store beeline history.
--convertBinaryArrayToString=[true/false] display binary column data as string or as byte array
--help display this message
2、常用參數
在 Hive CLI 中支持的參數,Beeline 都支持,常用的參數如下。更多參數說明可以參見官方文檔 Beeline Command Options
參數 | 說明 |
---|---|
-u |
資料庫地址 |
-n |
用戶名 |
-p |
密碼 |
-d |
|
-e |
執行 SQL 命令 |
-f |
執行 SQL 腳本 |
-i (or)–init |
在進入交互模式之前運行初始化腳本 |
–property-file |
指定配置文件 |
–hiveconf property=value | 指定配置屬性 |
–hivevar name=value | 用戶自定義屬性,在會話級別有效 |
3、通過代理用戶連接 Hive(不需要配置用戶名和密碼)
1)在hive服務的安裝節點的hive-site.xml配置文件中添加以下配置
<!-- host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop-node1</value>
<description>Bind host on which to run the HiveServer2 Thrift service.</description>
</property>
<!-- hs2埠 預設是1000,為了區別,我這裡不使用預設埠-->
<property>
<name>hive.server2.thrift.port</name>
<value>11000</value>
</property>
2)修改hadoop配置文件core-site.xml,表示設置可訪問的用戶及用戶組
配置hadoop core-site.xml,再core-site.xml文件中追加如下內容
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
【註意】hadoop.proxyuser.root.hosts和hadoop.proxyuser.root.hosts,其中“root”是連接beeline的用戶,將“root”替換成自己的用戶名即可。,這個用戶是什麼不重要,它就是個超級代理。
改完hadoop-node1後,把配置也推送到其它節點上,然後重啟hadoop就行
$ /opt/bigdata/hadoop/server/hadoop-3.3.1/etc/hadoop
$ scp core-site.xml hadoop-node2:/opt/bigdata/hadoop/server/hadoop-3.3.1/etc/hadoop/
$ scp core-site.xml hadoop-node2:/opt/bigdata/hadoop/server/hadoop-3.3.1/etc/hadoop/
# 重啟hadoop
$ stop-all.sh
$ start-all.sh
3)啟動hiveserver2(hs2)
$ nohup hiveserver2 > /dev/null 2>&1 &
$ jobs -l
# 啟動有點慢,可以稍等一段時間再查看埠
$ ss -antlp|grep 11000
4)連接,這裡root就是上面core-site.xml配置的代理用戶
【第一種方式】
$ beeline
beeline> !connect jdbc:hive2://hadoop-node1:11000
Enter username for jdbc:hive2://hadoop-node1:11000: root
# 密碼直接回車就行
Enter password for jdbc:hive2://hadoop-node1:11000:
0: jdbc:hive2://hadoop-node1:11000> show databases;
【第二種方式】
$ beeline -u jdbc:hive2://hadoop-node1:11000 -n root
5)在~/.bashrc中添加alias
$ alias beeline="beeline -u jdbc:hive2://hadoop-node1:11000 -n root"
$ beeline
除了上面那種連接方式,還有以下幾種方式
預設配置如下:
<!-- hs2埠 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<!-- hs2用戶登錄方式,NONE表示不登錄 -->
<property>
<name>hive.server2.authentication</name>
<value>NONE</value>
</property>
這裡需要稍微講一下hive.server2.authentication的這種類型,連接方式如下:
- NONE:這種類型就是預設值,hive沒有啟用用戶安全認證,任何登錄者都擁有超級許可權,可以對hive進行任意操作。
- NOSASL:需要任意一個用戶名,不需要密碼,不填寫或者填寫錯誤用戶名會導致報錯。
- KERBEROS:用戶需要擁有hive的keytab文件(類似於ssh-key等密鑰),有了keytab就相當於擁有了永久的憑證,不需要提供密碼,因此只要linux的系統用戶對於該keytab文件有讀寫許可權,就能冒充指定用戶訪問hadoop,因此keytab文件需要確保只對owner有讀寫許可權。
- LDAP:hive採用ldap統一認證服務,連接訪問時需要提供username和password。
- PAM:hive採用pam認證模塊,同樣需要提供username和password,只是原理大不相同。
PAM(Pluggable Authentication Modules)即可插拔式認證模塊,它是一種高效而且靈活的用戶級別的認證方式,它也是當前Linux伺服器普遍使用 的認證方式。PAM可以根據用戶的網段、時間、用戶名、密碼等實現認證。並不是所有需要驗證的服務都使用PAM來驗證,如MySQL-Server就沒有安 裝相應的PAM文件。
- CUSTOM:可以根據自身需求對用戶登錄認證進行一定客制,比如將密碼通過md5進行加密等。
3)DataGrip客戶端
這裡提供一個別人破解安裝DataGrip的教程,如果沒安裝DataGrip,可以參考一下:http://www.32r.com/soft/70050.html
1、創建工程
2、關聯本地目錄到工程
3、配置連接hive
六、實戰操作
Hive SQL跟mysql等關係型資料庫的操作非常相似,如果瞭解過或學習過關係型資料庫,使用Hive SQL就非常簡單,學習成本也非常低。
1)建庫,建表
hive有個預設的資料庫default
1、建庫
# 建庫
create datatabse test1218
# 查庫
show databases;
# 查看當前所在庫
select current_database();
# 切庫
use test1218;
select current_database();
2、建表
分隔符
Hive 中沒有定義專門的數據格式,數據格式可以由用戶指定,用戶定義數據格式需要指定三個屬性:列分隔符(通常為空格、”\t”、”\x001″)、行分隔符(”\n”)以及讀取文件數據的方法。
\n 每行記錄分隔符
^A 分隔列(八進位 \001),對應ascii碼SOH;
^B 分隔ARRAY或者STRUCT中的元素,或者MAP中多個鍵值對之間分隔(八進位 \002)
^C 分隔MAP中鍵值對的“鍵”和“值”(八進位 \003)
對應sql設置
row format delimited
fields terminated by '\001'
collection items terminated by '\002'
map keys terminated by '\003'
lines terminated by '\n'
stored as textfile;
創建表
-- 創建表時指定庫,預設分隔符
CREATE TABLE IF NOT EXISTS test1218.person (
id INT,
name STRING,
age INT,
likes ARRAY<STRING>,
address MAP<STRING,STRING>
);
-- 創建表時指定庫,指定分隔符
CREATE TABLE IF NOT EXISTS test1218.person_1 (
id INT COMMENT 'ID',
name STRING COMMENT '名字',
age INT COMMENT '年齡',
likes ARRAY<STRING> COMMENT '愛好',
address MAP<STRING,STRING> COMMENT '地址'
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
show tables;
在HDFS頁面上查看對應的文件
3、上傳表數據到HDFS
person_1表數據
1,t1,18,lol-book-movie,地址:廣東.深圳.南山
2,t2,20,lol-book-movie,地址:廣東.深圳.南山
3,t3,21,lol-book-movie,地址:廣東.深圳.南山
4,t4,21,lol-book-movie,地址:廣東.深圳.南山
5,t5,21,lol-book-movie,地址:廣東.深圳.南山
6,t6,21,lol-book-movie,地址:廣東.深圳.南山
通過命令上傳數據
$ hadoop fs -put person_1-data.txt /user/hive_remote/warehouse/test1218.db/person_1/
$ hadoop fs -ls /user/hive_remote/warehouse/test1218.db/person_1/
查看數據
select * from test1218.person_1;
2)查看
# 顯示所有庫
show databases ;
# 查看當前庫
select current_database();
# 查看default庫里的表
show tables in default;
# 查看當前數據里的表
show tables ;
# 查詢顯示一張表的元數據信息
desc formatted person_1;
3)註釋COMMENT中文亂碼解決
【原因】元數據保存在mysql中,預設不支持中文,預設的編碼是latin1
desc formatted person_1;
【解決】修改Hive存儲的元數據信息(metastore),下麵語句是在mysql中執行,資料庫記得換成自己的。
use hive_local;
show tables;
alter table hive_local.COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table hive_local.TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table hive_local.PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table hive_local.PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
alter table hive_local.INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
再查看還是沒改過來,是因為對已經創建的表是不生效的,得刪除表重新創建表才會顯示正常。
# 刪表
drop table test1218.person_1;
# 創建表
-- 創建表時指定庫,指定分隔符
CREATE TABLE IF NOT EXISTS test1218.person_1 (
id INT COMMENT 'ID',
name STRING COMMENT '名字',
age INT COMMENT '年齡',
likes ARRAY<STRING> COMMENT '愛好',
address MAP<STRING,STRING> COMMENT '地址'
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
再查看表的元數據信息,中文註釋信息顯示正常了
desc formatted person_1;
4)Load載入數據(推薦)
# 創建表
create table person_local_1(id int,name string,age int) row format delimited fields terminated by ',';
create table person_hdfs_1(id int,name string,age int) row format delimited fields terminated by ',';
show tables;
# 從local載入數據,這裡的local是指hs2服務所在機器的本地linux文件系統
load data local inpath '/opt/bigdata/hadoop/data/hive-data' into table person_local_1;
# 查詢
select * from person_local_1;
# 從hdfs中載入數據,這裡是移動,會把hdfs上的文件mv到對應的hive的目錄下
load data inpath '/person_hdfs.txt' into table person_hdfs_1;
# 查詢
select * from person_hdfs_1;
5)Insert添加數據(特別慢,不推薦)
insert into table person_hdfs_1 values (4,'p4',21);
上面那條插入語句會啟動一個MR任務
更多Hive SQL操作,可以參考官方文檔:https://hive.apache.org/