那些年使用Hive踩過的坑

哥不是小蘿莉發表於2015-02-12

1.概述

  這個標題也是用血的教訓換來的,希望對剛進入hive圈的童鞋和正在hive圈爬坑的童鞋有所幫助。打算分以下幾個部分去描述:

  • Hive的結構
  • Hive的基本操作
  • Hive Select
  • Hive Join
  • Hive UDF
  • Hive的M/R
  • 使用Hive注意點
  • 優化及優化詳情
  • 優化總結
  • 調優的經常手段
  • 解決Hive問題的途徑

  這篇文章只是起個頭,為描述其他部分做下準備。下面我贅述下Hive的結構和一些基本的操作。

2.介紹 

  Hive 是建立在 Hadoop 上的資料倉儲基礎構架。它提供了一系列的工具,可以用來進行資料提取轉化載入(ETL),這是一種可以儲存、查詢和分析儲存在 Hadoop 中的大規模資料的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的使用者查詢資料。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 無法完成的複雜的分析工作。

  首先,我來說說什麼是hive(What is Hive?),請看下圖:

  由於是在Retina下截的屏,為避免網路原因顯示不出圖片,這裡為也用文字描述以下。這個和介紹中描述的內容大致是一致的,Hive構建在Hadoop的HDFS和MapReduce之上,用於管理和查詢結構化/非結構化資料的資料倉儲。

  • 使用HQL作為查詢介面
  • 使用HDFS作為底層儲存
  • 使用MapReduce作為執行層

  那麼這裡不禁會引發一個疑問?Hive是如何應用的呢?請看下圖:

 

  這裡叢集搭建Hive時用到了HA,這個是做大資料的常識,單點問題時刻銘記,最後用HAProxy來做代理。至於想了解如何使用來完成指標計算,可以參考我寫的網站日誌統計案例分析與實現中關於用Hive實現計算的描述,這裡不做過多的贅述。

  2.1結構描述

  Hive 的結構可以分為以下幾部分:

  • 使用者介面:包括 CLI, Client, WUI
  • 後設資料儲存。通常是儲存在關聯式資料庫如 mysql, derby 中
  • 直譯器、編譯器、優化器、執行器
  • Hadoop:用 HDFS 進行儲存,利用 MapReduce 進行計算

  1、 使用者介面主要有三個:CLI,Client 和 WUI。其中最常用的是 CLI,Cli 啟動的時候,會同時啟動一個 Hive 副本。Client 是 Hive 的客戶端,使用者連線至 Hive Server。在啟動 Client 模式的時候,需要指出 Hive Server 所在節點,並且在該節點啟動 Hive Server。 WUI 是通過瀏覽器訪問 Hive。

  2、 Hive 將後設資料儲存在資料庫中,如 mysql、derby。Hive 中的後設資料包括表的名字,表的列和分割槽及其屬性,表的屬性(是否為外部表等),表的資料所在目錄等。

  3、 直譯器、編譯器、優化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃儲存在 HDFS 中,並在隨後有 MapReduce 呼叫執行。

  Hive 的資料儲存在 HDFS 中,大部分的查詢由 MapReduce 完成(包含 * 的查詢,比如 select * from tbl 不會生成 MapRedcue 任務)。

  2.2Hive和普通DB的異同

  Hive RDBMS
查詢語句 HQL SQL
資料儲存 HDFS Raw Device or Local FS
索引 1.0.0版本支援
執行延遲 高  
處理資料規模 大(或海量)
執行 MapReduce Excutor

  截止本篇文章完成時,Hive對外發布的1.0.0版本已支援索引的建立,下面引用官方部分原話:

REPRO STEPS:
create database skewtest;
use skewtest;
create table skew (id bigint, acct string) skewed by (acct) on ('CC','CH');
create index skew_indx on table skew (id) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' WITH DEFERRED REBUILD;

  具體詳細資訊可參考連結:https://issues.apache.org/jira/browse/HIVE-5631

  2.3後設資料

  Hive 將後設資料儲存在 RDBMS 中,一般常用的有MYSQL和DERBY。由於DERBY只支援單客戶端登入,所以一般採用MySql來儲存後設資料。

  注:關於如何安裝配置Hive,請參考我寫的Hive的安裝部署

  2.4資料儲存

  首先,Hive 沒有專門的資料儲存格式,也沒有為資料建立索引,使用者可以非常自由的組織 Hive 中的表,只需要在建立表的時候告訴 Hive 資料中的列分隔符和行分隔符,Hive 就可以解析資料。

  其次,Hive 中所有的資料都儲存在 HDFS 中,Hive 中包含以下資料模型:Table,External Table,Partition,Bucket。

  1. Hive 中的 Table 和資料庫中的 Table 在概念上是類似的,每一個 Table 在 Hive 中都有一個相應的目錄儲存資料。例如,一個表 app,它在 HDFS 中的路徑為:/ warehouse /app,其中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的資料倉儲的目錄,所有的 Table 資料(不包括 External Table)都儲存在這個目錄中。
  2. Partition 對應於資料庫中的 Partition 列的密集索引,但是 Hive 中 Partition 的組織方式和資料庫中的很不相同。在 Hive 中,表中的一個 Partition 對應於表下的一個目錄,所有的 Partition 的資料都儲存在對應的目錄中。例如:xiaojun 表中包含 dt 和 city 兩個 Partition,則對應於 dt = 20100801, ctry = US 的 HDFS 子目錄為:/ warehouse /app/dt=20100801/ctry=US;對應於 dt = 20100801, ctry = CA 的 HDFS 子目錄為;/ warehouse /app/dt=20100801/ctry=CA
  3. Buckets 對指定列計算 hash,根據 hash 值切分資料,目的是為了並行,每一個 Bucket 對應一個檔案。將 user 列分散至 32 個 bucket,首先對 user 列的值計算 hash,對應 hash 值為 0 的 HDFS 目錄為:/ warehouse /app/dt =20100801/ctry=US/part-00000;hash 值為 20 的 HDFS 目錄為:/ warehouse /app/dt =20100801/ctry=US/part-00020
  4. External Table 指向已經在 HDFS 中存在的資料,可以建立 Partition。它和 Table 在後設資料的組織上是相同的,而實際資料的儲存則有較大的差異。
  • Table (內部表)的建立過程和資料載入過程(這兩個過程可以在同一個語句中完成),在載入資料的過程中,實際資料會被移動到資料倉儲目錄中;之後對資料對訪問將會直接在資料倉儲目錄中完成。刪除表時,表中的資料和後設資料將會被同時刪除。

  External Table 只有一個過程,載入資料和建立表同時完成(CREATE EXTERNAL TABLE ……LOCATION),實際資料是儲存在 LOCATION 後面指定的 HDFS 路徑中,並不會移動到資料倉儲目錄中。當刪除一個 External Table 時,僅刪除hive的後設資料,不會刪除hdfs上對應的檔案。

  2.5Hive 基本操作

  《Hive基本操作

  2.6Hive效能優化

  《Hive效能優化

3.總結

  這篇就描述到這裡,其他部分後面整理好資料後在與各位分享;若有疑問可加群討論,或是發郵件給我,我會盡我所能給予幫助,與君共勉!

相關文章