hive整理總結


一, 基本了解

1.Hive的簡介

-1. 由Facebook開源用於解決海量結構化日志的數據統計,后稱為Apache Hive為一個開源項目。

-2. Hive是基於Hadoop的一個數據倉庫工具,可以將結構化數據文件映射成一張表,並提供類似SQL的查詢功能。一個數據可以建立多個數據庫,每一個數據庫都是一個數 據源。

-3. Hive的本質是將HQL轉化成MapReduce程序。

-4. Hive處理的數據存儲在HDFS,分析數據底層實現的是MapReduce,執行程序運行在Yarn上。

 

2.Hive的體系結構

 

-1. 用戶接口(Client):CLI(hive shell)、JDBC/ODBC(java訪問hive),WEBUI(瀏覽器訪問hive)

-2. 元數據(Metastore):表名、表所屬的數據庫(默認是default)、表的擁有者、列/分區字段、表的類型(是否是外部表)、表的數據所在目錄等; 默認存儲在自帶的derby數據庫中,推薦使用采用MySQL

-3. Hadoop:使用HDFS進行存儲,使用MapReduce進行計算;

-4. 驅動器:(Driver):包含:解析器、編譯器、優化器、執行器;

解析器:將SQL字符串轉換成抽象語法樹AST,這一步一般都用第三方工具庫完成,比如antlr;對AST進行語法分析,比如表是否存在、字段是否存在、SQL語義是否有誤(比如select中被判定為聚合的字段在group by中是否有出現);

編譯器:將AST編譯生成邏輯執行計划;

優化器:對邏輯執行計划進行優化;

執行器:把邏輯執行計划轉換成可以運行的物理計划。

對於Hive來說就是MR/TEZ/Spark;

 

3.Hive 優點與使用場景

-1. 操作接口采用類SQL語法,提供快速開發的能力(簡單、容易上手);

-2. 避免了去寫MapReduce,減少開發人員的學習成本;

-3. 統一的元數據管理,可與impala/spark等共享元數據;

-4. 易擴展(HDFS+MapReduce:可以擴展集群規模;支持自定義函數);

-5. 數據的離線處理;比如:日志分析,海量結構化數據離線分析…

-6. Hive的執行延遲比較高,因此hive常用於數據分析的,對實時性要求不高的場合;

-7. Hive優勢在於處理大數據,對於處理小數據沒有優勢,因為Hive的執行延遲比較高。

 

4. Hive的安裝和配置的一些注意點

-1. 安裝之前的准備(JDK,hadoop,Linux,mysql)

a. Java 1.7 

注意:  Hive 1.2版本   需要Java 1.7或更新版本。2.0版本的Hive版本與Java 1.6一起使用。強烈建議用戶開始轉向Java 1.8(參見  HIVE-8607)。  

b. Hadoop 2.x(首選),1.x(Hive 2.0.0之后不支持)。

Hive版本高達0.13還支持Hadoop 0.20.x,0.23.x.

c. Linux系統(推薦)

Hive常用於生產Linux和Windows環境。Mac是一個常用的開發環境。本文檔中的說明適用於Linux和Mac。在Windows上使用它將需要稍微不同的步驟。  

d. 關系型數據庫(預裝mysql)

hive的元數據保存在關系型數據庫中,默認元數據保存在自帶的derby數據庫,只能一個人登錄訪問

-2. Hive官網和文檔,以及下載地址的URL

官網:http://hive.apache.org

安裝文檔:https://cwiki.apache.org/confluence/display/Hive/Home

下載地址:http://archive.apache.org/dist/hive/

hiveserver2 metastore 區別

注意:單機的時候不要配置metastore服務,不然每次啟動beeline都需要先開啟metastore服務。

 


 

二,hive的操作命令(Hive命令最后都要加上;)

1.數據庫的基本操作

-1. 默認數據庫是default

-2. 創建數據庫:create database test;

-3. 列表顯示所有數據庫:show databases;

-4. 查看指定數據庫信息:desc database test;

查看指定數據庫的詳細信息:desc database extended test; [ 額外顯示創建數據庫時設置的屬性 ]

 

-5. 切換庫:use test;

-6. 刪除空數據庫:drop database test;

級聯刪除數據庫(包括表):drop database test cascade; [ 刪除之后數據庫在hdfs上的目錄也刪除 ]

更完善格式:drop database if exists test cascade; [ 如果數據庫不存在不會報錯 ]

-7. 修改數據庫信息

alter database database_name set dbproperties(property_name=property_value, ...); 

-8. 創建數據庫完整格式

create database|schema 關鍵字,database和schema 都可以

[if not exists] database_name 判斷是否存在,不存在創建

[comment database_comment] 數據庫的注釋

[location hdfs_path] 數據庫在hdfs上的目錄,默認/user/hive/warehouse/database_name

[with dbproperties (property_name=property_value, ...)]; 設置一些屬性

 

2. 數據表的基本操作(hive操作表時最好在表名前都加上數據庫名)

官網鏈接https://cwiki.apache.org//confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL

-1. 創建表(不指定databbase,默認表創建在default數據庫)

hive> create table student(id int,name string) row format delimited fields terminated by '\t' ;

 

-2. 顯示數據庫所有表:show tables;

 

 

-3. 刪除表和清空表

刪除表(表結構和數據,即整個表):drop table student;

清空表數據(只刪除表中的數據):truncate table student;

注意

1. truncate table student; 只能對管理表使用,不能對外部表使用

2. truncate 命令操作時表名前不能加上database_name

3. 外部表 drop 之后,數據表在hdfs上目錄的數據文件依然存在,實際是只刪除了保存在關系型數據庫中的元數據

4. 管理表 truncate 之后,數據表location 所在目錄的數據文件刪除,目錄依然存在。

管理表 drop 之后,數據表location 所在目錄刪除。刪除了元數據和數據文件,數據目錄。

外部表測試

 

管理表測試:

 

 

-4. 查看表信息

顯示表基本信息:desc student;

 

查看表詳細信息:desc extended student; [ 顯示的內容基本一致 ]

 

格式化顯示表詳細信息:desc formatted student;

 

-5. 查詢表(查詢優化是在驅動器優化階段做的工作,最好在表名前加上數據庫名)

不調用MR程序:select * from test_hive.student;

調用MR程序:select name from test_hive.student;

 

-6. 在命令行修改表的一些信息或者屬性(alter table語句 表名前不能加database)

a. 修改表名

alter table test rename to test_new;

b. 修改location

alter table test set location 'hdfs://nameservice1/data/test';

c. 修改表屬性 —— 設置表的編碼格式

alter table test3 set serdeproperties('serialization.encoding'='GBK');

 

