Hive從概念到安裝使用總結
一、Hive的基本概念
1.1 hive是什么?
(1)Hive是建立在hadoop數據倉庫基礎之上的一個基礎架構;
(2)相當于hadoop之上的一個客戶端,可以用來存儲、查詢和分析存儲在hadoop中的數據;
(3)是一種SQL解析引擎,能夠將SQL轉換成Map/Reduce中的Job在hadoop上執行。
1.2 hive的數據存儲特點
(1)數據存儲是基于hadoop的HDFS;
(2)沒有專門的數據存儲格式;
(3)存儲結構主要有:數據庫、文件(默認可以直接加載文本文件)、表、視圖、索引;
說明:hive中的表實質就是HDFS的目錄,按表名將文件夾分開,若是分區表,則分區值是子文件夾。這些數據可以直接在M/R中使用。hive中的數據是存放在HDFS中的。
二、hive的系統結構
存儲hive的元數據(表及表的屬性、數據庫名字等)
分析執行hive QL語句,將執行計劃投遞給hadoop,轉到map/reduce執行
2.1 hive的系統結構– metastore存儲方式
默認情況,元數據使用內嵌的derby數據庫作為存儲引擎
將存儲數據獨立出來,支持多用戶同時訪問
將metastore獨立出來,遠程方法調用
三、hive的安裝與使用
3.1下載hive源文件,解壓hive文件
進入$HIVE_HOME/conf/修改文件
- cp hive-default.xml.template hive-site.xml
- cp hive-env.sh.template hive-env.sh
修改$HIVE_HOME/bin的hive-env.sh,增加以下三行
- HADOOP_HOME= --hadoop的home目錄
- export HIVE_CONF_DIR= --hive的conf目錄
- export HIVE_AUX_JARS_PATH= --hive的lib目錄
生效文件:
- source /hive-env.sh(生效文件)
3.2 配置MySQL的metastore
修改$HIVE_HOME/conf/hive-site.xml
- <property>
- <name>javax.jdo.option.ConnectionURL</name>
- <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
- </property>
- <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>123456</value>
- </property>
3.3hive臨時目錄的配置
修改$HIVE_HOME/conf/hive-site.xml
(1)設定數據目錄
- <property>
- <name>hive.metastore.warehouse.dir</name>
- <value>/usr/local/hive/warehouse</value>
- </property>
(2)設定臨時文件目錄
- <property>
- <name>hive.exec.scratdir</name>
- <value>/usr/local/hive/tmp</value>
- </property>
(3)hive相關日志的目錄
- <property>
- <name>hive.querylog.location</name>
- <value>/usr/local/hive/log</value>
- </property>
3.4hive的運行模式的指定
Hive的運行模式即任務的執行環境,分為本地與集群兩種,我們可以通過mapred.job.tracker 來指明
本地模式設置方式:
- hive > set mapred.job.tracker=local;
- hive > set hive.exec.mode.local.auto=true;
- hive.exec.mode.local.auto.inputbytes.max默認128M
3.5 sqoop的安裝
(1)下載、解壓:
- tar -zxvf sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz /root
- cd /root
- ln -s sqoop-1.4.3.bin sqoop
(2)配置sqoop:
- vi ~/.bash_profile
- export SQOOP_HOME=/usr/local/sqoop
- export PATH=$SQOOP_HOME/bin:$PATH
(3)測試連接數據庫并列出數據庫:
- sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 123456
(4)將mysql中的表導入到hive中:
- sqoop import --connect jdbc:mysql://localhost:3306/gwifi --username root --password 123456 --table think_access --hive-import -m 1;
3.6 hive的命令行方式
1、輸入#/hive/bin/hive執行應用程序, 或者
- #hive
- hive> create table test(id int, name string);
- hive> show tables;
- hive>quit;
查看并修改表與目錄之間的關系
- #hadoop fs -ls /user/hive/warehouse/
修改參數:hive.metastore.warehouse.dir 表與目錄的對應關系
3.6 命令行方式
顯示或修改參數值
在代碼中可以使用${…}來使用
命名空間 |
使用權限 |
描述 |
hivevar |
可讀寫 |
$ hive -d name=zhangsan; |
hiveconf |
可讀寫 |
$ hive –hiveconf hive.cli.print.current.db=true;$ hive –hiveconf hive.cli.print.header=true; |
system |
可讀寫 |
java定義的配置屬性,如system:user.name |
env |
只讀 |
shell環境變量,如env:USER |
3.7 hive的腳本運行
$>hive -i /home/my/hive-init.sql
$hive>source file
與linux交互命令 !
!ls
!pwd
與hdfs交互命令
dfs -ls /
dfs -mkdir /hive
3.8 hive的jdbc模式
JAVA API交互執行方式
hive 遠程服務 (端口號10000) 啟動方式
3.9 hive常用的命令– set命令
hive控制臺set命令:
set hive.cli.print.current.db=true;
set hive.metastore.warehouse.dir=/hive
hive參數初始化配置set命令:
~/.hiverc
四、HiveQL數據操作
4.1數據類型
1、基本數據類型:與mysql等數據庫中基本數據類型類似;
2、復合數據類型:
(1)array 數組類型 如:array[int] 下標訪問
(2)struct結構類型 如: struct{name:STRING,age:INT} .訪問
(3)Map結構
4.2 數據庫/表的定義、操作
默認使用的是“default”數據庫,使用命令選擇數據庫:
hive> use <數據庫名>
創建數據庫: create database <數據庫名>
查看所有數據庫: show databases;
查看/刪除數據庫:desc/drop database <數據庫名>;
注:Hive沒有 行級別的插入,更新和刪除操作,往表中插入數據的唯一方法就是使用成批載入操作
hive>create table 表名(字段名 字段類型,……)
hive>show tables;
hive>create table t2 like t1;
hive> drop table 表名 —刪除表
增加列
hive>ALTER TABLE t3 ADD COLUMNS(gender int);
在mysql中hive數據庫中show tables; 在TBLS表中可以查看到hie創建的表。
4.3 數據庫/表的定義、操作
插入數據:insert overwrite table t_table1 select * from t_table1 where XXXX;
刪除數據:insert overwrite table test select * from test where 1=0;
數組類型的表的操作:
定義復合數據類型的 表:create table demo_array(id int, mydata array[string]) PARTITIONED BY (dt STRING) row format delimited fields terminated by ’\t’ collection items terminated by ’|';
–id 與mydata之間是’\t’隔開,其后的mydata數據之間用’|'隔開
4.3.1 Hive的數據模型-管理表
管理表,也稱作內部表或受控表
特點:(1)數據全部保存在warehouse目錄中;
(2)刪除表時元數據和表中的數據都會被刪除;
(3)創建表和數據加載可以在同一條語句中實現;
(4)每個表在HDFS中都有相應的目錄用來存儲表的數據
(5)加載數據的過程,實際數據會被移動到數據倉庫目錄中;對數據的訪問是在數據倉庫目錄中完成。
4.3.1 Hive的數據模型-管理表
創建數據文件inner_table.dat
創建表
- hive>create table inner_table (key string)
- row format delimited fields terminated by '\t';
- //這個要指定,否則load的時候數據為NULL;
加載數據
hive>load data local inpath '/root/inner_table.dat' into table inner_table;
查看數據
select * from inner_table
select count(*) from inner_table
刪除表 drop table inner_table
4.3.2 Hive的數據模型-外部表
包含externable的表叫做外部表
特點:(1)刪除外部表只刪除metastore的元數據,不刪除hdfs中的表數據;
(2)加載數據和創建表是同時完成的,并不會移動到數據,只是與外部數據建立一個鏈接;刪除一個外部表,只是刪除了該鏈接
(3)指向已經在 HDFS 中存在的數據
4.3.2 Hive的數據模型-外部表語法
- CREATE EXTERNAL TABLE page_view
- ( viewTime INT,
- userid BIGINT,
- page_url STRING,
- referrer_url STRING,
- ip STRING COMMENT 'IP Address of the User',
- country STRING COMMENT 'country of origination‘
- )
- COMMENT 'This is the staging page view table'
- ROW FORMAT DELIMITED FIELDS TERMINATED BY '44' LINES TERMINATED BY '12'
- STORED AS TEXTFILE
- LOCATION 'hdfs://centos:9000/user/data/staging/page_view';
4.3.3 Hive的數據模型-分區表
分區可以理解為分類,通過分類把不同類型的數據放到不同的目錄下;
分類的標準就是分區字段,可以一個,也可以多個;
分區表的意義在于優化查詢,查詢時盡量利用分區字段;如果不使用分區字段,就會全部掃描。
創建數據文件partition_table.dat
創建表
create table partition_table(rectime string,msisdn string) partitioned by(daytime string,city string) row format delimited fields terminated by '\t' stored as TEXTFILE;
加載數據到分區
load data local inpath '/home/partition_table.dat' into table partition_table partition (daytime='2013-02-01',city='bj');
查看數據
- select * from partition_table
- select count(*) from partition_table
- 刪除表 drop table partition_table
4.3.4 Hive的數據模型-分區表
CREATE TABLE tmp_table #表名
- (
- title string, # 字段名稱 字段類型
- minimum_bid double,
- quantity bigint,
- have_invoice bigint
- )COMMENT '注釋:XXX' #表注釋
- PARTITIONED BY(pt STRING) #分區表字段(如果你文件非常之大的話,采用分區表可以快過濾出按分區字段劃分的數據)
- ROW FORMAT DELIMITED
- FIELDS TERMINATED BY '\001' # 字段是用什么分割開的
- STORED AS SEQUENCEFILE; #用哪種方式存儲數據,SEQUENCEFILE是hadoop自帶的文件壓縮格式
4.4.1 裝載數據
從文件中裝載數據
hive>LOAD DATA [LOCAL] INPATH '...' [OVERWRITE] INTO TABLE t2 [PARTITION (province='beijing')];
通過查詢表重新裝載數據
hive>INSERT OVERWRITE TABLE t2 PARTITION (province='beijing') SELECT * FROM xxx WHERE xx
設置job并行數量 hive.exec.parallel =true;
hive.exec.parallel. thread.number =3;
4.4.2 動態分區裝載數據
開啟動態分區支持
- hive>set hive.exec.dynamic.partition=true;
- hive>set hive.exec.dynamic.partition.mode=nostrict;
- hive>set hive.exec.max.dynamic.partitions.pernode=1000;
#查詢字段一樣
- hive>INSERT OVERWRITE TABLE t3 PARTITION(province, city)
- SELECT t.province, t.city FROM temp t;
- hive>INSERT OVERWRITE TABLE t3 PARTITION(province='bj', city)
- SELECT t.province, t.city FROM temp t WHERE t.province='bj';
單語句建表并同時裝載數據
hive>CREATE TABLE t4 AS SELECT ....
select count(0) from (select id from test where name like 'zh%') a join (select id from test where name like '%i%') b on a.id = b.id;
五、hive的存儲形式比較
hive在建表時,可以通過‘STORED AS FILE_FORMAT’ 指定存儲文件格式。有以下幾種:
1.TextFile:存儲空間較大,壓縮之后的文件不能分割與合并,查詢效率低;可直接存儲,加載速度最快;
2.sequencefile:hadoop API提供的一種二進制文件支持,存儲空間最大,可分割與合并,查詢效率高,需要text文件轉換來加載
3.RcFile:是一種行列存儲相結合的存儲方式。(1)將數據按行分塊,保證同一個record在一個塊上,避免讀一個記錄需要讀取多個block;(2)塊數據列式存儲,有利于數據壓縮和快速的列存取。查詢效率最高、存儲空間最小、但加載最慢
總結