網(wǎng)站建設(shè)默認(rèn)字體seo是做什么的
Apache Hive概述
什么是Hive
- Apache Hive是一款建立在Hladoop之上的開源
數(shù)據(jù)倉庫
系統(tǒng),可以將存儲在Hadoop文件中的結(jié)構(gòu)化、半結(jié)構(gòu)化數(shù)據(jù)
文件映射為一張數(shù)據(jù)庫表,基于表提供了一種類似SQL的查詢模型,稱為Hive查詢語言(HQL)
,用于訪問和分析存儲在Hadoop文件中的大型數(shù)據(jù)集。 - Hive核心是將
HQL轉(zhuǎn)換為MapReduce
程序,然后將程序提交到Hadoop集群執(zhí)行。 - Hive由Facebook實(shí)現(xiàn)并開源。
為什么使用Hive
- 使用Hadoop MapReduce直接處理數(shù)據(jù)所面臨的問題
- 人員學(xué)習(xí)成本太高需要掌握java語言
- MapReduce實(shí)現(xiàn)復(fù)雜查詢邏輯開發(fā)難度太大
- 使用Hive處理數(shù)據(jù)的好處
- 操作接口采用類SQL語法,提供快速開發(fā)的能力(簡單、容易上手)
- 避免直接寫MapReduce,減少開發(fā)人員的學(xué)習(xí)成本
- 支持自定義函數(shù),功能擴(kuò)展很方便
- 背靠Hadoop,擅長存儲分析海量數(shù)據(jù)集
Hive和Hadoop關(guān)系
- 從功能來說,數(shù)據(jù)倉庫軟件,至少需要具備下述兩種能力︰存儲數(shù)據(jù)的能力、分析數(shù)據(jù)的能力
- Apache Hive作為一款大數(shù)據(jù)時代的數(shù)據(jù)倉庫軟件,當(dāng)然也具備上述兩種能力。只不過Hive并不是自己實(shí)現(xiàn)了上述兩種能力,而是借助Hadoop。
Hive利用HDFS存儲數(shù)據(jù),利用MapReduce查詢分析數(shù)據(jù)
。 - 這樣突然發(fā)現(xiàn)Hive沒啥用,不過是套殼Hladoop罷了。其實(shí)不然,Hive的最大的魅力在于用戶專注于編寫HQL,Hive幫您轉(zhuǎn)換成為MapReduce程序完成對數(shù)據(jù)的分析。
Hive的功能模擬
-
Hive能將數(shù)據(jù)文件映射成為一張表,這個
映射
是指什么?答:文件和表之間的對應(yīng)關(guān)系
-
Hive軟件本身到底承擔(dān)了什么
功能職責(zé)
?答:SQL語法解析編譯成為MapReduce
Apache Hive架構(gòu)、組件
架構(gòu)圖
組件
用戶接口
:包括CLI、JDBC/OOBC、WebGUI。其中,CLI(command line interface)為shell命令行;Hive中的Thrift服務(wù)器允許外部客戶端通過網(wǎng)絡(luò)與Hive進(jìn)行交互,類似于JDBC或ODBC協(xié)議。WebGUI是通過瀏覽器訪問Hive。元數(shù)據(jù)存儲
:通常是存儲在關(guān)系數(shù)據(jù)庫如mysql/derby中。Hive 中的元數(shù)據(jù)包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等。Driver驅(qū)動程序,包括語法解析器、計(jì)劃編譯器、優(yōu)化器、執(zhí)行器
:完成HQL查詢語句從詞法分析、語法分析、編譯、優(yōu)化以及查詢計(jì)劃的生成。生成的查詢計(jì)劃存儲在HDFS 中,并在隨后有執(zhí)行引擎調(diào)用執(zhí)行。執(zhí)行引擎
:Hive本身并不直接處理數(shù)據(jù)文件。而是通過執(zhí)行引擎處理。當(dāng)下Hive支持MapReduce、Tez、Spark三種執(zhí)行引擎。
Apache Hive數(shù)據(jù)模型
Data Model概念
- 數(shù)據(jù)模型∶用來描述數(shù)據(jù)、組織數(shù)據(jù)和對數(shù)據(jù)進(jìn)行操作,是對現(xiàn)實(shí)世界數(shù)據(jù)特征的描述。
- Hive的數(shù)據(jù)模型類似于
RDBMS庫表結(jié)構(gòu)
,此外還有自己特有模型。 - Hive中的數(shù)據(jù)可以在粒度級別上分為三類∶
- Table 表
- Partition 分區(qū)
- Bucket 分桶
DataBases 數(shù)據(jù)庫
- Hive作為一個數(shù)據(jù)倉庫,在結(jié)構(gòu)上積極向傳統(tǒng)數(shù)據(jù)庫看齊,也分?jǐn)?shù)據(jù)庫(Schema ),每個數(shù)據(jù)庫下面有各自的表組成。
默認(rèn)數(shù)據(jù)庫default
。 - Hive的數(shù)據(jù)都是
存儲在HDFS上
的,默認(rèn)有一個根目錄,在hive-site.xml中,由參數(shù)hive.metastore.warehouse.dir指定。默認(rèn)值為/user/hive/warehouse
。 - 因此,Hive中的數(shù)據(jù)庫在HDFS上的存儲路徑為︰${hive.metastore.warehouse.dir}/databasename.db
- 比如,名為itcast的數(shù)據(jù)庫存儲路徑為:/user/hive/warehouse/itcast.db
Tables 表
- Hive表與關(guān)系數(shù)據(jù)庫中的表相同。Hive中的表所對應(yīng)的數(shù)據(jù)通常是存儲在HDFPS中,而表相關(guān)的元數(shù)據(jù)是存儲在RDBMS中。
- Hive中的表的數(shù)據(jù)在HDFS上的存儲路徑為:${hive.metastore.warehouse.dir}/databasename. db/tablename
- 比如, itcast的數(shù)據(jù)庫下t_user表存儲路徑為:/user/hive/warehouse/itcast.db/t_user
Partitions 分區(qū)
- Partition分區(qū)是hive的一種優(yōu)化手段表。分區(qū)是指根據(jù)分區(qū)列(例如“日期day”)的值將表劃分為不同分區(qū)。這樣可以更快地對指定分區(qū)數(shù)據(jù)進(jìn)行查詢。
- 分區(qū)在存儲層面上的表現(xiàn)是:table表目錄下以子文件夾形式存在。
- 一個文件夾表示一個分區(qū)。子文件命名標(biāo)準(zhǔn):分區(qū)列=分區(qū)值
- Hive還支持分區(qū)下繼續(xù)創(chuàng)建分區(qū),所謂的多重分區(qū)。
Buckets 分桶
- Bucket分桶表是hive的一種優(yōu)化手段表。分桶是指根據(jù)表中字段(例如“編號ID”)的值,經(jīng)過hash計(jì)算規(guī)則將數(shù)據(jù)文件劃分成指定的若干個小文件。
- 分桶規(guī)則:hashfunc(字段)%桶倉數(shù),余數(shù)相同的分到同一個文件。
- 分桶的好處是可以優(yōu)化join查詢和方便抽樣查詢。
- Bucket分桶表在HDFS中表現(xiàn)為同一個表目錄下數(shù)據(jù)根據(jù)hash散列之后變成多個文件。
Hive和MySQL對比
- Hive雖然具有RDBMS數(shù)據(jù)庫的外表,包括數(shù)據(jù)模型、SQL語法都十分相似,但應(yīng)用場景卻完全不同。
Hive只適合用來做海量數(shù)據(jù)的離線分析。Hive的定位是數(shù)據(jù)倉庫,面向分析的OLAP系統(tǒng)
。- 因此時刻告訴自己,
Hive不是大型數(shù)據(jù)庫,也不是要取代MySQL承擔(dān)業(yè)務(wù)數(shù)據(jù)處理
。
Apache Hive | MySQL | |
---|---|---|
定位 | 數(shù)據(jù)倉庫 | 數(shù)據(jù)庫 |
使用場景 | 離線數(shù)據(jù)分析 | 業(yè)務(wù)數(shù)據(jù)事務(wù)處理 |
查詢語言 | HQL | SQL |
數(shù)據(jù)存儲 | HDFS | Local FS |
執(zhí)行引擎 | MR、Tez、Spark | Excutor |
執(zhí)行延遲 | 高 | 低 |
處理數(shù)據(jù)規(guī)模 | 大 | 小 |
常見操作 | 導(dǎo)入數(shù)據(jù)、查詢 | 增刪改查 |
Metadata、Metastore介紹
什么是元數(shù)據(jù)
- 元數(shù)據(jù)(Metadata),又稱中介數(shù)據(jù)、中繼數(shù)據(jù),為
描述數(shù)據(jù)的數(shù)據(jù)
( data about data ),主要是描述數(shù)據(jù)屬性( property )的信息,用來支持如指示存儲位置、歷史數(shù)據(jù)、資源查找、文件記錄等功能。
Hive Metadata
- Hive Metadata即Hive的元數(shù)據(jù)。
- 包含用Hive創(chuàng)建的database、table、表的位置、類型、屬性,字段順序類型等元信息。
元數(shù)據(jù)存儲在關(guān)系型數(shù)據(jù)庫中
。如hive內(nèi)置的Derby、或者第三方如MySQL等。
Hive Metastore
- Metastore即
元數(shù)據(jù)服務(wù)
。Metastore服務(wù)的作用是管理metadata元數(shù)據(jù)
,對外暴露服務(wù)地址,讓各種客戶端通過連接metastore服務(wù),由metastore再去連接MySQL數(shù)據(jù)庫來存取元數(shù)據(jù)。 - 有了metastore服務(wù),就可以有多個客戶端同時連接,而且這些客戶端不需要知道MySQL數(shù)據(jù)庫的用戶名和密碼,只需要連接metastore 服務(wù)即可。某種程度上也保證了hive元數(shù)據(jù)的安全。
Metastore配置方式
- metastore服務(wù)配置有3種模式:
內(nèi)嵌模式、本地模式、遠(yuǎn)程模式
。 - 區(qū)分3種配置方式的關(guān)鍵是弄清楚兩個問題:
- Metastore服務(wù)是否需要單獨(dú)配置、單獨(dú)啟動?
- Metadata是存儲在內(nèi)置的derby中,還是第三方RDBMS,比如MySQL。
- 本系列中使用
企業(yè)推薦模式--遠(yuǎn)程模式部署
。
內(nèi)嵌模式 | 本地模式 | 遠(yuǎn)程模式 | |
---|---|---|---|
Metastore是否單獨(dú)配置、啟動 | 否 | 否 | 是 |
Metadata存儲介質(zhì) | Derby | MySQL | MySQL |
內(nèi)嵌模式
內(nèi)嵌模式
(Embedded Metastore)是metastore默認(rèn)部署模式。- 此種模式下,元數(shù)據(jù)存儲在
內(nèi)置的Derby數(shù)據(jù)庫
,并且Derby數(shù)據(jù)庫和metastore服務(wù)都嵌入在主HiveServer進(jìn)程中,當(dāng)啟動HiveServer進(jìn)程時,Derby和metastore都會啟動。不需要額外起Metastore服務(wù)。 - 但是一次只能支持一個活動用戶,適用于測試體驗(yàn),不適用于生產(chǎn)環(huán)境。
本地模式
本地模式
( Local Metastore )下,Metastore服務(wù)與主liveServer進(jìn)程在同一進(jìn)程中運(yùn)行
,但是存儲元數(shù)據(jù)的數(shù)據(jù)庫在單獨(dú)的進(jìn)程中運(yùn)行,并且可以在單獨(dú)的主機(jī)上。metastore服務(wù)將通過JDBC與metastore數(shù)據(jù)庫進(jìn)行通信。- 本地模式采用
外部數(shù)據(jù)庫來存儲元數(shù)據(jù)
,推薦使用MySQL。 - hive根據(jù)hive.metastore.uris參數(shù)值來判斷,如果為空,則為本地模式。
- 缺點(diǎn)是∶每啟動一次hive服務(wù),都內(nèi)置啟動了一個metastore。
遠(yuǎn)程模式
遠(yuǎn)程模式
(Remote Metastore ) 下,Metastore服務(wù)在其自己的單獨(dú)JVM上運(yùn)行
,而不在HiveServer的JVM中運(yùn)行。如果其他進(jìn)程希望與Metastore服務(wù)器通信,則可以使用Thrift Network API進(jìn)行通信。- 遠(yuǎn)程模式下,需要配置hive.metastore.uris 參數(shù)來指定metastore服務(wù)運(yùn)行的機(jī)器ip和端口,并且
需要單獨(dú)手動啟動metastore服務(wù)
。元數(shù)據(jù)也采用外部數(shù)據(jù)庫來存儲元數(shù)據(jù),推薦使用MySQL。 - 在生產(chǎn)環(huán)境中,建議用遠(yuǎn)程模式來配置Hive Metastore。在這種情況下,其他依賴hive的軟件都可以通過Metastore訪問hive。由于還可以完全屏蔽數(shù)據(jù)庫層,因此這也帶來了更好的可管理性/安全性。
Apache Hive安裝部署
安裝前準(zhǔn)備
- 由于Apache Hive是一款基于HIadoop的數(shù)據(jù)倉庫軟件,通常部署運(yùn)行在Linux系統(tǒng)之上。因此不管使用何種方式配置Hive Metastore,必須要先保證服務(wù)器的基礎(chǔ)環(huán)境正常,Hadoop集群健康可用。
服務(wù)器基礎(chǔ)環(huán)境
:集群時間同步、防火墻關(guān)閉、主機(jī)Host映射、免密登錄、JDK安裝Hadoop集群健康可用
:啟動Hive之前必須先啟動Hadoop集群。特別要注意,需等待HDFS安全模式關(guān)閉之后再啟動運(yùn)行Hlive
。Hive不是分布式安裝運(yùn)行的軟件,其分布式的特性主要借由Hadoop完成。包括分布式存儲、分布式計(jì)算。
Hadoop與Hive整合
- 因?yàn)镠ive需要把數(shù)據(jù)存儲在HDFS上,并且通過MapReduce作為執(zhí)行引擎處理數(shù)據(jù)
- 因此需要在Hadoop中添加相關(guān)配置屬性,以滿足Hive在Hadoop上運(yùn)行。
- 修改Hadoop中core-site.xml,并且Hadoop集群同步配置文件,重啟生效。
具體安裝步驟請參考B站P19-22:https://www.bilibili.com/video/BV1L5411u7ae/
Hive命令行客戶端
- Hive發(fā)展至今,總共歷經(jīng)了兩代客戶端工具。
- 第一代客戶端(deprecated不推薦使用):$HIVE_HOME
/bin/hive
,是一個shellUltil。主要功能:一是可用于以交互或批處理模式運(yùn)行Hive查詢;二是用于Hive相關(guān)服務(wù)的啟動,比如metastore服務(wù)。 - 第二代客戶端(recommended推薦使用):$HIVE_HOME
/bin/beeline
,是一個JDBC客戶端,是官方強(qiáng)烈推薦使用的Hive命令行工具,和第—代客戶端相比,性能加強(qiáng)安全性提高。
Hive Beeline Client
- Beeline在嵌入式模式和遠(yuǎn)程模式下均可工作。
- 在嵌入式模式下,它運(yùn)行嵌入式Hive(類似于Hive Client);而遠(yuǎn)程模式下beeline通過Thrift連接到單獨(dú)的HiveServer2服務(wù)上,這也是官方推薦在生產(chǎn)環(huán)境中使用的模式。
- 那么問題來了,HiveServer2是什么? HiveServer1哪里去了?
HiveServer、HiveServer2服務(wù)
- HiveServer、HiveServer2都是Hive自帶的兩種服務(wù),允許客戶端在不啟動CLI(命令行)的情況下對Hive中的數(shù)據(jù)進(jìn)行操作,且兩個都允許遠(yuǎn)程客戶端使用多種編程語言如java, python等向hive提交請求,取回結(jié)果。
- 但是,HiveServer不能處理多于一個客戶端的并發(fā)請求。因此在Hive-0.11.0版本中重寫了HiveServer代碼得到了HiveServer2,進(jìn)而解決了該問題。HiveServer已經(jīng)被廢棄。
HiveServer2支持多客戶端的并發(fā)和身份認(rèn)證,旨在為開放API客戶端如JDBC、ODBC提供更好的支持
。
Hive服務(wù)和客戶端
- HiveServer2通過Metastore服務(wù)讀寫元數(shù)據(jù)。所以在遠(yuǎn)程模式下,
啟動HiveServer2之前必須先首先啟動metastore服務(wù)
。 - 特別注意:遠(yuǎn)程模式下,Beeline客戶端只能通過HiveServer2服務(wù)訪問Hive。而bin/hive是通過Metastore服務(wù)訪問的。具體關(guān)系如下:
bin/hive 客戶端
- 在hive安裝包的bin目錄下,有hive提供的第一代客戶端 bin/hive。該客戶端可以訪問hive的metastore服務(wù),從而達(dá)到操作hive的目的。
- 友情提示∶如果你是
遠(yuǎn)程模式部署,請手動啟動運(yùn)行metastore服務(wù)
。如果是內(nèi)嵌模式和本地模式,直接運(yùn)行bin/hive , metastore服務(wù)會內(nèi)嵌一起啟動。 - 可以直接在啟動Hive metastore服務(wù)的機(jī)器上使用bin/hive客戶端操作,此時不需要進(jìn)行任何配置。
bin/beeline 客戶端
- hive經(jīng)過發(fā)展,推出了第二代客戶端beeline,但是beeline客戶端不是直接訪問metastore服務(wù)的,而是需要單獨(dú)啟動hiveserver2服務(wù)。
- 在hive安裝的服務(wù)器上,
首先啟動metastore服務(wù),然后啟動hiveserver2服務(wù)
。
- 在node3上使用beeline客戶端進(jìn)行連接訪問。需要注意
hiveserver2服務(wù)啟動之后需要稍等一會才可以對外提供服務(wù)
。 - Beeline是JDBC的客戶端,通過JDBC協(xié)議和Hiveserver2服務(wù)進(jìn)行通信,協(xié)議的地址是:jdbc:hive2://node1:10000
屬性配置的3種方式
概述
-
Hive除了默認(rèn)的屬性配置之外,還支持用戶使用時修改配置;
-
修改Hive配置之前,作為用戶需要掌握兩件事:
- 1.有哪些屬性支持用戶修改,屬性的功能、作用是什么;
- 2.支持哪種方式進(jìn)行修改,是臨時生效還是永久生效的。
-
Hive配置屬性是在HiveConf. Java類中管理的,可以參考文件以獲取當(dāng)前使用版中可用的配置屬性列表;
-
從Hive 0.14.0開始,會從HiveConf.java類中直接生成配置模板文件
hive-default.xml.template
; -
詳細(xì)的配置參數(shù)大全可以參考Hive官網(wǎng)配置參數(shù):https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
配置方式一:hive-site.xml
在$HIVE_HOME/conf路徑下,可以添加一個hive-site.xml文件
,把需要定義修改的配置屬性添加進(jìn)去,這個配置文件會影響到基于這個Hive安裝包的任何一種服務(wù)啟動、客戶端使用方式
。
比如使用MIySQL作為元數(shù)據(jù)的存儲介質(zhì),把連接MySQL的相關(guān)屬性配置在hive-site.xml文件中,這樣不管是本地模式還是遠(yuǎn)程模式啟動,不管客戶端本地連接還是遠(yuǎn)程連接,都將訪問同一個元數(shù)據(jù)存儲介質(zhì)。
配置方式二:–hiveconf命令行參數(shù)
hiveconf是一個命令行的參數(shù)
,用于在使用Hive CLI或者Beeline CLI的時候指定配置參數(shù)。
這種方式的配置在整個的會話session中有效,會話結(jié)束,失效。
比如在啟動hive服務(wù)的時候,為了更好的查看啟動詳情,可以通過hiveconf參數(shù)修改日志級別:
配置方式三:set命令
在Hive CLI或Beeline中使用set命令
為set命令之后的所有SQL語句設(shè)置配置參數(shù)
,這個也是會話級別的。這種方式也是用戶日常開發(fā)中使用最多的一種配置參數(shù)方式。
因?yàn)镠ive倡導(dǎo)一種:誰需要、誰配置、誰使用
的一種思想,避免你的屬性修改影響其他用戶的修改。
配置方式四:服務(wù)特定配置文件
hivemetastore-site.xml
、hiveserver2-site.xml
- Hive Metastore會加載可用的hive-site.xml以及hivemetastore-site.xml配置文件。
- HiveServer2會加載可用的hive-site.xml以及hiveserver2-site.xml。
- 如果HiveServer2以嵌入式模式使用元存儲,則還將加載hivemetastore-site.xml。
總結(jié)
- 配置方式優(yōu)先級:
set設(shè)置> hiveconf參數(shù)> hive-site.xml配置文件
- set參數(shù)聲明會覆蓋命令行參數(shù)hiveconf,命令行參數(shù)會覆蓋配置文件hive-site.xml設(shè)定
- 日常開發(fā)使用中,
如果不是核心的需要全局修改的參數(shù)屬性,建議使用set命令進(jìn)行設(shè)置
- 另外,Hive也會讀入Hadoop的配置,因?yàn)镠ive是作為Hadoop的客戶端啟動的,Hive的配置會覆蓋Hadoop的配置