-7. hive導入數據(實際上就是拷貝文件到表所在的目錄)

a. 導入文本數據

load data [local] inpath '/student.txt'

[overwrite] into table test_hive.student

[partition(part1='value1',part2='value2',...)]

local:加上local是加載本地數據,實際上是把本地文件上傳到到 hdfs,和調用fs -put命令一樣。

不加local是加載hdfs上數據。剪切數據,將加載的數據文件剪切到表的location目錄。

例:load data local inpath '/student.txt' into table test_hive.student;

load data inpath '/student.txt' into table test_hive.student;

overwrite:加上 overwrite 覆蓋導入,覆蓋現有表中的數據

不加上 overwrite追加導入,也稱 append 導入 。追加新導入的數據到表中。

例:load data inpath '/student.txt' overwrite into table test_hive.student;

例:load data inpath '/student.txt' into table test_hive.student;

inpath加載的數據的目錄,一般寫全路徑。可以指定到文件,也可以直接指定目錄,指定目錄會加載目錄下所有文件的數據。

partition向分區表中導入數據。

b. 導入其他表的數據(追加導入和覆蓋導入):底層執行mapreduce程序

insert into table test_hive.student_insert select * from student;

insert overwrite table test_hive.student_insert select * from student;

c. 創建表時通過select加載,直接導入數據(* 也可以換位某幾個字段):底層執行mapreduce程序

create table student_select as select * from student;

其實類似於以下兩句的組合:

create table student_select like student;

insert into table test_hive.student_select select * from student;

d. 創建表時指定location

注意:創建表指定location必須是不存在的目錄,不然創建表會失敗。可以先創建表,再刪除相應的目錄,再將數據上傳到對應的目錄。表就可以直接加載出數據。

 

-8. hive導出數據

1. insert overwrite [local] directory..命令導出數據

a. insert..local directory 導出hive表中數據到本地 【 可以指定導出文件的分隔符 】

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_insert_export'

row format delimited fields terminated by '\t'

select * from test_hive.student;

b. insert..directory 導出hive表中數據到HDFS文件系統

insert overwrite directory "/hive_insert_export/bb" select * from test_hive.student;

c. 注意點

1. 導出數據到本地,指定的目錄程序會覆蓋同名目錄或者文件,數據會丟失;導出數據到hdfs文件系統,指定的目錄程序不會覆蓋同名目錄或者文件,會在目錄下生成結果文件,原有文件保留。

2. 導出數據到本地,可以指定文件輸出的分隔符,不指定默認分隔符為^A(即\001);

導出數據到hdfs, 不能指定文件分隔符,只能使用默認分隔符^A(即\001)。

3. 執行insert導出數據,底層運行mapreduce程序,運行結束在指定的目錄下生成000000_0的結果文件。多個reduce任務,則依次類推000000_0/000001_0...可以通過設置參數指定reduce個數 。

set mapred.reduce.tasks=1; 或者 set mapreduce.job.reduces=1; 指定reduce任務個數為1

注意:如果程序沒有shuffle過程,也就是沒有reduce過程,程序map的輸出就是最終的數據,指定reduce的任務個數並不能決定最終結果輸出的文件數,最終結果依次是000000_0/000001_0......

3. hive -e 把查詢結果導出到一個指定文件

bin/hive -e 'select * from test_hive.student' > /opt/cdh-5.3.6/data/hive_e_export/aa

注意:1. 寫的目錄可以是存在的文件,也可以是不存在的文件,但是不能寫目錄

2. > 覆蓋寫入,>>追加寫入

3. 輸出的結果和查詢出的結果一樣,cli命令行第一行輸出字段名,beeline輸出表格形式的

4. sqoop工具

把關系型數據庫的數據導入到Hadoop與其相關的系統(HBase和Hive)中。

 

-9. 自帶的Export和Import功能(后來出的新功能)

export底層沒有執行mapreduce程序,實際上就是數據的備份,拷貝的包括有元數據。

指定的目錄必須是空的或者不存在的。

export table test_hive.student to '/hive_export_import';

 

import指定的目錄結構要和export的目錄結構一樣

import table test_hive.student_import from '/hive_export_import';

 

 

3. hive函數的相關操作

-1. 查看hive自帶的所有函數

show functions;

-2. 查看某個函數的用法

desc function upper;

-3. 查看某個函數的詳細用法(加上使用案例)

desc function extended upper;

 

upper具體操作顯示(upper:小寫轉成大寫)

select id,upper(name) uname from test_hive.student;

 

-4. 常用函數

a concat函數(字符串鏈接):select concat(empno,'_',sal) from emp;

b. substr函數(字符串的截取):select substr(hiredate,1,4) as year from emp;

c. day函數(天):select day(hiredate) as day from emp;

d. cast函數(類型轉換):select cast(1472704474123/1000 as int) from emp;

 

4. Hive與其他命令的交互操作(不要忘記最后的;)

-1 Hive與linux交互命令(前邊加上 !)

 !ls;

!pwd;

 

-2. 與hdfs交互命令(只能用dfs,不支持fs)

  dfs -ls /;

dfs -mkdir /words.txt;

 

 

5. Hive歷史命令查看

在當前用的 home 目錄下,有一個 .hivehistory 的隱藏文件,保存了hive執行的所有歷史命令

cat /home/beifeng/.hivehistory

 


 

三, 數據庫創建表的詳細操作

官方文檔創建表鏈接:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable

1. 創建數據庫表的完整格式

創建數據庫表(temporary臨時表,external外部表)

create [temporary] [external] table if not exists test.student(

ip string comment 'student ip', 列名和數據類型以及列的注釋

name string

)

comment 'beifeng student logs’ 表的注釋

partitioned by (date string,hour string) 創建分區表(也可以用comment注釋)

clustered by (id) sorted by(name) into 4 buckets 創建桶表

(clustered by數據分成bucket,sorted by對bucket中的數據排序)

row format delimited fields terminated '/t' 行分割符

colection items terminated ‘/n’, 列分隔符(列分割符默認是'/n',一般不寫)

stored as PARQUET 文件存儲格式(默認textfile)

location ‘/opt/modules/mydata' 表在HDFS上的數據目錄

[ create table test.aa ]as select * from student_ne 以子查詢的結果創建表

 

2. 創建表的方式

-1. 直接創建表

creata table student(id int,name string)row format delimited fields terminated by '\t';

-2. 把另外一張表的某幾個字段抽取出來創建成一張新表(創建的表包含數據)

create table test.student_as as select * from student;

create table test.student_name as select name from student;

-3. 復制表結構(創建的表不包含數據)

creata table student_new(

id int,

name string

)

