本文是學習時的自我總結,用於日後溫習。如有錯誤還望諒解,不吝賜教 一、安裝方式(內嵌模式,本地模式遠程模式) 安裝環境以及前提說明: Hive是依賴於hadoop系統的,因此在運行Hive之前需要保證已經搭建好hadoop集群環境。 本例中使用的hadoop版本為2.6.1,Hive版本為2.1.1 ...
本文是學習時的自我總結,用於日後溫習。如有錯誤還望諒解,不吝賜教
一、安裝方式(內嵌模式,本地模式遠程模式)
安裝環境以及前提說明:
Hive是依賴於hadoop系統的,因此在運行Hive之前需要保證已經搭建好hadoop集群環境。
本例中使用的hadoop版本為2.6.1,Hive版本為2.1.1版。
1.Hive的3種安裝方式:
1)內嵌模式(元數據保存在內嵌的derby種,允許一個會話鏈接,嘗試多個會話鏈接時會報錯)
2)本地模式(本地安裝mysql 替代derby存儲元數據)
3)遠程模式(遠程安裝mysql 替代derby存儲元數據)
2.內嵌模式參數:
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=/usr/local/hive/bin/metastore_db;create=true</value>
描述了hive元數據存儲的位置
3.Mysql的幾個操作
1)查詢平臺本身的Mysql版本和安裝的MySQL是否是同一個版本,不一致要刪除舊的資料庫
2)安裝缺少的兩個rpm包:libaio 和 perl。聯外網(虛擬機要橋接到外網,配置外網後如果ping IP可行,ping功能變數名稱不行,則需要把ifcfg-eth0複製一份拷貝到dns中)或下載後拷貝到伺服器
3)按項目規模選擇合適的配置文件
①my-small.cnf是為了小型資料庫而設計的。不應該把這個模型用於含有一些常用項目的資料庫。
②my-medium.cnf是為中等規模的資料庫而設計的。如果你正在企業中使用RHEL,可能會比這個操作系統的最小RAM需求(256MB)明顯多得多的物理記憶體。由此可見,如果有那麼多RAM記憶體可以使用,自然可以在同一臺機器上運行其它服務。
③my-large.cnf是為專用於一個SQL資料庫的電腦而設計的。由於它可以為該資料庫使用多達512MB的記憶體,所以在這種類型的系統上將需要至少1GB的RAM,以便它能夠同時處理操作系統與資料庫應用程式。
④my-huge.cnf是為企業中的資料庫而設計的。這樣的資料庫要求專用伺服器和1GB或1GB以上的RAM。
這些選擇高度依賴於記憶體的數量、電腦的運算速度、資料庫的細節大小、訪問資料庫的用戶數量以及在資料庫中裝入並訪問數據的用戶數量。隨著資料庫和用戶的不斷增加,資料庫的性能可能會發生變化。
4)考慮安全問題要對root用戶設置密碼並刪除空用戶;創建一個普通用戶,並給普通用戶賦予localhost和%(遠程)的許可權;為普通用戶創建一個資料庫
5)查看許可權和更新許可權
SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user;
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='hive';
6)初始化MySQL資料庫
schematool -dbType mysql -initSchema
4.本地模式參數
1)<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/hive?createDatabaseIfNotExist=true</value>
為Hive創建的訪問MySQL的用戶的庫空間
2)<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
MySQL的JDBC驅動(需要把mysql的驅動包放到目錄 <HIVE_HOME>/lib 中)
3)<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
為Hive創建的訪問MySQL的用戶
5.遠程模式需要配置那些文件
1)配置環境變數:/.bashrc
2)配置Hadoop和Hive的路徑:hive-env.sh
3)hive-default.xml.template --> hive-site.xml
4) hive.server2.thrift.port– TCP 的監聽埠,預設為10000。
hive.server2.thrift.bind.host– TCP綁定的主機,預設為localhost
5)啟動
hive --service metastore &
hive --service hiveserver2 &
二、Hive
1. 什麼是Hive
是建立在Hadoop基礎上的數據倉庫基礎架構。可以用來進行數據提取轉化載入(ETL),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為QL,類似於SQL語句。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的mapper和reducer來處理內建的mapper和 reducer 無法完成的複雜的分析工作。
Hive 是 SQL解析引擎,它將SQL語句轉譯成Map/Reduce Job然後在Hadoop執行。
Hive的表其實就是HDFS的目錄,按表名把文件夾分開。如果是分區表,則分區值是子文件夾,可以直接在Map/Reduce Job里使用這些數據。
2. Hive實現WordCount
- 創建一個資料庫,如create database word;
- 建表
create external table word_data(line string) row format delimited fields terminated by '\n' stored as textfile location '/home/hadoop/worddata';
- 根據MapReduce的規則,我們需要進行拆分,把每行數據拆分成單詞,這裡需要用到一個hive的內置表生成函數(UDTF):explode(array),參數是array,其實就是行變多列:
create table words(word string);
insert into table words select explode(split(line, " ")) as word from word_data;
split是拆分函數,跟java的split功能一樣,這裡是按照空格拆分,所以執行完hql語句,words表裡面就全部保存的單個單詞 - 這樣基本實現了,因為hql可以group
by,所以最後統計語句為:
select word, count(*) from word.words group by word;
註釋:word.words 庫名稱.表名稱,group by word這個word是create table words(word string) 命令創建的word string
3.Java連接Hive查詢表信息
public class HiveTest {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
private static ResultSet res;
public static void main(String[] args) throws Exception {
Class.forName(driverName);//載入驅動
Connection conn = DriverManager.getConnection(
"jdbc:hive2://192.168.111.219:10000/default", "hive", "123456");//建立連接
Statement stmt = conn.createStatement();//聲明
res = stmt.executeQuery("select * from userinfo");//用聲明stmt對象下的executeQuery方法查詢
while (res.next()) {
System.out.println(res.getInt(1) + "\t" + res.getString(2));
}
res.close();
stmt.close();
conn.close();
}
}
4.Hive支持的數據類型
1)基本數據類型:數值類型、布爾型和字元串(TIMESTAMP、BINARY)
TINYINT 1位元組 有符號整數
SMALLINT2位元組 有符號整數
INT 4位元組 有符號整數
BIGINT 8位元組 有符號整數
FLOAT 4位元組 單精度浮點數
DOUBLE 8位元組 雙精度浮點數
2)複雜數據類型:ARRAY、MAP 和 STRUCT
5.Hive的數據類型轉換
1)隱式類型轉換的規則:
任何整數類型可以隱式地轉換為一個範圍更廣的類型。
所有整數類型、FLOAT 和 STRING 類型都能隱式轉換為 DOUBLE。
TINYINT、SMALLINT 和 INT 都可以轉換為 FLOAT。
BOOLEAN 類型不能轉換為其他任何類型。
TIMESTAMP 可以被隱式轉換為 STRING。
2)顯示數據類型轉換(CAST)
例如,CAST(‘1’ AS INT) 把字元串’1’轉換成整數值 1。
6.內表和外表
EXTERNAL 關鍵字可以讓用戶創建一個外部表,在建表的同時指定一個指向實際數據的路徑(LOCATION)。
Hive 創建內部表時,會將數據移動到數據倉庫指向的路徑;若創建外部表,僅記錄數據所在的路徑,不對數據的位置做任何改變。在刪除表的時候,內部表的元數據和數據會被一起刪除,而外部表只刪除元數據,不刪除數據。
11.Hive的三種啟動方式
1) hive 命令行模式
進入hive安裝目錄,輸入bin/hive的執行程式,或者輸入 hive –service cli
用於linux平臺命令行查詢,查詢語句基本跟mysql查詢語句類似
2) hive web界面的啟動方式
bin/hive –service hwi (& 表示後臺運行)
用於通過瀏覽器來訪問hive,感覺沒多大用途,瀏覽器訪問地址是:127.0.0.1:9999/hwi
3) hive 遠程服務 (埠號10000) 啟動方式
bin/hive –service hiveserver2 &(&表示後臺運行)
用java,python等程式實現通過jdbc等驅動的訪問hive就用這種起動方式了,這個是程式員最需要的方式
二、資料庫
1.hive會為每個資料庫創建一個目錄。數據是庫中的表將會以這個資料庫目錄的子目錄形式存儲。
有一個例外就是default數據中的表,因為這個資料庫本身沒有自己的目錄。
資料庫所有的目錄位於屬性hive.metastore.warehouse.dir所指定的頂層目錄之後。
用戶可以通過如下命令來修改這個預設的位置
create database financials location '/my/preferred/directory';
- 建立資料庫:create database if not exists financials;
- 顯示Hive中所包含的資料庫:show databases;
- 使用正則表達式匹配來篩選出需要的資料庫名:show databases like 'h.*';
- 為資料庫增加一個描述信息並查看:create database financials comment 'Holds all financial tables'; describe database financials
- 切換資料庫:use financials
- 顯示當前資料庫:set hive.cli.print.current.db=true
- 刪除資料庫:drop database if exists financials(庫中沒有表); drop database if exists financials CASCADE;(庫中有標強刪)
- 用root登陸Mysql,給用戶添加CREATE,DROP許可權:
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON hive.* TO hive@'%' identified by '123456';
FLUSH PRIVILEGES;
三、數據類型舉例
1、建表命令
CREATE TABLE employee(
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING,FLOAT>,
address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>)
row format delimited fields terminated by '\001'
collection items terminated by '\002'
MAP KEYS terminated by '\003'
LINES terminated by '\n'
stored as textfile;
2、查看表結構:describe employee;
3、導數據:load data local inpath '/root/employees.txt' into table employee;
4、查詢表內容
SELECT * FROM employee;
SELECT name ,salary FROM employee;
SELECT name , subordinates[0] FROM employee;
SELECT name , deductions["State Taxes"] FROM employee;
SELECT name , address.city FROM employee;
四、建表方式
1.直接建立表
2.指定表空間建立表
CREATE TABLE mydb.employee(
name STRING,
subordinates ARRAY<STRING>)
row format delimited fields terminated by '\001'
collection items terminated by '\002'
LINES terminated by '\n'
stored as textfile;
3.複製表結構建立新表(LIKE)
CREATE TABLE IF NOT EXISTS copy_employee LIKE employee;
4.複製指定表欄位結構及數據並建立表(AS SELECT)
CREATE TABLE copy_part_employee AS SELECT name,subordinates from employee;
五、載入數據
1.從本地載入數據到表中:load data local inpath '/root/employees.txt' into table employee;
從HDFS中載入數據到表中:load data inpath '/test/employees.txt' OVERWRITE into table employee;
2.從原有的表employee中追加數據到表copy_employee:
insert INTO table copy_employee select * from employee
從原有的表employee中載入數據到表copy_employee,並替換掉原來的數據
insert OVERWRITE table copy_employee select * from employee;
3.創建表的時候通過select載入數據:
create table cr_employee as SELECT * from employee;
創建表的時候通過select 指定建立的欄位並載入指定欄位的數據
create table cr_employee1 as SELECT name from employee;
4.直接把與表結構相符的數據文件複製到表指定的存儲位置
dfs -put /root/employees.txt /user/hive/warehouse/employee;
六、表操作
1.表重命名(RENAME TO):ALTER TABLE employee RENAME TO rm_emp;
2.修改列信息(CHANGE COLUMN對某個欄位進行重命名,並修改其位置、類型或者註釋):
ALTER TABLE employee CHANGE COLUMN
name rename STRING COMMENT 'The people name';
3.增加列(ADD COLUMNS在表的最後添加欄位)
ALTER TABLE employee ADD COLUMNS(
addcol1 STRING COMMENT 'Application name',
addclo2 INT COMMENT 'The current session id');
4.刪除列或者替換列(REPLACE COLUMNS替換原來所有的欄位)
ALTER TABLE employee REPLACE COLUMNS(
rename STRING COMMENT 'name to rename',
resalary FLOAT COMMENT 'salary to resalary',
resub ARRAY<STRING> COMMENT 'subordinates to resub');
八、分區和分桶、視圖
1. 分區:
所謂分區(Partition) 對應於資料庫的 Partition 列的密集索引。在 Hive 中,表中的一個 Partition 對應於表下的一個目錄,所有的 Partition 的數據都存儲在對應的目錄中。
有時候只需要掃描表中關心的一部分數據,因此建表時引入了partition概念。
分區表指的是在創建表時指定的partition的分區空間。一個表可以擁有一個或者多個分區,每個分區以文件夾的形式單獨存在表文件夾的目錄下。
分區是以欄位的形式在表結構中存在,通過describetable命令可以查看到欄位存在,但是該欄位不存放實際的數據內容,僅僅是分區的表示(偽列)
2. 分桶
桶是更為細粒度的數據範圍劃分。
Hive採用對 列值哈希 除以 桶的個數 求餘 的方式決定該條記錄存放在哪個桶當中
優點:獲得更高的查詢處理效率;使取樣(sampling)更高效。
3. 視圖
和關係資料庫中的視圖一個概念,可以向用戶集中展現一些數據,屏蔽一些數據,提高資料庫的安全性。
九、Hive中order by、sort by、distribute by、cluster by的區別
order by對輸入做全局排序,只有一個reducer(多個reducer無法進行全局),輸入規模較大時,需要較長的計算時間。與資料庫的區別在於必須指定limit,因為數據量大時也只在一臺伺服器上,會出現無法輸出結果的情況,進行limit,就只有n*map number條記錄,一個reduce也可以處理
sort by在數據進入reducer前排序,sort by只保證同一reduce中的數據可以按指定欄位排序
distribute by按照指定的欄位對數據進行劃分到不同的輸出reduce/文件中
cluster by具有distribute by和sort by的功能,但是排序只能是倒排
十、Hive在建表時,可以通過'STORED AS FILE_FORMAT' 指定存儲文件格式。有以下幾種:
- TextFile:存儲空間較大,壓縮之後的文件不能分割與合併,查詢效率低;可直接存儲,載入速度最快;這種是預設的格式。
- SequenceFile:hadoop API提供的一種二進位文件支持,存儲空間最大,可分割與合併,查詢效率高,需要text文件轉換來載入
- RcFile:是一種行列存儲相結合的存儲方式。
1)將數據按行分塊,保證同一個record在一個塊上,避免讀一個記錄需要讀取多個block;
2)塊數據列式存儲,有利於數據壓縮和快速的列存取。查詢效率最高、存儲空間最小、但載入最慢。
十一、Sqoop = Sql to Hadoop
- Sqoop的作用:允許用戶將數據從結構化存儲器抽取到Hadoop 中,用於如MapReduce、Hive的進一步的處理。Sqoop可以將這些結果導回數據存儲器,供其他客戶端使用。
- Sqoop import命令參數的含義
sqoop import
--connect jdbc:mysql://localhost/hadoopguide #jdbc連接字元串
--table widgets #讀取的表名
-m 1 map #任務的個數
--target-dir /widgets #hdfs目標路徑
3. Sqoop導出命令的含義
sqoop export --connect jdbc:mysql://localhost/hadoopguide -m 1 --table sales_by_zip --export-dir /user/hive/warehouse/zip_profits --input-fields-terminated-by '\0001'
--connect mysql連接字元串
-m mapreduce的個數
--table 表明
--export-dir 導出路徑
--input-fields-terminated-by 輸入欄位的分割字元