這篇文章將為大家詳細(xì)講解有關(guān)為什么選擇Hive,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)是一家專業(yè)的成都網(wǎng)站建設(shè)公司,我們專注成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷、企業(yè)網(wǎng)站建設(shè),買友情鏈接,廣告投放平臺(tái)為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設(shè)計(jì)到用戶體驗(yàn)提高,創(chuàng)新互聯(lián)力求做到盡善盡美。
為什么選擇Hive?
基于Hadoop的大數(shù)據(jù)的計(jì)算/擴(kuò)展能力 支持SQL like查詢語言 統(tǒng)一的元數(shù)據(jù)管理 簡(jiǎn)單編程 |
Hive的安裝
1.1在hadoop生態(tài)圈中屬于數(shù)據(jù)倉庫的角色。他能夠管理hadoop中的數(shù)據(jù),同時(shí)可以查詢hadoop中的數(shù)據(jù)。
本質(zhì)上講,hive是一個(gè)SQL解析引擎。Hive可以把SQL查詢轉(zhuǎn)換為MapReduce中的job來運(yùn)行。
hive有一套映射工具,可以把SQL轉(zhuǎn)換為MapReduce中的job,可以把SQL中的表、字段轉(zhuǎn)換為HDFS中的文件(夾)以及文件中的列。
這套映射工具稱之為metastore,一般存放在derby、MySQL中。
1.2 hive在hdfs中的默認(rèn)位置是/user/hive/warehouse,是由配置文件hive-conf.xml中屬性hive.metastore.warehouse.dir決定的。
2.hive的安裝
(1)解壓縮、重命名、設(shè)置環(huán)境變量
(2)在目錄$HIVE_HOME/conf/下,執(zhí)行命令mv hive-default.xml.template hive-site.xml重命名
在目錄$HIVE_HOME/conf/下,執(zhí)行命令mv hive-env.sh.template hive-env.sh重命名
(3)修改hadoop的配置文件hadoop-env.sh,修改內(nèi)容如下:
export HADOOP_CLASSPATH=.:$CLASSPATH:$HADOOP_CLASSPATH:$HADOOP_HOME/bin
(4)在目錄$HIVE_HOME/bin下面,修改文件hive-config.sh,增加以下內(nèi)容:
export JAVA_HOME=/usr/local/jdk
export HIVE_HOME=/usr/local/hive
export HADOOP_HOME=/usr/local/hadoop
3.安裝mysql
(1)刪除linux上已經(jīng)安裝的mysql相關(guān)庫信息。rpm -e xxxxxxx --nodeps
執(zhí)行命令rpm -qa |grep mysql 檢查是否刪除干凈
(2)執(zhí)行命令 rpm -i mysql-server-******** 安裝mysql服務(wù)端
(3)啟動(dòng)mysql 服務(wù)端,執(zhí)行命令 mysqld_safe &
(4)執(zhí)行命令 rpm -i mysql-client-******** 安裝mysql客戶端
(5)執(zhí)行命令mysql_secure_installation設(shè)置root用戶密碼
4. 使用mysql作為hive的metastore
(1)把mysql的jdbc驅(qū)動(dòng)放置到hive的lib目錄下
(2)修改hive-site.xml文件,修改內(nèi)容如下:
javax.jdo.option.ConnectionURL jdbc:mysql://hadoop0:3306/hive?createDatabaseIfNotExist=true javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword admin
?用戶接口,包括 CLI,JDBC/ODBC,WebUI ?元數(shù)據(jù)存儲(chǔ),通常是存儲(chǔ)在關(guān)系數(shù)據(jù)庫如 mysql, derby 中 ?解釋器、編譯器、優(yōu)化器、執(zhí)行器 ?Hadoop:用 HDFS 進(jìn)行存儲(chǔ),利用 MapReduce 進(jìn)行計(jì)算 |
用戶接口主要有三個(gè):CLI,JDBC/ODBC和 WebUI .CLI,即Shell命令行 .JDBC/ODBC是 Hive 的Java,與使用傳統(tǒng)數(shù)據(jù)庫JDBC的方式類似 .WebGUI是通過瀏覽器訪問 Hive Hive 將元數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫中(metastore),目前只支持mysql、derby。Hive 中的元數(shù)據(jù)包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等 解釋器、編譯器、優(yōu)化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優(yōu)化以及查詢計(jì)劃(plan)的生成。生成的查詢計(jì)劃存儲(chǔ)在HDFS 中,并在隨后有 MapReduce 調(diào)用執(zhí)行 Hive 的數(shù)據(jù)存儲(chǔ)在 HDFS 中,大部分的查詢由 MapReduce 完成(包含 * 的查詢,比如 select * from table 不會(huì)生成 MapRedcue 任務(wù)) |
Hive的metastore
metastore是hive元數(shù)據(jù)的集中存放地。metastore默認(rèn)使用內(nèi)嵌的derby數(shù)據(jù)庫作為存儲(chǔ)引擎 Derby引擎的缺點(diǎn):一次只能打開一個(gè)會(huì)話 使用Mysql作為外置存儲(chǔ)引擎,多用戶同時(shí)訪問 |
Hive的shell
1、hive 命令行模式,直接輸入#/hive/bin/hive的執(zhí)行程序,或者輸入#hive --service cli 2、 hive web界面的 (端口號(hào)9999) 啟動(dòng)方式 #hive --service hwi& 用于通過瀏覽器來訪問hive http://hadoop0:9999/hwi/ 3、 hive 遠(yuǎn)程服務(wù) (端口號(hào)10000) 啟動(dòng)方式 #hive --service hiveserver& |
Hive與傳統(tǒng)數(shù)據(jù)庫
查詢語言 | HiveQL | SQL |
數(shù)據(jù)存儲(chǔ)位置 | HDFS | Raw Device or 本地FS |
數(shù)據(jù)格式 | 用戶定義 | 系統(tǒng)決定 |
數(shù)據(jù)更新 | 不支持 | 支持 |
索引 | 新版本有,但弱 | 有 |
執(zhí)行 | MapReduce | Executor |
執(zhí)行延遲 | 高 | 低 |
可擴(kuò)展性 | 高 | 低 |
數(shù)據(jù)規(guī)模 | 大 | 小 |
Hive的數(shù)據(jù)類型
基本數(shù)據(jù)類型 tinyint / smalint / int /bigint float / double boolean string 復(fù)雜數(shù)據(jù)類型 Array/Map/Struct 沒有date /datetime |
Hive的數(shù)據(jù)存儲(chǔ)
Hive的數(shù)據(jù)存儲(chǔ)基于Hadoop HDFS Hive沒有專門的數(shù)據(jù)存儲(chǔ)格式 存儲(chǔ)結(jié)構(gòu)主要包括:數(shù)據(jù)庫、文件、表、視圖 Hive默認(rèn)可以直接加載文本文件(TextFile),還支持sequence file 創(chuàng)建表時(shí),指定Hive數(shù)據(jù)的列分隔符與行分隔符,Hive即可解析數(shù)據(jù) |
Hive的數(shù)據(jù)模型-內(nèi)部表
與數(shù)據(jù)庫中的 Table 在概念上是類似 每一個(gè) Table 在 Hive 中都有一個(gè)相應(yīng)的目錄存儲(chǔ)數(shù)據(jù)。例如,一個(gè)表test,它在 HDFS 中的路徑為:/ warehouse/test。 warehouse是在hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的數(shù)據(jù)倉庫的目錄 所有的 Table 數(shù)據(jù)(不包括 External Table)都保存在這個(gè)目錄中。 刪除表時(shí),元數(shù)據(jù)與數(shù)據(jù)都會(huì)被刪除
|
Hive的數(shù)據(jù)模型-分區(qū)表
Partition 對(duì)應(yīng)于數(shù)據(jù)庫的 Partition 列的密集索引 在 Hive 中,表中的一個(gè) Partition 對(duì)應(yīng)于表下的一個(gè)目錄,所有的 Partition 的數(shù)據(jù)都存儲(chǔ)在對(duì)應(yīng)的目錄中 例如:test表中包含 date 和 city 兩個(gè) Partition, ?則對(duì)應(yīng)于date=20130201, city = bj 的HDFS 子目錄?: /warehouse/test/date=20130201/city=bj ?對(duì)應(yīng)于date=20130202, city=sh 的HDFS 子目錄為;? /warehouse/test/date=20130202/city=sh
CREATE TABLE tmp_table #表名 ( title string, #字段名稱 字段類型 minimum_bid double, quantity bigint, have_invoice bigint )COMMENT'注釋:XXX' #表注釋 PARTITIONED BY(ptSTRING) #分區(qū)表字段(如果你文件非常之大的話,采用分區(qū)表可以快過濾出按分區(qū)字段劃分的數(shù)據(jù)) ROW FORMAT DELIMITED FIELDSTERMINATED BY '\001' # 字段是用什么分割開的 STOREDAS SEQUENCEFILE; #用哪種方式存儲(chǔ)數(shù)據(jù),SEQUENCEFILE是hadoop自帶的文件壓縮格式
一些相關(guān)命令 SHOW TABLES; #查看所有的表 SHOW TABLES '*TMP*'; #支持模糊查詢 SHOWPARTITIONS TMP_TABLE; #查看表有哪些分區(qū) DESCRIBE TMP_TABLE; #查看表結(jié)構(gòu) |
分區(qū)表的shell
創(chuàng)建數(shù)據(jù)文件partition_table.dat 創(chuàng)建表 create table partition_table(rectime string,msisDNString) partitioned by(daytime string,citystring) row format delimited fields terminated by '\t' stored as TEXTFILE; 加載數(shù)據(jù)到分區(qū) load data local inpath'/home/partition_table.dat' into table partition_tablepartition (daytime='2013-02-01',city='bj'); 查看數(shù)據(jù) select * from partition_table select count(*) from partition_table 刪除表 drop table partition_table |
Hive的數(shù)據(jù)模型—桶表
桶表是對(duì)數(shù)據(jù)進(jìn)行哈希取值,然后放到不同文件中存儲(chǔ)。 創(chuàng)建表create table bucket_table(id string) clustered by(id) into 4 buckets; 加載數(shù)據(jù)set hive.enforce.bucketing = true; insert into table bucket_table select name from stu; insert overwrite table bucket_table select name from stu; 數(shù)據(jù)加載到桶表時(shí),會(huì)對(duì)字段取hash值,然后與桶的數(shù)量取模。把數(shù)據(jù)放到對(duì)應(yīng)的文件中。 抽樣查詢 select * from bucket_table tablesample(bucket 1 out of 4 on id); |
Hive的數(shù)據(jù)模型-外部表
指向已經(jīng)在 HDFS 中存在的數(shù)據(jù),可以創(chuàng)建 Partition 它和 內(nèi)部表 在元數(shù)據(jù)的組織上是相同的,而實(shí)際數(shù)據(jù)的存儲(chǔ)則有較大的差異 內(nèi)部表 的創(chuàng)建過程和數(shù)據(jù)加載過程(這兩個(gè)過程可以在同一個(gè)語句中完成),在加載數(shù)據(jù)的過程中,實(shí)際數(shù)據(jù)會(huì)被移動(dòng)到數(shù)據(jù) 倉庫目錄中;之后對(duì)數(shù)據(jù)對(duì)訪問將會(huì)直接在數(shù)據(jù)倉庫目錄中完成。刪除表時(shí),表中的數(shù)據(jù)和元數(shù)據(jù)將會(huì)被同時(shí)刪除 外部表只有一個(gè)過程,加載數(shù)據(jù)和創(chuàng)建表同時(shí)完成,并不會(huì)移動(dòng)到數(shù)據(jù)倉庫目錄中,只是與外部數(shù)據(jù)建立一個(gè)鏈接。當(dāng)刪除一個(gè)外部表時(shí),僅刪除鏈接 CREATEEXTERNAL TABLE page_view ( viewTimeINT, useridBIGINT, page_urlSTRING, referrer_urlSTRING, ipSTRING COMMENT 'IP Address of the User', country STRING COMMENT 'country of origination‘ ) COMMENT 'This is the staging page view table' ROW FORMAT DELIMITED FIELDSTERMINATED BY '44' LINES TERMINATED BY '12' STORED ASTEXTFILE LOCATION 'hdfs://centos:9000/user/data/staging/page_view';
|
外部表的shell
創(chuàng)建數(shù)據(jù)文件external_table.dat 創(chuàng)建表 hive>create external table external_table1 (key string) ROW FORM AT DELIMITED FIELDS TERMINATED BY '\t' location '/home/external'; 在HDFS創(chuàng)建目錄/home/external
#hadoop fs -put /home/external_table.dat /home/external 加載數(shù)據(jù) LOAD DATA INPATH '/home/external_table1.dat' INTO TABLE external_table1; 查看數(shù)據(jù) select * from external_table select count(*) from external_table 刪除表 drop table external_table |
導(dǎo)入數(shù)據(jù)
?當(dāng)數(shù)據(jù)被加載至表中時(shí),不會(huì)對(duì)數(shù)據(jù)進(jìn)行任何轉(zhuǎn)換。Load 操作只是將數(shù)據(jù)復(fù)制/移動(dòng)至 Hive 表對(duì)應(yīng)的位置。 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] ?把一個(gè)Hive表導(dǎo)入到另一個(gè)已建Hive表 INSERT OVERWRITE TABLE tablename[PARTITION (partcol1=val1, partcol2=val2 ...)] select_statementFROM from_statement ?CTAS CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name (col_namedata_type, ...) … AS SELECT … 例:create table new_external_testas select * from external_table1 |
查詢
?基于Partition的查詢 一般 SELECT查詢是全表掃描。但如果是分區(qū)表,查詢就可以利用分區(qū)剪枝(input pruning)的特性,類似“分區(qū)索引“”,只掃描一個(gè)表中它關(guān)心的那一部分。Hive當(dāng)前的實(shí)現(xiàn)是,只有分區(qū)斷言(Partitioned by)出現(xiàn)在離FROM子句最近的那個(gè)WHERE子句中,才會(huì)啟用分區(qū)剪枝。例如,如果page_views表(按天分區(qū))使用date列分區(qū),以下語句只會(huì)讀取分區(qū)為‘2008-03-01’的數(shù)據(jù)。 SELECT page_views.* FROM page_views WHERE page_views.date>= '2013-03-01' AND page_views.date<= '2013-03-01' ?LIMIT Clause Limit可以限制查詢的記錄數(shù)。查詢的結(jié)果是隨機(jī)選擇的。下面的查詢語句從t1表中隨機(jī)查詢5條記錄: SELECT * FROM t1 LIMIT 5 ?Top N查詢 下面的查詢語句查詢銷售記錄最大的5個(gè)銷售代表。 SETmapred.reduce.tasks= 1 |
表連接
導(dǎo)入ac信息表 hive> create table acinfo(name string,acipstring) row format delimited fields terminated by '\t' stored as TEXTFILE; hive> load data local inpath'/home/acinfo/ac.dat' into table acinfo; 內(nèi)連接 select b.name,a.* from dim_aca join acinfo b on (a.ac=b.acip) limit 10; 左外連接 select b.name,a.* from dim_ac a left outer join acinfo b on a.ac=b.acip limit 10; |
Java客戶端
Hive遠(yuǎn)程服務(wù)啟動(dòng)#hive --service hiveserver>/dev/null 2>/dev/null &
JAVA客戶端相關(guān)代碼
Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver"); Connection con = DriverManager.getConnection("jdbc:hive://192.168.1.102:10000/wlan_dw", "", ""); Statement stmt = con.createStatement(); String querySQL="SELECT * FROM wlan_dw.dim_m order by flux desc limit 10"; ResultSet res = stmt.executeQuery(querySQL); while (res.next()) { System.out.println(res.getString(1) +"\t" +res.getLong(2)+"\t" +res.getLong(3)+"\t" +res.getLong(4)+"\t" +res.getLong(5)); }
UDF
1、UDF函數(shù)可以直接應(yīng)用于select語句,對(duì)查詢結(jié)構(gòu)做格式化處理后,再輸出內(nèi)容。 2、編寫UDF函數(shù)的時(shí)候需要注意一下幾點(diǎn): a)自定義UDF需要繼承org.apache.hadoop.hive.ql.UDF。 b)需要實(shí)現(xiàn)evaluate函數(shù),evaluate函數(shù)支持重載。 4、步驟 a)把程序打包放到目標(biāo)機(jī)器上去; b)進(jìn)入hive客戶端,添加jar包:hive>add jar /run/jar/udf_test.jar; c)創(chuàng)建臨時(shí)函數(shù):hive>CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add'; d)查詢HQL語句: SELECT add_example(8, 9) FROM scores; SELECT add_example(scores.math, scores.art) FROM scores; SELECT add_example(6, 7, 8, 6.8) FROM scores; e)銷毀臨時(shí)函數(shù):hive> DROP TEMPORARY FUNCTION add_example; 注:UDF只能實(shí)現(xiàn)一進(jìn)一出的操作,如果需要實(shí)現(xiàn)多進(jìn)一出,則需要實(shí)現(xiàn)UDAF |
關(guān)于“為什么選擇Hive”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。