like student

location '/user/hive/warehouse/student'

row format delimited fields terminated by '\t';

 

3. Hive數據表的類型

臨時表[了解],管理表,外部表,分區表,桶表

3.1 創建臨時表(關鍵字temporary) 了解

-1. 語法

create temporary table student_temp(

ip string comment 'student ip',

name string

)

-2. 臨時表的使用以及注意點

a. Hive 0.14.0開始提供創建臨時表的功能。臨時表只對當前session有效,session退出表自動刪除。

b. 如果創建的臨時表表名已存在,那么當前session引用到該表名時實際用的是臨時表,只有drop或rename臨時表名才能使用原始表;

c. 臨時表限制:不支持分區字段和創建索引。

-3. 臨時表的存儲類型配置

從Hive1.1開始臨時表可以存儲在內存或SSD,使用hive.exec.temporary.table.storage參數進行配置,該參數有三種取值:memory、ssd、default。

 

3.2 外部表和管理表(關鍵字:external)

-1. 語法

creata external table student_ext(

id int,

name string

)

row format delimited fields terminated by '\t';

-2. 管理表和外部表的異同

a. 外部表創建的時候多一個關鍵字external

b. 管理表刪除:數據庫表的數據和HDFS上的對應表文件同時刪除;

外部表刪除:只刪除數據庫表的數據,HDFS上的對應表文件不會刪除。

c. 外部表的這種情況保證了數據的安全性,防止誤操作刪除數據。

d. 一般情況下管理表創建表時不指定location,外部表創建表時需要指定location。

e. 除了創建表的時候外部表多了一個關鍵字,其他操作語句和管理表完全一致。

 

3.3 分區表的相關操作(關鍵字:partitioned by)

-1. 創建分區表(注意partpartitioned和row的順序)

天+小時(一般分區表和外部表一起使用)

create external table test_hive.log_partition(

id int,

name string

)

partitioned by (date string,hour string)

row format delimited fields terminated by '\t';

 

-2. 導入數據

load data local inpath '/opt/cdh-5.3.6/data/hive_partition/log_20170802_16' into table log_partition partition(date='20170802',hour='16');

load data local inpath '/opt/cdh-5.3.6/data/hive_partition/log_20170802_17' into table log_partition partition(date='20170802',hour='17');

load data local inpath '/opt/cdh-5.3.6/data/hive_partition/log_20170803_16' into table log_partition partition(date='20170803',hour='16');

 

-3. 查看分區表數據(單獨查看一個分區加上where條件即可)

select * from log_partition;

select * from log_partition where date='20170802' and hour='17';

查看目錄結構:

dfs -ls /user/hive/warehouse/test_hive.db/log_partition;

dfs -ls /user/hive/warehouse/test_hive.db/log_partition/date=20170802;

 

-4. 查看分區表(主要是查看分區情況):show partitions log_partition ;

 

-5. 刪除分區表(和drop table一樣,外部分區表只是刪除表中數據,不會刪除hdfs上的數據)

alter table log_partition drop partition(date='20170803');

 

-6. 手動重建分區(分區中文件存在,表中沒有數據)

非分區表,可以直接調用命令 fs -put 將數據上傳到相應表的目錄,表就可以加載出數據。

但是分區表 使用 fs -put 命令,將數據加載到分區對應的目錄,表不能加載數據。

方式一:

分區重建:實際是根據表的目錄結構在hive元數據的表PARTITIONS中重新寫入分區記錄

手動上傳數據導入分區表測試:

dfs -mkdir -p /user/hive/warehouse/test_hive.db/log_partition/date=20170803/hour=18;

dfs -put /opt/cdh-5.3.6/data/hive_partition/log_20170803_18 /user/hive/warehouse/test_hive.db/log_partition/date=20170803/hour=18;

select * from log_partition; [ 查看是否有上傳分區的數據(無數據,重建之后重新查詢) ]

分區重建命令:msck repair table log_partition;

通過測試發現:分區重建之后,可以把我們的外部分區表剛才刪除的分區的數據也加載出來。可以驗證是根據hdfs上數據的目錄結構重建的分區信息,也就是向表PARTITIONS中重寫記錄。因為剛才hdfs上數據並沒有刪除。

 

方式二:

添加分區:實際是根據添加的分區信息在hive元數據的表PARTITIONS中寫入了一條記錄。

alter table log_partition add partition(date='20170804',hour='18');

注意:幾級分區,寫幾級目錄。

如:alter table log_partition add partition(date='20170804'); 不能執行成功

完整測試:

dfs -mkdir -p /user/hive/warehouse/test_hive.db/log_partition/date=20170804/hour=18;

dfs -put /opt/cdh-5.3.6/data/hive_partition/log_20170804_18 /user/hive/warehouse/test_hive.db/log_partition/date=20170804/hour=18;

alter table log_partition add partition(date='20170804',hour='18');

 

-6. 分區表的應用場景

a. 由第三方提供的數據源或者數據源是日志文件;

b. 分區表一般采用外部表+分區表的格式;

c. 主要用於定時任務加載數據;

d. 主要用於同比或者環比分析數據。

注意:引用外部表數據是因為刪除外部表保留數據; 防止誤刪除操作,刪除所有數據;查詢時盡量利用分區字段,如果不使用分區字段,就會全部掃描。

-7. 分區表優點:分期增量抽取數據,定時任務完成,主要在於優化查詢。

 

3.4 創建桶表(關鍵字:clustered by,sorted by)

-1. 語法

creata table student_new(

id int,

name string

)

clustered by (id) sorted by(name) into 4 buckets

row format delimited fields terminated by '\t';

-2. 桶表的使用

a. Hive采用對列值哈希,然后除以桶的個數求余決定該條記錄存放在哪個桶當中;

b. 采用桶能夠帶來一些好處,比如JOIN操作. 對於JOIN操作兩個表有一個相同的列,如果對這兩個表都進行了桶操作. 那么將保存相同列值的桶進行JOIN操作就可以,可以大大較少JOIN的數據量;

c. hive中table可以分成partition,clustered by可以將table和partition分成bucket,

d. sorted by將bucket中的數據排序. 提升某些查詢操作效率,例如mapside join;

e. clustered by和sorted by不會影響數據的導入,用戶必須自己負責數據如何導 入,包括數據的分桶和排序。'set hive.enforce.bucketing = true'  可以自動控制上一輪reduce的數量從而適配bucket的個數,用戶也可以自己設置 mapred.reduce.tasks去適配bucket 個數。

-3. bucket主要作用

a. 數據sampling(抽樣)

b. 提升某些查詢操作效率,例如mapside join

