本文是學習時的自我總結,用於往後溫習。若有錯誤還望諒解,不吝賜教java
1、安裝方式(內嵌模式,本地模式遠程模式)python
安裝環境以及前提說明:mysql
Hive是依賴於hadoop系統的,所以在運行Hive以前須要保證已經搭建好hadoop集羣環境。linux
本例中使用的hadoop版本爲2.6.1,Hive版本爲2.1.1版。程序員
1.Hive的3種安裝方式:web
1)內嵌模式(元數據保存在內嵌的derby種,容許一個會話連接,嘗試多個會話連接時會報錯)正則表達式
2)本地模式(本地安裝mysql 替代derby存儲元數據)sql
3)遠程模式(遠程安裝mysql 替代derby存儲元數據)數據庫
2.內嵌模式參數:apache
<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 &
2、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 external table word_data(line string) row format delimited fields terminated by '\n' stored as textfile location '/home/hadoop/worddata';
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就用這種起動方式了,這個是程序員最須要的方式
2、數據庫
1.hive會爲每一個數據庫建立一個目錄。數據是庫中的表將會以這個數據庫目錄的子目錄形式存儲。
有一個例外就是default數據中的表,由於這個數據庫自己沒有本身的目錄。
數據庫全部的目錄位於屬性hive.metastore.warehouse.dir所指定的頂層目錄以後。
用戶能夠經過以下命令來修改這個默認的位置
create database financials location '/my/preferred/directory';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON hive.* TO hive@'%' identified by '123456';
FLUSH PRIVILEGES;
3、數據類型舉例
一、建表命令
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;
二、查看錶結構:describe employee;
三、導數據:load data local inpath '/root/employees.txt' into table employee;
四、查詢表內容
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;
4、建表方式
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;
5、加載數據
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;
6、表操做
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');
8、分區和分桶、視圖
1. 分區:
所謂分區(Partition) 對應於數據庫的 Partition 列的密集索引。在 Hive 中,表中的一個 Partition 對應於表下的一個目錄,全部的 Partition 的數據都存儲在對應的目錄中。
有時候只須要掃描表中關心的一部分數據,所以建表時引入了partition概念。
分區表指的是在建立表時指定的partition的分區空間。一個表能夠擁有一個或者多個分區,每一個分區以文件夾的形式單獨存在表文件夾的目錄下。
分區是以字段的形式在表結構中存在,經過describetable命令能夠查看到字段存在,可是該字段不存放實際的數據內容,僅僅是分區的表示(僞列)
2. 分桶
桶是更爲細粒度的數據範圍劃分。
Hive採用對 列值哈希 除以 桶的個數 求餘 的方式決定該條記錄存放在哪一個桶當中
優勢:得到更高的查詢處理效率;使取樣(sampling)更高效。
3. 視圖
和關係數據庫中的視圖一個概念,能夠向用戶集中展示一些數據,屏蔽一些數據,提升數據庫的安全性。
9、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的功能,可是排序只能是倒排
10、Hive在建表時,能夠經過'STORED AS FILE_FORMAT' 指定存儲文件格式。有如下幾種:
1)將數據按行分塊,保證同一個record在一個塊上,避免讀一個記錄須要讀取多個block;
2)塊數據列式存儲,有利於數據壓縮和快速的列存取。查詢效率最高、存儲空間最小、但加載最慢。
11、Sqoop = Sql to Hadoop
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 輸入字段的分割字符