Linux環境Hive安裝配置及使用
1. 認識Hive
(1) Hive介紹:
- 官網:http://hive.apache.org/
- Apache Hive™資料倉儲軟體有助於使用SQL讀取,編寫和管理駐留在分散式儲存中的大型資料集。可以將結構投影到已儲存的資料中。提供了命令列工具和JDBC驅動程式以將使用者連線到Hive。
- hive提供了SQL查詢功能 hdfs分散式儲存。
- hive本質HQL轉化為MapReduce程式。
(2) Hive環境前提:
- 1)啟動hdfs叢集
- 2)啟動yarn叢集
- 如果想用hive的話,需要提前安裝部署好hadoop叢集。
(3) 為什麼要學習Hive:
- 簡化開發。easycoding!
- 高德地圖等知名軟體使用Hive。
- 優點:
- 1)操作介面採用類sql語法,簡單、上手快。
select * from XXX;
- 2)Hive可以替代mapreduce程式,sqoop(資料遷移)。
- 3)hive基於hdfs和yarn,可以處理海量資料。
- 4)hive支援UDF,自定義函式。
- 1)操作介面採用類sql語法,簡單、上手快。
- 劣勢:
- 1)處理資料延遲高,慢。(1.2.2以前版本都是用的mr引擎;2.x之後用的是spark引擎)
- 2)HQL的表達能力有限——一些sql無法解決的場景,依然需要寫mapreduce。
2. Hive架構原理解析
3. Hive-1.2.2安裝流程
Hadoop安裝見——juejin.im/post/5c7352…
(1) 解壓apache-hive-1.2.2-bin.tar.gz安裝包到目標目錄下:
tar -zxvf .tar.gz -C 目標目錄
(2) 為後續方便,重新命名Hive資料夾:
mv apache-hive-1.2.2-bin/ hive-1.2.2
(3) 修改配置檔案:
- 進入hive-1.2.2/conf路徑,重新命名配置檔案:
mv hive-env.sh.template hive-env.sh
- 修改hive-env.sh資訊:
vi hive-env.sh
-
# Set HADOOP_HOME to point to a specific hadoop install directory # 指定Hadoop安裝路徑 HADOOP_HOME=Hadoop安裝路徑 # Hive Configuration Directory can be controlled by: # 指定Hive配置資料夾 export HIVE_CONF_DIR=/XXXXXX/hive-1.2.2/conf 複製程式碼
(4) 配置環境變數:
- 修改配置檔案:
vi /etc/profile
- 增加以下內容:
export HIVE_HOME=hive安裝路徑
export PATH=$PATH:$HIVE_HOME/bin
# Hadoop環境加入Hive依賴
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
- 宣告環境變數:
source /etc/profile
(5) 啟動
hive
(6) 退出
quit;
(7) 配置MySQL後設資料庫
- Hive預設使用的資料庫是Derby,Derby不支援多個客戶端同時訪問,所以需要對Derby進行替換,現介紹用MySQL替換Derby的方法。
- 首先在此Linux環境中安裝MySQL資料庫:
- RHEL7安裝MySQL見——juejin.im/post/5c7558…
- CentOS7安裝MySQL見——juejin.im/post/5c763e…
- <1>. 上傳mysql驅動到hive/lib
- <2>. 在hive-1.2.2/conf路徑建立配置檔案hive-site.xml:
vi 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:mysql://主機名:3306/metastore?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>密碼</value> <description>password to use against metastore database</description> </property> # 查詢表時顯示錶頭資訊 <property> <name>hive.cli.print.header</name> <value>true</value> </property> # 顯示當前所在的資料庫 <property> <name>hive.cli.print.current.db</name> <value>true</value> </property> </configuration> 複製程式碼
- <3>. 重啟hadoop叢集
- <4>. 啟動hive:
hive
- <5>. 此時mysql中自動建立metastore後設資料庫
4. Hive資料型別
Java資料型別 | Hive資料型別 | 長度 |
---|---|---|
byte | TINYINT | 8位二進位制 |
short | SMALLINT | 2byte有符號整數 |
int | INT | 4byte有符號整數 |
long | BIGINT | 8byte有符號整數 |
boolean | BOOLEAN | false/true |
float | FLOAT | 單精度浮點 |
double | DOUBLE | 雙精度浮點 |
string | STRING | 字元 |
BINARY | 位元組陣列 |
5. Hive-DDL(Data Definition Language)
(1) 檢視資料庫
show databases;
(2) 建立庫
create database 資料庫名;
(3) 建立庫(標準寫法)
create database if not exists 資料庫名;
(4) 建立庫指定hdfs路徑
create database 資料庫名 location '路徑';
(5) 建立表
create [external] table [if not exists] 表名(引數) [partitioned by(欄位資訊)] [clustered by(欄位資訊)] [sorted by(欄位資訊)]
row format
---根據行格式化
delimited fields
---分割欄位
terminated by '切割符';
---分割依據- external:可選操作,加上建立的是外部表,去掉建立的是管理表(內部表)
- if not exists:可選操作,加上為標準寫法
- partitioned by(欄位資訊):可選操作,分割槽
- clustered by(欄位資訊):可選操作,分桶
- sorted by(欄位資訊):可選操作,排序
- **注意:**如果指定了hdfs路徑,建立的表存放於該路徑下
(6) 檢視錶型別:
desc formatted 表名;
- Table Type:
- MANAGED_TABLE——內部表
- EXTERNAL_TABLE——外部表
- **區別:**管理表刪除時hdfs中資料刪除,外部表刪除時hdfs中資料不刪除
(7) 查詢表
- 普通表查詢:
select * from 表名;
- 指定列查詢:
select 表名.列1, 表名.列2 from 表名;
- 指定列查詢設定別名
select 表名.列 (as) 列別名 from 列原名;
- 分割槽表查詢:
- 全查詢:
select * from 表名;
- **注意:**此時檢視的是整個分割槽表中的資料
- 單分割槽查詢:
select * from 表名 where 分割槽條件;
- **注意:**此時檢視的是指定分割槽中的資料
- 聯合查詢:
select * from 表名1 where 分割槽條件 union select * from 表名1 where 分割槽條件;
- 常用基礎查詢函式:
- 查詢總行數:
select count(1) from 表名;
- 查詢最大值:
select max(列名) from 表名;
- 查詢最小值:
select min(列名) from 表名;
- 查詢列總和:
select sum(列名) from 表名;
- 查詢列平均值:
select avg(列名) from 表名;
- 查詢結果只顯示前n條:
select * from 表名 limit n;
- 查詢總行數:
- where——過濾:
- 查詢A列n~m之間的資料:
select * from 表名 where A>n and A<m;
select * from 表名 where A between n and m;
select * from 表名 where A in(n,m);
- 查詢A列小於n或者大於m之間的資料:
select * from 表名 where A<n or A>m;
- 查詢A列不在n~m之間的資料:
select * from 表名 where A not in(n,m);
- 查詢A列為空的資料:
select * from 表名 where A is null;
- 查詢A列不為空的資料:
select * from 表名 where A is not null;
- like——模糊查詢(使用萬用字元):
- 查詢以n開頭的A列:
select * from 表名 where A like 'n%';
- 查詢第二位是n的A列:
select * from 表名 where A like '_n%';
- 查詢包含n的A列:
select * from 表名 where A like '%n%';
- 查詢以n開頭的A列:
- 查詢A列n~m之間的資料:
- group by——分組:
- 查詢按B分組的A列資料:
select A,B from 表名 group by B;
- 分組查詢中用having代替where
- 查詢按B分組的A列資料:
- Join操作:
- join(內連線):只有連線的兩張表中都存在與條件向匹配的資料才會被保留下來
- left join(左外連線):保留左表資料,右表沒有join上的欄位顯示為null
- right join(右外連線):保留右表資料,左表沒有join上的欄位顯示為null
- full join(滿外連線):結果會返回所有表中符合條件的所有記錄,如果有欄位沒有符合條件用null值代替
- 排序:
- Order By(全域性排序):
- 升序排序(可省略asc):
select * from 表名 order by 列名 asc;
- 降序排序:
select * from 表名 order by 列名 desc;
- 升序排序(可省略asc):
- Sort By(內部排序):
- 對每個reducer端資料進行排序,若只有一個reducer端結果與全域性排序相同。
- 設定reduce個數屬性(臨時):
set mapreduce.job.reduces = n;
- 升序排序(可省略asc):
select * from 表名 sort by 列名;
- 降序排序:
select * from 表名 sort by 列名 desc;
- Distribute By:
- distribute by控制在map端如何拆分資料給reducer端。hive會根據distribute by指定的列,對應reducer的個數進行分發,預設是採用hash演算法。sort by為每個reduce產生一個排序檔案。在有些情況下,需要控制某個特定行應該到哪個reducer,這通常是為了進行後續的聚集操作,distribute by剛好可以做這件事。因此,distribute by經常和sort by配合使用。
- 先按A列進行排序再按B列進行降序排序:
select * from 表名 distribute by A sort by B desc;
- Cluster By:
- 若distrbute by和sort by是相同欄位時,cluster by是distribute by和sort by相結合。
- 被cluster by排序的列只能是降序,不能指定asc和desc。
- 按A列進行排序:
select * from 表名 cluster by A;
select * from 表名 distribute by A sort by A;
- 上述兩語句等價
- Order By(全域性排序):
- 全查詢:
(8) 分割槽表操作
- 分割槽表在hdfs中分目錄資料夾。
- 新增單個分割槽:
alter table 表名 add partition(新分割槽資訊);
- **注意:**一次新增多個分割槽用空格分割即可
- 檢視分割槽:
show partitions 表名;
- 刪除分割槽:
alter table 表名 drop partition(分割槽資訊);
- 修復分割槽:(通過hdfs上傳分割槽檔案)
msck repair table dept_partitions;
(9) 分桶表操作
- 分桶表在hdfs中分檔案。
- 適用於非常大的資料集。
- 使用者需要統計一個具有代表性的結果或反映趨勢(抽樣)。
- 建立分桶表語句:
clustered by(欄位資訊) into n buckets
- 開啟分桶:
set hive.enforce.bucketing = true;
set mapreduce.job.reduces = -1;
- 共m桶,從第n桶開始抽,檢視a桶的A列資料(a<m-n):
select * from 表名(bucket n out of a on A);
(10) 檢視資料庫結構
desc database 資料庫名;
(11) 新增資料庫額外描述資訊
alter database 資料庫名 set dbproperties('key'='value');
(12) 查詢資料庫額外資訊
desc database extended 資料庫名;
(13) 檢視指定的資料庫(使用萬用字元)
show databases like 'i*';
(14) 刪除空庫
drop database 資料庫名;
(15) 刪除非空庫標準寫法
drop database if exists 資料庫名;
(16) 刪除非空庫
drop database 資料庫名 cascade;
(17) 刪除非空庫標準寫法
drop database if exists 資料庫名 cascade;
6. Hive-DML(Data Manipulation Language)
(1) 匯入資料
load data [local] inpath '/XXXX/檔名' into table 表名 [partition(分割槽位置)];
- load data:載入資料
- local:可選操作,加上local匯入是本地Linux中的資料,去掉local那麼匯入的是hdfs資料
- inpath:表示的是載入資料的路徑
- into table:表示要載入的對應表
- partition(分割槽位置):可選操作,向分割槽表中匯入資料時需要指定
(2) 向表中插入資料
insert into table 表名 partition(分割槽資訊) values(資料內容);
(3) 向表中插入sql查詢結果資料
insert overwrite table 表名 partition(分割槽資訊) select * from 表名 where 查詢條件;
create table if not exists 表名 as select * from 表名 where 查詢條件;
(4) 建立表直接載入資料
create table 表名(引數) row fromat delimited fields terminated by '切割符' locatition '';
- **注意:**locatition路徑是hdfs檔案的上一層資料夾,且資料夾內只有這一個檔案。
(5) 把操作結果匯出到本地linux
insert overwrite local directory '本地路徑' select * from 表名;
(6) 把hive中表資料匯出到hdfs中(拷貝操作)
export table 表名 to 'hdfs路徑';
(7) 把hdfs資料匯入到hive中(拷貝操作)
import table 表名 from 'hive路徑';
(8) 清空表資料
truncate table 表名;
7. Hive命令
(1) 不登入Hive客戶端直接輸入命令操作:
hive -e "Hive-DDL語句(注意分號)"
(2) 直接把sql寫入到檔案中:
hive -f sql路徑
(3) 在Hive中可以直接執行hdfs命令操作:
- 檢視hdfs檔案:
dfs -ls 路徑;
- 檢視hdfs檔案內容:
dfs -cat 檔案路徑;
- 建立hdfs目錄:
dfs -mkdir -p 目錄路徑;
- 上傳hdfs檔案:
dfs -put 檔案路徑 目錄路徑;
- ......
(4) 檢視歷史操作
cat ~/.hivehistory
8. UDF自定義函式
(1) 相關概念:
- UDF:一進一出
- UDAF:聚合函式,多進一出 e.g. count /max/avg
- UDTF:一進多出
(2) 檢視系統自帶函式:
show functions;
(3) 檢視系統自帶函式示範用法:
desc function extended 函式名;
(4) UDF自定義函式使用:
- <1>. 使用java編寫函式(類繼承org.apache.hadoop.hive.ql.exec.UDF),匯出jar包。
- <2>. 上傳至Linux中。
- <3>. 新增jar包:
- 臨時新增:
- 在Hive客戶端下輸入命令:
add jar jar包路徑;
- 建立關聯:
create temporary function 別名 as "java函式類";
- 在Hive客戶端下輸入命令:
- 註冊永久:
- 修改hive-site.xml配置檔案:
-
<property> <name>hive.aux.jars.path</name> <value>file://資料夾路徑</value> </property> 複製程式碼
-
- 修改hive-site.xml配置檔案:
- 臨時新增:
9. Hive壓縮——大量資料節省時間
(1) Map輸出階段壓縮方式:
- 開啟hive中間傳輸資料壓縮功能:
set hive.exec.compress.intermediate = true;
- 開啟map輸出壓縮:
set mapreduce.map.output.compress = true;
- 指定壓縮編碼——設定Snappy壓縮方式(高版本Hive自帶Snappy):
set mapreduce.map.output.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
(2) Reduce輸出階段壓縮方式:
- 開啟hive輸出資料壓縮功能:
set hive.exec.compress.output= true;
- 開啟mr輸出資料壓縮:
set mapreduce.output.fileoutputformat.compress = true;
- 指定壓縮編碼——設定Snappy壓縮方式:
set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
- 指定壓縮型別塊壓縮:
set mapreduce.output.fileoutputformat.compress.type = BLOCK;