c. buket的另一個功能是減少shuffle,根據查詢中的關鍵詞(過濾條件,group by條件,join 條件)來分桶,可以有效減少shuffle。

 

3.5 創建事物表

相關鏈接:http://blog.csdn.net/kinglin_zy/article/details/69219077

-1. 語法

CREATE TABLE table_name (

id int,

name string

)

CLUSTERED BY (id) INTO 2 BUCKETS STORED AS ORC

TBLPROPERTIES ("transactional"="true",

"compactor.mapreduce.map.memory.mb"="2048",

"compactorthreshold.hive.compactor.delta.num.threshold"="4",

"compactorthreshold.hive.compactor.delta.pct.threshold"="0.5" );

-2. Hive ACID事物表相關預設置:參閱Hive事務

a. 指定創建的表是ACID事物表。可選值:true/false,默認false。

TBLPROPERTIES(“transactional”=“true”);

b. 阻止事物表的所有自動壓縮。可選值:true/false,默認值“false”

TBLPROPERTIES(“NO_AUTO_COMPACTION”=“true”)

仍然可以使用Alter Table語句進行手動壓縮  。

例:alter table test [partition partition_condition] set serdeproperties(‘"orc.compress"="SNAPPY"');

c. 指定壓縮映射作業屬性

TBLPROPERTIES(“compactor.mapreduce.map.memory.mb”=“ 2048”)

d. 如果有超過4個delta目錄,則觸發較小的壓縮

TBLPROPERTIES(“compactorthreshold.hive.compactor.delta.num.threshold”=“ 4”)

e. 如果delta文件的大小與基本文件的大小比例大於50%,就會觸發主壓縮

TBLPROPERTIES(“compactorthreshold.hive.compactor.delta.pct.threshold”=“ 0.5”)

-3. 事物表介紹

a. 在表中使用插入,更新,刪除操作,需要定義事物表。從Hive 0.14.0開始,hive支持事物表的創建。

b. 表定義為事物表,不能轉換回非事物表,即不能更改TBLPROPERTIES(“transactional”=“false”)

c. 建表語句必須帶有into buckets子句和stored as orc TBLPROPERTIES ('transactional'='true')子句,並且不能帶有sorted by子句。(只能使用orc,並且必須創建桶表)

d. 除了以上要求,使用分區表還需要添加許多配置。參閱Hive事務

d. 不能修改bucket列的值,否則會報錯。

 


 

四, Hive中設置參數

1. 查看參數配置信息

查看當前所有參數配置信息:set; [ 顯示hive的所有信息以及hadoop的環境信息等參數配置信息 ]

查看某個參數配置信息:set property_name; 例:set mapreduce.job.reduces;

 

2. 設置屬性的幾種方式

-1. 在hive-site.xml 文件中設置

-2. 在hive命令行中使用 set命令 設置(臨時設置,在當前會話生效)

set property_name=property_value;

-3. with dbproperties 創建數據庫的時候指定一些屬性(必須加上with)

例:create database create_utf with dbproperties('serialization.encoding'='UTF-8');

-4. dbproperties 創建表的時候指定一些屬性

例:create table test2(name string) stored as orc tblproperties('serialization.encoding'='UTF-8');

-5. -hiveconf 在進入hive命令行的時候設置參數

bin/hive -hiveconf hive.root.logger=INFO,console [ 設置hive的日志顯示在前台 ]

-6. alter table 命令修改表屬性(可以修改dbproperties 預設置的屬性)

alter table test3 set serdeproperties(‘property_name=property_value');

例:alter table test3 set serdeproperties('serialization.encoding'='GBK');

 

3. 預定義表屬性可設置的屬性(TBLPROPERTIES指定表屬性)

參閱官方文檔TBLPROPERTIES

-1. 表的注釋

TBLPROPERTIES(“comment”=“ table_comment ”)

-2. 創建Hive和Hbase集成表時,指定hbase表名。參閱:HBase集成

TBLPROPERTIES(“hbase.table.name”=“ table_name ”)

-3. 創建不可變表。可選值:true/false,默認false,

TBLPROPERTIES(“immutable”=“true”);Hive 0.13.0開始,可以創建不可變表。不可變表數據不為空時,INSERT INTO操作將被禁止,INSERT OVERWRITE操作不受限制。但如果不可變表為空,則INSERT INTO仍然可以操作。不可變表可以防止意外更新,多次插入的誤操作。

-4. 在指定表的文件格式的時候可以指定壓縮格式。可選值:ZLIB,SNAPPY,NONE。

TBLPROPERTIES(“orc.compress”=“ZLIB”)

例:create table test(name string,id string) stored as orc tblproperties("orc.compress"="SNAPPY");

-5. Hive ACID事物表相關預設置:參閱Hive事務

-6. 指定PURGE,刪除表或者清除表的時候數據不會放到回收箱,會直接刪除。

TBLPROPERTIES(“auto.purge”=“true”)可選值:true/false,默認值“false”

在刪除表或者清除表數據的時指定PURGE:DROP TABLE [IF EXISTS] table_name [PURGE];

在Hive 0.7.0或更高版本中,如果表或者分區表分區不存在,DROP報錯,除非指定IF EXISTS或配置變量 hive.exec.drop.ignorenonexistent 設置為true。指定PURGE后,可以避免這種錯誤。

-7. 將管理表更改為外部表,反之亦然。可選值:true/false。

TBLPROPERTIES(“EXTERNAL”=“TRUE”)

-8. 僅在Parquet表上設置的屬性,用於存儲用於調整時間戳值的Java時區ID。

TBLPROPERTIES(“parquet.mr.int96.write.zone”=“ timeZoneId ”)

 

4. 在hive-site.xml配置hive cli命令行(即,bin/hive)一些便利的設置

-1. cli命令行顯示當前所在的數據庫名稱(效果:hive (t2)>)

<property>

<name>hive.cli.print.header</name>

<value>true</value>

<description>Whether to print the names of the columns in query output.</description>

</property>

-2. cli命令行查詢數據時顯示列名

<property>

<name>hive.cli.print.current.db</name>

<value>true</value>

<description>Whether to include the current database in the Hive prompt.</description>

</property>

 

 

5. 在hive-site.xml配置hive中數據在hdfs上的保存路徑

hive中數據默認保存路徑(default數據庫中的表直接在warehouse文件夾下創建數據表目錄)

default數據庫:/user/hive/warehouse/table_name

自定義數據庫:/user/hive/warehouse/database_name/table_name

hive中數據默認保存路徑在hive-site.xml中的設置,可以自行配置,修改數據保存路徑

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

<description>location of default database for the warehouse</description>

</property>

 

 


 

五, bin/hive命令行解析(可以指定執行文件,指定參數等)

bin/hive -help 顯示hive命令行所有可以追加的參數

 

1. -hiveconf指定參數運行命令行

例:bin/hive --hiveconf hive.root.logger=INFO,console [ 設置hive的日志顯示在前台 ]

2. -database指定數據庫進入cli命令行

bin/hive -database test_hive

3. -e不進入hive命令行測試sql語句使用

可以將執行結果追加/覆蓋保存文件中,執行結果包含列名

例:bin/hive -e "select * from test_hive.student" > /opt/cdh-5.3.6/data/test_hive/student_e_out

 

4. -f 指定命令行執行保存sql語句的文件

可以將執行結果追加/覆蓋保存文件中,執行結果包含列名

例 : bin/hive -f /opt/cdh-5.3.6/data/test_hive/student.sql > /opt/cdh-5.3.6/data/test_hive/student_out

 

5. -i:與用戶自定義 udf 時交互使用

 


 

六, 數據類型(表中屬性的類型)

1. 常用的數據類型

| TINYINT

| SMALLINT

| INT

| BIGINT

| BOOLEAN

| FLOAT

| DOUBLE

| DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)

| STRING

| BINARY -- (Note: Available in Hive 0.8.0 and later)

| TIMESTAMP -- (Note: Available in Hive 0.8.0 and later)

| DECIMAL -- (Note: Available in Hive 0.11.0 and later)

| DECIMAL(precision, scale) -- (Note: Available in Hive 0.13.0 and later)

| DATE -- (Note: Available in Hive 0.12.0 and later)

| VARCHAR -- (Note: Available in Hive 0.12.0 and later)

| CHAR -- (Note: Available in Hive 0.13.0 and later)

2. 復雜數據類型

| array_type

| map_type

| struct_type

| union_type -- (Note: Available in Hive 0.7.0 and later)

 

 

 

 


 

七, Hive幾種排序的方式

參考資料http://blog.csdn.net/jthink_/article/details/38903775

1. order by

a. 全局數據的排序;

b. 只要hive的sql中指定了order by所有的數據都會到同一個reducer進行處理,需謹慎使用;

即便是參數指定reduce的數量,程序還是會運行在1個reduce。

c. 如果開啟了嚴格模式hive.mapred.mode=strict(默認值是nonstrict),就必須指定 limit來限制輸出條數,因為所有的數據都會在同一個reducer端進行,數據量大的情況下可能不能出結果。

2. sort by

a. 一個reducer端的排序,保證局部有序,不能保證全局有序。

b. 一個reducer可以保證全局有序,可以設置參數:set mapreduce.job.reduces=1

c. sort by好處是:執行了局部排序之后可以為接下去的全局排序提高不少的效率。

3. distribute by

a. 類似MapReduce中的分區partition,是控制map的輸出在reducer是如何划分的;

b. hive會根據distribute by后面列,根據reduce的個數進行數據分發,默認是采用hash算法;

c. 一般distribute by和sort by一起使用,但是distribute by必須要寫在sort by之前,先分區再排序。

4. cluster by

a. cluster by的功能就是distribute by和sort by相結合,同時進行分區和排序;

b. 當distribute by和sort by字段相同時,可以使用cluster by;

b. 注意被cluster by指定的列默認只能是升序,不能指定asc(升序)和desc(降序)。

 

所有測試:

原表中的數據文件,所有數據顯示:測試基本采用對name字段進行分區或者排序

 

 

1. 測試 order by

設置1個reduce任務測試:

set mapreduce.job.reduces=1;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_order_reduce1'

select * from test_hive.student_by_test sort by name;

設置3個reduce任務測試:

set mapreduce.job.reduces=3;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_order_reduce3'

select * from test_hive.student_by_test order by name;

設置3個reduce任務結果顯示:

 

結果分析:設置reduce任務不為1,order by的執行reduce任務也是1個,執行結果只有1個文件。

 

2. 測試 sort by

設置1個reduce任務測試:

set mapreduce.job.reduces=1;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_sort_reduce1'

select * from test_hive.student_by_test sort by name;

設置3個reduce任務測試:

set mapreduce.job.reduces=3;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_sort_reduce3'

select * from test_hive.student_by_test sort by name;

設置3個reduce任務結果顯示:

 

結果分析:設置reduce任務為1時,sort by可以保證輸出結果的順序。

設置reduce任務不為1時,sort by只能保證每個reduce輸出結果有序。

 

3. 測試 distribute by

設置3個reduce任務,單獨distribute by測試:

set mapreduce.job.reduces=3;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_distribute_reduce3'

select * from test_hive.student_by_test distribute by id;

 

設置3個reduce任務,distribute by和sort by結合使用測試:

set mapreduce.job.reduces=3;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_distribute_reduce3_sort'

select * from test_hive.student_by_test distribute by id sort by name;

 

結果分析:首先指定 distribute by,發現表中的26條數據均勻分割給每個reduce,當指定sort by和distribute by結合使用的時候,可以保證單個reduce的數據有序。

 

4. 測試 cluster by

設置3個reduce任務測試:

set mapreduce.job.reduces=3;

insert overwrite local directory '/opt/cdh-5.3.6/data/hive_by_test/export_cluster_reduce3_id'

select * from test_hive.student_by_test cluster by id;

 

 


 

八, Hive自定義函數之UDF函數

1. UDF幾種類型

a. UDF(User-Defined-Function):一進一出

b. UDAF(User-Defined Aggregation Funcation):聚集函數,多進一出;

類似於:count/max/min

c. UDTF(User-Defined Table-Generating Functions):一進多出;

如lateral  view  explore()

2. 配置好maven環境,創建maven項目,在pom.xml文件中添加hadoop和hive的依賴

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-client</artifactId>

<version>2.5.0-cdh5.3.6</version>

</dependency>

<dependency>

<groupId>org.apache.hive</groupId>

<artifactId>hive-jdbc</artifactId>

<version>0.13.1-cdh5.3.6</version>

</dependency>

<dependency>

<groupId>org.apache.hive</groupId>

<artifactId>hive-exec</artifactId>

<version>0.13.1-cdh5.3.6</version>

</dependency>

 

3. 編寫UDF函數

a. 自定義UDF需繼成UDF類 【 源碼包:org.apache.hadoop.hive.ql.exec.UDF 】

b. 需要實現至少一個evaluate函數,可以實現多個,evaluate函數支持重載參數不限制。

c. UDF必須要有返回類型,可以返回null,但是返回類型不能為void;

d. UDF中最好Text/LongWritable等hadoop的字節碼數據類型,不推薦使用java類型;

自己實現的大寫轉小寫的UDF函數LowerUDF代碼

 

UDF類源碼:

 

4. 自定義函數的使用步驟

-1. 把程序打包放到目標機器上去。[普通的JAR file打包,和mapreduce程序打包的方式一樣]

-2. 進入hive客戶端,添加jar包到hive的class path中。[指定的是jar包本地目錄,要寫到jar文件]

例如:add jar /opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6/ownerUDF/hive_owner_UDF_lower.jar;

-3. 創建函數:加上temporary,代表臨時函數,只在當前窗口有效,退出當前hive窗口就失效。

create function my_lower as "hive.UDF.LowerUDF";

create temporary function my_lower_temp as "hive.UDF.LowerUDF";

-4. 查看自己的function

show function;

-5. HQL語句查詢驗證

select name,my_lower(name) lower_name from student_udf;

select name,my_lower_temp(name) lower_name from student_udf;

-6. 刪除函數:臨時函數和永久函數的drop方法要對應使用,不然會報錯,不能刪除成功。

drop function my_lower ;

drop temporary function my_lower_temp;

 

5. 創建UDF函數的新方法(簡單方式 hive 0.13之后才有的)

-1. 創建函數

create function self_lower as 'hive.UDF.LowerUDF' using jar 'hdfs://bigdata-cdh.ibeifeng.com:8020/hive_UDF/owner_lower.jar';

create temporary function self_lower_temp as 'hive.UDF.LowerUDF' using jar 'hdfs://bigdata-cdh.ibeifeng.com:8020/hive_UDF/owner_lower.jar';

-2. HQL語句查詢驗證

select name,self_lower(name) lower_name from student_udf;

select name,dzl_lower(name) lower_name from student_udf;

-3. 注意點:

a. 這種方法創建UDF函數,也是可以創建臨時和非臨時函數。對應的刪除方法一樣。

b. 這種方法創建UDF函數,使用show function不能顯示出函數,但是可以正常使用。

c. 執行語句中的目錄必須是hdfs上的目錄,主機名,端口號不能漏寫,文件要寫到jar文件。

6. UDF函數日常應用中注意事項

-1. 一般我們不會把UDF函數設置為永久生效

-2. 日常應用時,函數都是跟着業務(job)走的,用到相應函數時我們才會去添加這個函數。

 


 

九, hive提供的服務組件了解 —— metastore 服務以及hiveserver2服務

1. 查看hive提供的service:bin/hive -service help

 

2. 啟動hive service:bin/hive --service 服務組件名

例:bin/hive -service hiveserver2

3. 具體服務的幫助信息:bin/hive --service metastore --help

 

 

4. hive metastore 服務

hive三種配置方式鏈接http://blog.csdn.net/reesun/article/details/8556078

-1. 默認情況下,metastore和Hive服務運行在同一個進程里。使用這個服務,可以讓metastore作為一個單獨的(遠程)進程運行,使本機的hive成為一個服務端,遠程主機可以連接本機的hive。

-2. 當hive作為客戶端和服務端分開使用時,客戶端和服務端元數據的配置不同,服務端配置元數據保存的數據庫的四要素,客戶端配置metastore的相關配置(metastore服務的主機名和端口)。

-3. hive metastore在hive-site.xml文件中的配置(詳細參考偽分布式的配置,兩個配置參數)

-4. hive metastore的啟動:bin/hive --service metastore

后台啟動:nohup bin/hive --service metastore

注意:單機時,或者在本機(服務端hive)運行使用hive時,不需要啟動metastore服務。如果啟動了,不要再關閉metastore服務,關閉之后,使用 Thrift 服務(即,beeline命令行,JDBC連接hive)將無法連接hive元數據,,需要重新啟動。

 

5. hiveserver2 服務(遠程主機使用本機的hive服務,需要先開啟metastore服務)

hiveserver2 服務連接https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients

Hive-0.11.0版本中重寫了HiveServer代碼得到了HiveServer2,可以讓Hive以提供Trift服務的服務器形式來運行,提供新的Thrift API為開放API,可以允許許多不同語言編寫的客戶端進行通信,如:JDBC等。它還解決了HiveServer不能處理多於一個客戶端的並發請求,支持多客戶端的並發和認證。可以使用全新的beeline命令行遠程並發訪問hive服務端的hive服務。

-1. beeline 命令行的使用

beeline命令行相比較bin/hive命令行,查詢結果顯示的更好看一點,且查詢產生的日志是打印在開啟hiveserver2服務的服務端窗口,不在客戶端的beeline命令行打印。

1). 啟動hiveserver2(兩種啟動方式)

