Hive官網:https://cwiki.apache.org/confluence/display/Hive
Hadoop
- 狹義
Hadoop是最重要最基礎的一個部分 - 廣義
Hadoop生態圈,包括Hadoop、Hive、Sqoop、HBase…
Hive概述
構建在Hadoop(HDFS/MapReduce/YARN)之上的數據倉庫
Hive的數據是存放在HDFS之上
Hive底層執行引擎:MapReduce/Tez/Spark,只需要通過一個參數就能夠切換底層的執行引擎,Hive作業提交到YARN上運行
提供了HQL查詢語言
和SQL類似,但不完全相同
所謂的大數據“雲化”:是一個很大項目
適用於離線處理/批處理
HDFS上的數據:文本 壓縮、列式存儲
SQL on Hadoop:Hive/Presto/Impala/Spark SQL…
元數據 vs 源數據
源數據:HDFS上的文件
元數據:是描述數據的數據
Hive架構
用戶接口層:黑窗口(cli)、JDBC
Driver/驅動器
SQL解析:SQL ==> AST(antlr)
查詢優化:邏輯/物理執行計劃
UDF/SerDes:
Execution:執行
元數據:表名、所屬數據庫、列(名/類型/index)、表類型、表數據所在目錄
id,username,password,age
Hive的數據是存放在HDFS之上
Hive的數據分爲兩部分:數據 + 元數據
Hive和RDBMS的對比
Hive和RDBMS的對比
相同點
SQL
事務
insert/update/delete Hive-0.14才支持
針對Hive數據倉庫,寫比較少的,批次加載數據到Hive然後進行統計分析
不同點
體量/集羣規模
延遲/時性
Hive部署
前置
要求 linux,jdk8以上,hadoop2.x以及mysql數據庫
安裝
移動tar包到指定目錄下
[root@JD ~]# mv hive-1.1.0-cdh5.16.2.tar.gz /home/hadoop/software
切換hadoop用戶
[root@JD ~]# su - hadoop
解壓到app目錄下
[hadoop@JD software]$ tar -zxvf hive-1.1.0-cdh5.16.2.tar.gz -C ~/app/
在配置環境變量
[hadoop@JD hive-1.1.0-cdh5.16.2]$ vi ~/.bashrc
export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.16.2
export PATH=$HIVE_HOME/bin:$PATH
重新加載環境變量
[hadoop@JD hive-1.1.0-cdh5.16.2]$ source ~/.bashrc
配置
$HIVE_HOME下目錄說明
bin:腳本
lib:依賴包
conf:配置文件
修改配置文件
-
創建hive-site.xml並增加配置,包括配置mysql數據配
javax.jdo.option.ConnectionURL jdbc:mysql://JD:3306/ruozedata_hive?createDatabaseIfNotExist=true[hadoop@JD conf]$ vi hive-site.xml
<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>xxx</value> </property> <property> <name>hive.cli.print.current.db</name> <value>true</value> </property> <property> <name>hive.cli.print.header</name> <value>true</value> </property>
-
將mysql驅動放到lib目錄下
使用root用戶將驅動放到lib目錄下 [root@JD ~]# mv mysql-connector-java-5.1.27-bin.jar /home/hadoop/app/hive-1.1.0-cdh5.16.2/lib 修改該文件的用戶和用戶組 [root@JD lib]# cd /home/hadoop/app/hive-1.1.0-cdh5.16.2/lib [root@JD lib]# chown hadoop:hadoop mysql-connector-java-5.1.27-bin.jar
-
配置hive日誌
[hadoop@JD conf]$ cp hive-log4j.properties.template hive-log4j.properties
-
解析hive日誌路徑
在hive-log4j.properties中查看到日誌的生成路徑 hive.log.dir=${java.io.tmpdir}/${user.name} hive.log.file=hive.log 解析結果 ${java.io.tmpdir}/${user.name}/${hive.log.file} /tmp/hadoop/hive.log
-
Hive配置屬性
全局配置在hive-site.xml中進行配置 當前session配置 查看當前的屬性:set key; 修改當前的屬性:set key=value; hive -hiveconf hive.cli.print.current.db=true
-
Hive中交互式命令
-e:不需要進入hive命令後,就可以跟上sql語句查詢 -f:執行指定文件(內容是SQL語句)
-
拓展:基於Hive的離線統計/數據倉庫
把SQL封裝到shell腳本中去,使用hive -e "query sql..." 定時調度:crontab
Hive使用
啓動hive
[hadoop@JD hive-1.1.0-cdh5.16.2]$ hive
基本命令
查看庫
hive (default)> show databases;
OK
database_name
default
Time taken: 3.231 seconds, Fetched: 1 row(s)
創建表
hive (default)> create table stu(id int,name string,age int);
OK
Time taken: 2.546 seconds
向表中插入數據
hive (default)> insert into stu values(1,'stefanboy',18);
Time taken: 16.617 seconds
查詢數據
hive (default)> select * from stu;
OK
stu.id stu.name stu.age
1 stefanboy 18
Time taken: 0.059 seconds, Fetched: 1 row(s)
清屏
hive (default)> !clear;
退出
hive (default)> !exit;
切換數據庫
hive (default)> use dbname;
查看錶結構
hive (default)> desc stu;
OK
col_name data_type comment
id int
name string
age int
Time taken: 0.063 seconds, Fetched: 3 row(s)
查看錶的詳細信息
hive (default)> desc formatted stu;
OK
col_name data_type comment
# col_name data_type comment
id int
name string
age int
# Detailed Table Information
Database: default
OwnerType: USER
Owner: hadoop
CreateTime: Sun Dec 15 17:35:59 CST 2019
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://JD:9000/user/hive/warehouse/stu
Table Type: MANAGED_TABLE
Table Parameters:
COLUMN_STATS_ACCURATE true
numFiles 1
numRows 1
rawDataSize 14
totalSize 15
transient_lastDdlTime 1576402663
# Storage Information
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
serialization.format 1
Time taken: 0.098 seconds, Fetched: 34 row(s)
默認存放路徑和執行日誌
創建stu表,默認存儲在HDFS的目錄是(可通過desc formatted stu命令進行查看)
hdfs://JD:9000/user/hive/warehouse/stu
其中hive默認的存放路徑(hive.metastore.warehouse.dir)爲:/user/hive/warehouse
表名:stu
表的完整路徑是: ${hive.metastore.warehouse.dir}/tablename
創建刪除庫
Hive中的數據抽象
Hive中的表(stu)必須要歸屬於某個數據庫(default)
Database
包含了0到N張表,每個db對應HDFS上的一個文件夾
default==>/user/hive/warehouse
創建數據庫(可以指定存儲路徑)
其中!是表示選擇一個 []表示可選
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]#備註
[LOCATION hdfs_path]#指定存儲路徑
[WITH DBPROPERTIES (property_name=property_value, ...)];#數據庫的信息
例如
CREATE DATABASE IF NOT EXISTS bigdata_hive;
CREATE DATABASE IF NOT EXISTS bigdata_hive3 COMMENT 'this is bigdata database' WITH DBPROPERTIES('creator'='stefanoy', 'date'='2016-12-15');
刪除數據庫(如果數據庫下面有表則刪除不成功;強制刪除命令CASCADE,哪怕下面有表也會刪除,慎用)
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
命令樣例
DROP DATABASE IF EXISTS bigdata_hive2;
CASCADE(瞭解即可,慎用): one2many == 1 db 對 多 table
數據類型
數值類型:int bigint float double decimal
字符串類型:string 90% #用的最廣
布爾類型:boolean: true/false
日期類型:date timestamp ...
分隔符
各種分隔符介紹
delimiter code
^A \001 字段之間的分隔符
\n \n 記錄分隔符
^B \002 ARRAY/STRUCT (Hive中的複雜數據類型)
^C \003 key/value of MAP (Hive中的複雜數據類型)
創建表的時候可以指定分隔符
指定','爲分隔符
create table stu2(id int, name string, age int) row format delimited fields terminated by ',';
insert into stu2 values(1,'stefanboy',18);
把/user/hive/warehouse/stu/000000_0下載到本地,查看數據的內容。