學習Hadoop Hive 介紹

2021-09-08 05:41:33 字數 4259 閱讀 1827

1.由facebook 開源,最初用於解決海量結構化的日誌資料統計問題

etl(extraction-transformation-loading)工具

2.構建在hadoop 之上的資料倉儲

資料計算使用mr,資料儲存使用hdfs

3.hive 定義了一種型別sql查詢語句—hql,類似於sql,但不完全相同

4.通常用於進行高離線資料處理(採用mapreduce)

5.可認為是乙個hql->mr的解釋翻譯器

hive 類似的開源系統—stinger 

tez 是乙個dag的計算框架,在mapreduce 基礎上發展起來的,目前是apache 頂級專案,下一代hive 被稱為『stinger』 ,其底層得計算引擎由tez 替換為mapreduce。tez相比於mapreduce 具有眾多優勢:

(1).提供眾多運算元供使用者使用

(2).將多個作業合併為乙個作業,減少磁碟i/o讀寫

(3).充分利用記憶體資源

為什麼使用hive?

1.簡單容易上手(提供了類sql查詢語言hql)

2.為超大資料集設計計算/擴充套件能力hbase schema 可以有多個table ,mr為計算引擎,hdfs為儲存系統

統一元資料管理(hcalalog)——可與pig,presto 等共享

1.hive 架構hive的結構可以分為4個部分:

1.使用者介面:包括cli,client,wui

2.元資料儲存:通常是儲存在關係型資料庫如mysql,derby中

3.直譯器,編譯器,優化器,執行器

4.hadoop:使用hdfs 儲存資料,利用mapreduce 進行計算

其中使用者介面主要包括cli,client和wui。最常用的是cli, cli 啟動的時候,會同時啟動乙個hive 副本。client 是hive 的客戶端,使用者可以連線hive server 。在啟動client過程中,需要指出hive server 所執行節點的位置資訊。wui支援通過瀏覽器方式訪問hive。

hive 將元資料儲存在資料庫中,如mysql和derby。hive 中的元資料報括表的名稱,表字段和區分及其屬性,表的屬性(是否為外部表等),以及表資料所在目錄等。

直譯器,編譯器,優化器用來完成hql查詢語句從語法分析,詞法分析,編譯,優化以及查詢計畫的生成工作,其生成的查詢計畫儲存在hdfs中,並在隨後由mapreduce 呼叫執行。

hive 的資料儲存在hdfs 中,大部分的查詢由mapreduce 呼叫完成。

2.hive 和hadoop 的關係

hive 構建在hadoop之上

1.hql中對於查詢語句的解釋,優化,生成查詢計畫由hive 完成的

2.所有資料都是儲存在hadoop中

3.查詢計畫都被轉化為mapreduce 任務後在hadoop 中執行,(但有些查詢沒有mr任務,比如select * from table)

4.hadoop 和hive 都是用utf-8編碼

3.hive 和普通關係型資料庫比較

hive 和rdbms 比較

對比項hive

rdbms

查詢語言

hqlsql

資料儲存

hdfs

raw device or local fs 

or asm索引無

有執行mapreduce

excutor

執行延遲高低

處理資料規模大較小

由於sql被廣泛應用於資料倉儲系統中,針對hive 的特性設計的類sql 的查詢語言hql,可以使用sql開發的開發者能夠快速方便的在hive上進行開發。

hive建立在hadoop 之上,所有的hive 資料都是儲存在hdfs中,而rdbms資料庫則將資料儲存在裸機,作業系統或者特定的檔案系統中

hive 中沒有定義專門的資料格式,資料格式可以由使用者自行定義,使用者定義資料格式時需要指定三個屬性:列分隔符,行分隔符以及讀取檔案資料的方法。(hive 中預設有三個檔案格式:textfile,sequencefile 以及rcfile).由於在載入資料過程中不需要從使用者資料格式到hive 定義的資料格式的轉換,因此hive 在載入的過程中,不會對資料本身進行任何修改,而是將資料內容複製或者移動到相應的hdfs目錄中。但是在關係型資料庫中,不同的資料庫有著不同的儲存引擎,這些儲存引擎定義了各個專業的資料格式。因此,資料庫載入資料的過程會比較耗時。

由於hive 是針對資料倉儲應用設計的,而資料倉儲的特點是讀多寫少,因此hive 不支援對資料的改寫和新增,所有的資料都是在載入時確定好的。而關係型資料庫中的資料通常是需要經常頻繁修改。因此可以使用insert into ... values 新增資料,使用update ...set 修改資料。