bin/hiveserver2

bin/hive --service hiveserver2

指定端口啟動:bin/hive --service hiveserver2 -p 10000 【 默認10000 】

2). beeline的方式連接

啟動 beeline:bin/beeline

連接:!connect jdbc:hive2://bigdata-cdh.ibeifeng.com:10000 beifeng beifeng org.apache.hive.jdbc.HiveDriver

3). jdbc 的交互方式連接beeline命令行(不同的進入beeline命令行的方法)

bin/beeline -u jdbc:hive2://bigdata-cdh.ibeifeng.com:10000/default beifeng beifeng

4). 退出beeline命令行 !q 或者 !quit

-2. JDBC連接hive

在我們處理數據量比較小的結果集的時候,可以使用JDBC連接的方式和前段交互,提高查詢效率。

1). 啟動hiveserver2

2). 代碼實現(代碼的實現和關系型數據庫一樣)

 

 

6. 其他服務

-1. cli這個就是Command Line Interface的簡寫,是Hive的命令行界面,用的比較多。這是默認的服務,直接可以在命令行里面使用。

-2. hwi其實就是hive web interface的縮寫,它是Hive的Web接口,是hive cli的一個web替換方案。

-3. jar與Hadoop jar等價的Hive的接口,這是運行類路徑中同時包含Hadoop和Hive類的Java應用程序的簡便方式。

 


 

