標籤:
構建在Hadoop之上的資料倉儲,資料計算使用MR,資料存放區使用HDFS 因為資料計算使用mapreduce,因此通常用於進行離線資料處理Hive 定義了一種類 SQL 查詢語言——HQL 類似SQL,但不完全相同可認為是一個HQL-->MR的語言翻譯器。簡單,容易上手
有了Hive,還需要自己寫MR程式嗎? Hive的HQL表達的能力有限 迭代式演算法無法表達 有些複雜運算用HQL不易表達 Hive效率較低 Hive自動產生MapReduce作業,通常不夠智能; HQL調優困難,粒度較粗 可控性差
Hive各模組組成 使用者介面 包括 CLI,JDBC/ODBC,WebUI 中繼資料存放區(metastore) 預設儲存在內建的資料庫derby中,線上使用時一般換為MySQL 磁碟機(Driver) 解譯器、編譯器、最佳化器、執行器 Hadoop 用 MapReduce 進行計算,用 HDFS 進行儲存
Hive部署架構-實驗環境
Hive部署架構-生產環境
資料模型
Partition 和Bucket
Partition 為減少不必要的暴力資料掃描,可以對錶進行分區 為避免產生過多小檔案,建議只對離散欄位進行分區Bucket 對於值較多的欄位,可將其分成若干個Bucket 可結合Partition與Bucket使用
select語句 不支援having和exist in操作, 可轉換為LEFT SEMI JOIN操作 Join(僅支援等值串連),不支援非等值的串連
Order by和Sort by
Order by 啟動一個reduce task 資料全域有序 速度可能會非常慢 Strict模式下,必須與limit連用Sort by 可以有多個reduce task 每個Reduce Task內部資料有序,但全域無序 通常與distribute by
Distribute by與Cluster bydistribute by 相當於MapReduce中的paritioner,預設是基於hash實現的; 與sort by連用,可發揮很好的作用cluster by 當distribute by與sort by(降序)連用,且跟隨的欄位 相同時,可使用cluster by簡寫;
使用者自訂函數UDF:擴充HQL能力的一種方式
HQL支援索引嗎? HQL執行過程主要是並行地暴力掃描。目前Hive僅支援單表索引,但提供了索引建立介面和調用方法,可由使用者根據需要實現索引結構;HQL支援update操作嗎? 不支援。Hive底層是HDFS,HDFS僅支援追加操作,不支援隨機寫;Skew Data處理機制? 指定skew 列:CREATE TABLE list_bucket_single (key STRING, value STRING) SKEWED BY (key) ON (1,5,6); 為skew task分配更多資源(TODO) 將skew task分解成多個task,再合并結果(TODO)
Hive On HBase使用HQL處理HBase中的資料 比直接通過HBase API存取資料方便; 但效能更低,相當於把線上處理轉為批處理存在問題 不夠成熟; 不能按時間戳記擷取資料,預設總是取最新的資料
Hive的類似系統Stinger 下一代Hive被稱為“Stinger”,其底層的計算引擎將由Tez替換MapReduce; Tez相比於MapReduce具有眾多優勢: 提供了多種運算元(比如Map、Shuffle等)供使用者使用; 將多個作業合并成一個作業,減少磁碟讀寫IO; 充分利用記憶體資源。
Shark Hive On Spark(http://spark.incubator.apache.org/); Spark是一個記憶體計算架構,相比於MapReduce,效率更加高效(部分測試表明,速度快100x); Shark完全相容Hive,底層計算引擎採用Spark。
Impala 底層計算引擎不再採用MR,而是使用與商用並行關聯式資料庫類似的分散式查詢引擎;
效能比較
大資料- Hive