hive 大多數查詢的執行通過hadoop 提供的mapreduce 來實現,而關係型資料庫通常使用各自的專有執行引擎。

hive 在查詢資料的時候,由於沒有索引,就需要掃瞄整個表,因此延遲較高。另外乙個導致hive 執行延遲高的原因是mapreduce 框架,由於mapreduce 本身就具有較高的延遲,因此在利用mapreduce 執行hive 查詢時,較高的延遲就變得必然了。相對而言,關係型資料庫的執行延遲較低,這個低是以資料規模較小為前提,當資料規模大到超過資料庫的處理能力的時候,這個時候hive 的平行計算優勢就體現了。

由於hive 是建立在hadoop 之上,因此hive 的可擴充套件性和hadoop 的可擴充套件性是一致的,而關係型資料庫由於acid 語義的嚴格限制,其擴充套件型非常有限。

hive 支援大規模的資料;資料庫支援資料規模較小。

hive 將元資料儲存在rdbms 中,一般常用的有mysql 和derby。hive 的元資料預設使用derby 作為db,derby作為輕量級db,它在開發,測試過程中使用比較方便。

mysql和postgresql是兩個比較常用的開源資料庫系統,多用來替換derby

hive 建立表的過程應該應該是:

1.解釋使用者提交hive 語句,對其進行解析,分解為表,字段,分割槽等hive 物件。

2.解析到資訊構建對應的表,字段,分割槽表等物件,從sequence_table 中構建物件的新id,並與構建物件資訊(名稱,型別)一同通過dao 方法寫入到與元資料表中去。

實際上常見rdbms 都是通過這種方法組織的,典型的如postgresql,其系統表中和hive 元資料一樣暴露了這些id 資訊(oid,cid 等),而oracle 等商業化的系統則隱藏了這些功能。

hive 沒有專門資料儲存格式,也沒有為資料建立索引,使用者可以自由組織hive 中的表,只需要在建立表的時候告訴hive 資料庫的列分隔符和行分隔符即可,然後hive 就可以解析資料了。hive 中所有資料都儲存在hdfs中,hive 包含的資料模型由table,external table,partition,bucket。

hive中table 和關係型資料庫中的table 在概念上的類似的,hive 中每乙個table 都有乙個相應的目錄儲存其資料。例如,乙個fruit ,它在hdfs中的路徑為/warehouse/fruit, 其中,warehouse是在hive-site.xml 中$指定的資料倉儲目錄,所有的table 資料(不包括external table)都儲存在這個目錄中。

partition 對應於關係型資料庫中partition 列的索引,但是hive 中partition 的組織方式和資料庫中很大不同。在hive中,表的乙個partition 對應於表下乙個目錄,所有的partition 資料都儲存在對應目錄裡。

buckets 對指定列計算hash,根據hash 值分組資料,目的是為了並行處理,每乙個bucket 對應乙個檔案。

external table 是指向已經在hdfs 中存在的資料,為它建立partition 。external table 和table 在元資料的組織上是相同的,而實際資料的儲存則存在較大的差異。

table 在載入資料的過程中,實際資料會被移動到資料倉儲目錄中,之後對資料訪問將會直接在資料倉儲目錄中完成。刪除表時,表中資料和元資料將會被同時刪除。

external table 的載入資料和建立表要同時完成(create external  table .... location ),實際的資料時儲存在location 後面指定的hdfs 路徑中,而不會移動到資料倉儲目錄中。

學習篇 Hadoop Hive 基礎理論

一 hadoop hive 基礎理論 1.hive 產生背景 2.hive 概述 總結 為什麼使用hive hive在hadoop生態系統中的位置 hive體系結構 hive部署架構 hive與rdbm的區別 區別hive rdbms 查詢語言 hqlsql 資料庫的儲存位置 hdfs raw de...

HADOOP HIVE學習筆記(2) CLI

你也可以命令列設定mapred.map.tasks 10,這樣起效優先順序 hiveconf xml檔案.e root bigdata conf hive e select from t2 where id 1 database hello 2 time taken 5.922 seconds,fe...

hadoop hive基本操作

hive 基本操作 命令 hive shell hive service cli 進入shell後 1.設定顯示當前database和顯示列欄位 set hive.cli.print.current.db true 顯示當前db set hive.cli.print.headers true 顯示列...