十, Hive的壓縮

hive的壓縮依賴mapreduce,所以先檢驗本機的hadoop支持哪些壓縮格式。

查看本機hadoop可以使用的壓縮格式:bin/hadoop checknative

1. 設置本機hadoop支持Snappy壓縮

Snappy是一個Google開源的由C++ 編寫的用來壓縮和解壓縮的開發包。其目標不是最大限度壓縮或者兼容其他壓縮格式,而是旨在提供高速壓縮速度和合理的壓縮率。

優點:高壓壓縮速度和合理的壓縮比;

缺點:不支持split;壓縮率不是很高(沒有zlib高);hadoop本身不支持,需要自行編譯源碼。

-1. 下載安裝snappy

-2. 編譯 hadoop 2.x(官方提供的hadoop不支持snappy壓縮)

編譯命令:mvn package -Pdist,native -DskipTests -Dtar -Drequire.snappy

在源碼的 BUILDING.txt 文件中,對Snappy壓縮編譯的注釋:

 

-3. 將本機hadoop lib目錄下的native,替換成編譯后的安裝包中的native

編譯后hadoop包目錄:/opt/modules/hadoop-2.5.0-src/target/hadoop-2.5.0/lib/native

 

2. hive中支持壓縮的位置

-1. 處理的數據設置壓縮,也就是表中的數據設置壓縮

創建表的時候設置:stored as orc tblproperties ("orc.compress"="NONE");

map input的時候進行解壓

-2. map 輸出的文件可以設置壓縮(參數設置)

reduce 拷貝 map端的結果文件之后解壓

-3. reduce輸出的數據設置壓縮,也就是最終結果文件設置壓縮(參數設置)

Hive中(MapReduce中)的壓縮示意圖

 

 

3. 設置map階段和reduce階段數據進行壓縮(和mapreduce中設置的參數一樣)

-1. 設置map輸出壓縮的幾個屬性

mapreduce.map.output.compress

false

mapreduce.map.output.compress.codec

org.apache.hadoop.io.compress.DefaultCodec

-2. 設置reduce輸出,即output輸出文件壓縮的幾個屬性

mapreduce.output.fileoutputformat.compress.type:壓縮的類型(單條數據或者數據塊)

RECORD,單條記錄的壓縮;

BLOCK,可以壓縮一組記錄,一般推薦使用這個,有更好的壓縮比。

mapreduce.output.fileoutputformat.compress

false

mapreduce.output.fileoutputformat.compress.type

NONE, RECORD or BLOCK

mapreduce.output.fileoutputformat.compress.codec

org.apache.hadoop.io.compress.DefaultCodec

 


 

十一, Hive中的數據存儲

Hive文件存儲格式官網鏈接https://cwiki.apache.org/confluence/display/Hive/SerDe

1. 幾種Hive支持的存儲格式了解

-1 TEXTFILE默認的存儲格式

-2. RCFILE0.6.0開始支持,列式存儲

-3. ORC0.11.0開始支持(壓縮比更大,大約是textfile的7倍,比parquet大的多)

a. Hadoop生態圈中的列式存儲格式,2013年初產生,2015年提升為Apache頂級項目。

b. 壓縮快、快速列存取率比rcfile高,是rcfile的改良版本。

c. 最初產生自Apache Hive,用於降低Hadoop數據存儲空間和加速Hive查詢速度。

d. 存儲方式類似於parquet,根據行組分割整個表,每一個行組內按列存儲,以二進制方式存儲

e. ORC文件也是自解析的,它包含許多的元數據,這些元數據都是同構ProtoBuffer進行序列化的。

f. 目前也被Spark SQL、Presto等查詢引擎支持,但是Impala對於ORC目前沒有支持。

-4. PARQUET:0.13.0開始支持,0.10-0.12使用需要自己下載 Parquet Hive包

a. Parquet比較復雜,2015年5月成為Apache頂級項目,是Hadoop生態圈中一種新型列式存儲格式

b. 兼容Hadoop生態圈中大多數計算框架(Mapreduce,Spark等),支持多種查詢引擎(Hive,Impala等)

c. 列式存儲格式,高效壓縮和編碼,且使用更少的IO。

d. Parquet存儲結構支持嵌套數據結構以及高效且種類豐富的算法,以應對不同值分布特征的壓縮。

e. 表非常寬(column非常多)的時候,Parquet無論在資源利用率還是性能上都優勢明顯。

 

2. ORC詳解

-1. ORC文件結構

ORC文件,由一個File Footer(文件頁腳),一個Postscript(附言,備注)和若干個Stript(行數據)組成

Postscript(附言,備注)保存壓縮參數和壓縮頁腳的大小,在文件末尾

File Footer(文件頁腳)保存文件的輔助信息,包含文件中的條帶列表,每個條帶的行數以及每列的數據類型。

Stript(條帶)默認條帶大小為250 MB。大的條帶大小可以實現從HDFS讀取大量高效的數據。

如下圖所示,ORC文件中的每個Stripe(條帶)都保存Index Data(索引數據),Row Data(行數據)和Stripe Footer(行數據頁腳)。

Stripe Footer(行數據頁腳)包含流位置的目錄。

Row Data(行數據)用於表掃描,保存的是真正的數據。

Index Data(索引數據)包括每列的最小值和最大值以及每列中的行位置。行索引條目提供可以在解壓縮塊內尋找正確的壓縮塊和字節的偏移量。ORC索引僅用於查詢行數據位置,而不用於應答查詢。

ORC文件結構:

 

-2. 指定文件格式的三種設置方法:(不指定默認textfile)

a. 創建表時指定文件格式:create table test(name string) stored as orc;

b. alter table修改文件格式:(也可以指定單個分區)

alter table test [ partition partition_condition ] set fileformat orc;

c. set 設置創建表默認的文件格式:set hive.default.fileformat=orc;

-3. 指定數據格式,可以在tblproperties 設置相關參數

例如,創建一個沒有壓縮的ORC存儲表:

create table test(

name string, street string ) stored as orc tblproperties ("orc.compress"="NONE");

orc 文件格式tblproperties參數列表(后兩個參數在創建hive和hbase集成表的時候會用到)

參數

默認值

說明

orc.compress

ZLIB

高級壓縮(NONE,ZLIB,SNAPPY之一)

orc.compress.size

262,144

每一個壓縮快字節數大小

orc.stripe.size

268435456(256MB)

每個條帶中的字節數

orc.row.index.stride

10,000

索引條目之間的行數(必須> = 1000)

orc.create.index

true

是否創建行索引

orc.bloom.filter.columns

""(無)

創建bloom過濾器的列名稱,逗號分隔

orc.bloom.filter.fpp

0.05

bloom過濾器的假正概率(必須> 0.0和<1.0)

 


 

十二, Hive的優化

1. Hive查詢語句的調優 —— Fatchtask優化

Fatchtask優化:hive自身的一種優化,直接抓取數據不運行mapreduce程序,可選值minmal/more

默認值 minimal:select * 查詢,分區表一個分區數據的查詢,Limit查詢 不運行mapreduce程序。

優化值 more:優化之后,hive單獨列的查詢,where過濾查詢,以及虛擬列(列的查詢另外形式,如使用函數等對列的處理)的查詢等也不運行mapreduce程序。(只要不是join,排序,分區基本都可以)

配置參數 hive.fetch.task.conversion:

<property>

<name>hive.fetch.task.conversion</name>

<value>minimal</value>

<description>

Some select queries can be converted to single FETCH task minimizing latency.

Currently the query should be single sourced not having any subquery and should not have

any aggregations or distincts (which incurs RS), lateral views and joins.

1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only

2. more : SELECT, FILTER, LIMIT only (TABLESAMPLE, virtual columns)

</description>

</property>

 

 

2. 設置Hive本地模式(在本地運行,不需要啟動yarn)

hive.exec.mode.local.auto=true

當一個job滿足如下條件才能真正使用本地模式:

-1. job的輸入數據大小必須小於參數:hive.exec.mode.local.auto.inputbytes.max(默認128MB)

-2. job的map數必須小於參數:hive.exec.mode.local.auto.tasks.max(默認4)

-3. job的reduce數必須為0或者1

 

3. 大表的拆分

如果只是針對大表的某幾列操作就創建子表進行操作;

操作語句:create table emp_name as select name from emp

 

4. 外部表和分區表的使用(通常在企業是結合使用的)

a. 多個部門共用一個表的時候使用分區表,

b. 使用多級分區表實現優化,一般二級分區就可以。

 

5. 存儲格式和數據壓縮的優化

a. 一般數據格式選用 orc/parquet,壓縮格式一般選用 snappy,注意orc默認壓縮格式zlib

b. 設置壓縮的三個位置,輸入文件的壓縮,map輸出的壓縮,reduce輸出的壓縮。

 

6. 優化HQL語句

a. join語句的優化,例如鏈接兩個表的時候,先子查詢再鏈接

 

b. join的三種類型:

reduce Join發生在reduce階段,大表對大表,利用MapReduce會對相同的Key進行分組的特性

map輸出key設置為join的列,輸出的value為組合字段(標簽+除了join列剩余的數據)

Map Join發生在Map階段,一般是大表對小表的Join,利用的是 DistributedCache

SMB JoinSort-Merge-Bucket。對兩個大表join的優化策略。選取相對小的表將其參與join的key抽取出來,保存到文件File中,然后將文件放到內存中。在map階段,使用DistributedCache將File復制到各個map任務主機上,然后過濾掉另外一張表(文件)中不在File中的key的數據記錄,剩下的reduce階段的工作與reduce side join相同。

設置MSB Join的三個屬性:

set hive.auto.convert.sortmerge.join = true; set hive.optimize.bucketmapjoin = true; set hive.optimize.bucketmapjoin.sortedmerge = true;

 

7. 查看任務執行計划

語法使用:EXPLAIN [EXTENDED|DEPENDENCY|AUTHORIZATION] query

例如:Explain select * from emp;

Explain extended select * from emp; [ 打印出更多的擴展信息 ]

執行計划輸出內容

-1. 查詢語句的抽象語法樹

-2. 執行計划不同階段間的依賴關系

-3. 每個階段的描述

 

8. 並行計算優化(取值一般在10-20)

參數

默認值

說明

hive.exec.parallel

false

是否開啟並行執行

hive.exec.parallel.thread.number

8

並行執行的任務個數

 

9. JVM重用(取值一般在1-9,一般為5)

參數

默認值

說明

mapreduce.job.jvm.numtasks

1

 

 

10. map數目的優化(默認情況下由塊的大小決定)

參數

默認值

說明

hive.merge.size.per.task

256000000

 

 

11. reduce數目的優化

參數

默認值

說明

mapreduce.job.reduces

1

設置reduce的任務個數

 

12. 推測執行

推測執行默認是開啟的,主要是當一個reduce出現問題的時候,AplicationMaster會再執行一個reduce任務,這兩個哪個先執行完,就算任務執行。在Hive中要把推測執行關閉,因為Hive處理大量數據,速度本來就很慢,如果開啟推測執行,系統會對默認執行時間過長的任務出現問題,會重新開啟一個reduce任務,相當占用資源。

開啟推測執行的三個屬性:(三個參數都要設置為false)

參數

默認值

hive.mapred.reduce.tasks.speculative.execution

true

mapreduce.map.speculative

true

mapreduce.reduce.speculative

true

 

13. 動態分區

-1. 參數設置(主要是前兩個)

參數

默認值

說明

hive.exec.dynamic.partition

false

是否開啟動態分區

hive.exec.dynamic.partition.mode

strict

nostrict:允許所有分區都是動態的

strict:表示必須保證至少有一個分區是靜態的

hive.exec.max.dynamic.partitions

1000

一個動態分區創建語句可以創建的最大分區數

hive.exec.max.dynamic.partitions.pernode

100

每個mapper或reducer可以創建的最大動態分區個數

hive.exec.max.created.files

100000

全局可以創建的最大文件個數

-2. 創建分區表

create table yhd_part2(

id string,

url string,

guid string

)

partitioned by (date string,hour string)

row format delimited fields terminated by '\t';

-3. 加載數據(和靜態分區不同的地方)

動態分區加載數據:

insert into table test_part2 partition (date,hour) select * from test;

靜態分區加載數據:

insert into table test_part1 partition(date='20150828',hour='18')

select id,name from test where date='20150828' and hour='18';

insert into table test_part1 partition(date='20150828',hour='19')

select id,name from test where date='20150828' and hour='19';

 

14. 嚴格模式(一般會開啟,來實現系統優化)

參數

默認值

說明

hive.mapred.mode

nonstrict

是否開啟嚴格模式,strtic(開啟嚴格模式)

嚴格模式主要是對sql語句的檢驗,開啟嚴格模式對以下3種情況不能執行:

1. 分區表,不加分區字段過濾查詢,不能執行;

2. order by 必須使用 limit 語句限制

3. 限制笛卡爾積查詢(join的時候不適用 on ,而使用where)

eg:sleect * from A join B where A.name=B.name and A.id=B.id;

 


 

十三, hive元數據

參考網站:http://www.2cto.com/database/201311/255627.html

 

1. DBS表(Database表):該表存儲Hive Database的元數據信息

2. TBLS(Table 表):存儲Hive Table的元數據信息,

3. COLUMN_V2(字段表):該表存儲了一個CD_ID對應的所有字段信息

4. SDS表(數據存儲表):保存了Hive數據倉庫所有的HDFS數據文件信息

5. PARTITIONS PARTITION_KEY 和 PARTITION_KEY_VALS  (分區表信息)

PARTITION_KEYS 保存了所有分區表用於分區的字段

PARTITIONS存儲了Hive數據倉庫總所有的分區信息

PARTITION_KEY_VALS 存儲了PARTITION_KEY中描述的分區字段的值,通常配合 PARTITIONS 和PARTITION_KEYS表使用

 


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM