目錄
一、OLAP 與 Impala 簡介
1. OLAP 簡介
2. Impala 簡介
(1)Impala 是什么
(2)為什么要使用 Impala
(3)適合 Impala 的使用場景
(4)Impala 架構
(5)開發 Impala 應用
(6)Impala 與 Hadoop 生態圈
一、OLAP 與 Impala 簡介
1. OLAP 簡介
? ? ? ? OLAP 是 Online Analytical Processing 的縮寫,意為聯機分析處理。此概念最早是由關系數據庫之父 E.F.Codd 于 1993 年提出,至今已有 20 多年。OLAP 允許以一種稱為多維數據集的結構,訪問業務數據源經過聚合和組織整理的后數據。以此為標準,OLAP 作為單獨的一類產品同聯機事務處理(OLTP)得以明顯區分。
? ? ? ? 在計算領域,OLAP 是一種快速應答多維分析查詢的方法,也是商業智能的一個組成部分,與之相關的概念還包括數據倉庫、報表系統、數據挖掘等。數據倉庫用于數據的存儲和組織,OLAP 集中于數據的分析,數據挖掘則致力于知識的自動發現,報表系統則側重于數據的展現。OLAP 從數據倉庫中的集成數據出發,構建面向分析的多維數據模型,再使用多維分析方法從多個不同的視角對多維數據進行分析比較,分析活動以數據驅動。
? ? ? ? 通過使用 OLAP 工具,用戶可以從多個視角交互式地分析多維數據。OLAP 由三個基本的分析操作構成:合并(上卷)、下鉆和切片。合并是指數據的聚合,即數據可以在一個或多個維度上進行累積和計算。例如,所有的營業部數據被上卷到銷售部門以分析銷售趨勢。下鉆是一種由匯總數據向下瀏覽細節數據的技術,比如用戶可以從產品分類的銷售數據下鉆查看單個產品的銷售數據。切片則是這樣一種特性,通過它用戶可以獲取 OLAP 立方體中的特定數據集合,并從不同的視角觀察這些數據。這些觀察數據的視角又叫做維度(例如通過經銷商、日期、客戶、產品或區域等等,查看同一銷售數據)。
? ? ? ? OLAP 系統的核心是 OLAP 立方體(或稱為多維立方體或超立方體)。它由被稱為度量的數值事實組成,這些度量被維度劃分歸類。一個 OLAP 立方體的例子如下圖所示,數據單元位于立方體的交叉點上,每個數據單元跨越產品、時間、位置等多個維度。通常使用一個矩陣接口操作 OLAP 立方體,例如電子表格程序的數據透視表,可以按維度分組執行聚合或求平均值等操作。立方體的元數據一般由關系數據庫中的星型模式或雪花模式生成,度量來自事實表的記錄,維度來自維度表。
? ? ? ? OLAP 分析所需的原始數據量是非常龐大的。一個分析模型,往往會涉及數千萬或數億條數據,甚至更多,而分析模型中包含多個維度數據,這些維度又可以由用戶作任意的組合。這樣的結果就是大量的實時運算導致過長的響應時間。想象一個 1000 萬條記錄的分析模型,如果一次提取 4 個維度進行組合分析,每個維度有 10 個不同的取值,理論上的運算次數將達到 10 的 12 次方。這樣的運算量將導致數十分鐘乃至更長的等待時間。如果用戶對維組合次序進行調整,或增加、或減少某些維度的話,又將是一個重新的計算過程。
? ? ? ? 從上面的分析中可以得出結論,如果不能解決 OLAP 運算效率問題的話,OLAP 將只會是一個沒有實用價值的概念。在 OLAP 的發展歷史中,常見的解決方案是用多維數據庫代替關系數據庫設計,將數據根據維度進行最大限度的聚合運算,運算中會考慮到各種維度組合情況,運算結果將生成一個數據立方體,并保存在磁盤上。用這種以空間換時間的預運算方式提高 OLAP 的速度。那么,在大數據流行的今天,又有什么產品可以解決 OLAP 的效率問題呢?且看 Hadoop 生態圈中適合做 OLAP 的組件 —— Impala。
2. Impala 簡介
(1)Impala 是什么
? ? ? ? Impala 是一個運行在 Hadoop 之上的大規模并行處理(MPP)查詢引擎,提供對 Hadoop 集群數據的高性能、低延遲的 SQL 查詢,使用 HDFS 作為底層存儲。它是基于 Google Dremel 的開源實現。對查詢的快速響應使交互式查詢和對分析查詢的調優成為可能,而這些在針對處理長時間批處理作業的 SQL-on-Hadoop 傳統技術上是無法完成的。
? ? ? ? Impala 與 Hive 元數據存儲數據庫相結合,在這兩個組件之間共享數據庫表,并且 Impala 與 HiveQL 的語法兼容。因此既可以使用 Impala 也可以使用 Hive 進行建立表、發布查詢、裝載數據等操作。Impala 可以在已經存在的 Hive 表上執行交互式實時查詢。
(2)為什么要使用 Impala
- Impala 可以使用 SQL 訪問存儲在 Hadoop 上的數據,而傳統的 MapReduce 則需要掌握 Java 技術。Impala 還提供 SQL 直接訪問 HDFS 文件系統、HBase 數據庫系統或 Amazon S3 的數據。
- Impala 在 Hadoop 生態系統之上提供并行處理數據庫技術,允許用戶執行低延遲的交互式查詢。
- Impala 大都能在幾秒或幾分鐘內返回查詢結果,而相同的 Hive 查詢通常需要幾十分鐘甚至幾小時完成。
- Impala 的實時查詢引擎非常適合對 Hadoop 文件系統上的數據進行分析式查詢。
- 由于 Impala 能實時給出查詢結果,使它能夠很好地與 Pentaho、Tableau 這類報表或可視化工具一起使用(這些工具已經配備了 Impala 連接器,可以從 GUI 直接執行可視化查詢)。
- Impala 與 Hadoop 生態圈相結合,內置對所有 Hadoop 文件格式(ORC、Parquet 等等)的支持。這意味著可以使用 Hadoop 上的各種解決方案存儲、共享和訪問數據,同時避免了數據豎井,并且降低了數據遷移的成本。
- Impala 缺省使用 Parquet 文件格式,這種列式存儲對于典型數據倉庫場景下的大查詢是最優的。
? ? ? ? Impala 之所以使用 Parquet 文件格式,最初靈感來自于 Google 2010 年發表的 Dremel 論文,文中論述了對大規模查詢的優化。Parquet 是一種列式存儲,它不像普通數據倉庫那樣水平存儲數據,而是垂直存儲數據。當查詢在數值列上應用聚合函數時,這種存儲方式將帶來巨大的性能提升。原因是只需要讀取文件中該列的數據,而不是像 Hive 需要讀取整個數據集。Parquet 文件格式支持高效的壓縮編碼方式(例如 Hadoop 和 Hive 缺省使用的 snappy 壓縮),Parquet 文件也可用 Hive 和 Pig 處理。
(3)適合 Impala 的使用場景
- 需要低延遲得到查詢結果。
- 快速分析型查詢。
- 實時查詢。
- 需要多次處理相同類型的查詢。
? ? ? ? 總而言之,Impala 非常適合 OLAP 類型的查詢需求。
(4)Impala 架構
? ? ? ? Impala 架構圖如下所示。
? ? ? ? Impala 服務器是一個分布式、大規模并行處理(MPP)數據庫引擎。它由不同的守護進程組成,每種守護進程運行在Hadoop集群中的特定主機上。其中 Impalad、Statestored、Catalogd 三個守護進程在其架構中扮演主要角色。
- Impala 守護進程
? ? ? ? Impala 的核心組件是一個運行在集群中每個數據節點上的守護進程,物理表現為 impalad 進程。該進程讀寫數據文件,接收從 impala-shell 命令行、Hue、JDBC、ODBC 提交的查詢請求,將查詢工作并行分布到集群的數據節點上,并將查詢的中間結果返回給中心協調節點。
? ? ? ? 可以將查詢提交至任意一個數據節點上運行的 Impala 守護進程,此守護進程實例擔任該查詢的協調器,其他節點提交部分中間結果返給協調器,協調器構建查詢的最終結果集。當在試驗環境使用 impala-shell 命令行運行 SQL 時,出于方便性,通常總是連接同一個 Impala 守護進程。而在生產環境負載的集群中,可以采用循環的方式,通過 JDBC 或 ODBC 接口,將每個查詢輪流提交至不同的 Impala 守護進程,已達到負載均衡。
? ? ? ? Impala 守護進程持續與 statestore 進行通信,以確認每個節點健康狀況以及是否可以接收新的任務。
? ? ? ? 當集群中的任何 Impala 節點建立、修改、刪除任何類型的對象,或者通過 Impala 處理一個 insert 或 load data 語句時,catalogd 守護進程(Impala 1.2 引入)都會發出廣播消息。Impala 守護進程會接收這種從 catalogd 守護進程發出的廣播消息。這種后臺通信減少了對 refresh 或 invalidate metadata 語句的需要,而在 Impala 1.2 版本前,這些語句被用于在節點間協調元數據信息。
- Impala Statestore
? ? ? ? 叫做 statestore 的 Impala 組件檢查集群中所有數據節點上 Impala 守護進程的健康狀況,并將這些信息持續轉發給每個 Impala 守護進程。其物理表現為一個名為 statestored 的守護進程,該進程只需要在集群中的一臺主機上啟動。如果 Impala 守護進程由于硬件、軟件、網絡或其他原因失效,statestore 會通知所有其他的 Impala 守護進程,這樣以后的查詢就不會再向不可到達的節點發出請求。
? ? ? ? statestore 的目的只是在發生某種錯誤時提供幫助,因此在正常操作一個 Impala 集群時,它并不是一個關鍵組件。即使 statestore 沒有運行或者不可用,Impala 守護進程依然會運行,并像通常一樣在它們中分法任務。 這時如果一個 Impala 守護進程失效,僅僅是降低了集群的魯棒性。當 statestore 恢復可用后,它會重建與 Impala 守護進程之間的通信并恢復監控功能。
? ? ? ? 在 Impala 中,所有負載均衡和高可用的考慮都是用于 Impala 守護進程的。statestored 和 catalogd 進程沒有高可用的需求,因為這些進程即使出現問題也不會引起數據丟失。當這些進程由于所在的主機停機而變成不可用時,可以這樣處理:先停止 Impala 服務,然后刪除 Impala StateStore 和 Impala Catalog 服務器角色,再在另一臺主機上添加這兩個角色,最后重啟 Impala服務。
- Impala Catalog 服務
? ? ? ? 稱為 Catalog 服務的 Impala 組件將 Impala SQL 語句產生的元數據改變轉發至集群中的所有數據節點。其物理表現為一個名為 catalogd 的守護進程,該進程只需要在集群中的一臺主機上啟動,而且應該與 statestored 進程在同一臺主機上。
? ? ? ? 由于 catalog 服務的存在,當通過執行 Impala 語句而改變元數據時,不需要再發出 refresh 或 invalidate metadata 語句。然而,當通過 Hive 執行建立表、裝載數據等操作后,在一個 Impala 節點上執行查詢前,仍然需要先發出 refresh 或 invalidate metadata 語句。例如,通過 Impala 執行的 create table、insert 或其他改變表或改變數據的操作,無需執行 refresh and invalidate metadata 語句。而如果這些操作是用過 Hive 執行的,或者是直接操縱的 HDFS 數據文件,仍需執行 refresh and invalidate metadata 語句(只需在一個 Impala 節點執行,而不是全部節點)。
? ? ? ? 缺省情況下,元數據在 Impala 啟動時異步裝載并緩存,這樣 Impala 可以立即接收查詢請求。如果想讓 Impala 等所有元數據裝載后再接收查詢請求,需要設置 catalogd 的配置選項 load_catalog_in_background=false。
(5)開發 Impala 應用
1. Impala SQL 方言
? ? ? ? Impala 的核心開發語言是 SQL,也可以使用 Java 或其他語言,通過 JDBC 或 ODBC 接口與 Impala 進行交互,許多商業智能工具都使用這種方式。對于特殊的分析需求,還可以用 C++ 或 Java 編寫用戶定義的函數(UDFs),補充 SQL 內建的功能。
? ? ? ? Impala 的 SQL 方言與 Hive 組件(HiveQL)在語法上高度兼容。正因如此,對于熟悉 Hadoop 架構上 SQL 查詢的用戶來說,Impala SQL 并不陌生。當前,Impala SQL 支持 HiveQL 語句、數據類型、內建函數的一個子集。Impala還包含一些附加的符合工業標準的內建函數,用于簡化從非 Hadoop 系統移植 SQL。
? ? ? ? 對于具有傳統數據庫或數據倉庫背景的用戶來說,下面關于 SQL 方言的內容應該是非常熟悉的:
- 包含 where、group by、order by、with 等子句的 select 語句(Impala 的 with 子句并不支持遞歸查詢),連接操作,處理字符串、數字、日期的內建函數、聚合函數、子查詢、in 和 between 這樣的比較操作符等。這些 select 語句與 SQL 標準是兼容的。
- 分區表在數據倉庫中經常使用。把一個或多個列作為分區鍵,數據按照分區鍵的值物理分布。當查詢的 where 子句中包含分區鍵列時,可以直接跳過不符合過濾條件的分區,這也就是所謂的“分區消除”。例如,假設有 10 年的數據,并且查詢語句中有類似 where year = 2015、where year > 2010、where year in (2014, 2015) 的 where 子句,則 Impala 跳過所有不匹配年份的數據,這會大大降低查詢的 I/O 數量。
- 在 Impala 1.2 及其以上版本中,UDFs 可以在 select 和 insert...select 語句中執行定制的比較和轉換邏輯。
? ? ? ? 如果對 Hadoop 環境不夠熟悉但具有傳統數據庫或數據倉庫背景,需要學習并實踐一下 Impala SQL 與傳統 SQL 的不同之處:
- Impala SQL 專注于查詢而不是 DML,所以沒有提供 update 或 delete 語句。對于沒用的陳舊數據,典型的做法是使用 drop table 或 alter table ... drop partition 語句直接刪除,或者使用? insert overwrite 語句將老數據替換掉。
- 在 Impala 中,所有的數據創建都是通過 insert 語句,典型情況是通過查詢其他表批量插入數據。insert 語句有兩種插入數據的方式,insert into 在現有數據上追加,而 insert overwrite 則會替換整個表或分區的內容(效果就像先 truncate table 再 insert 一樣)。Impala 沒有 insert ... values 的插入單行的語法。
- 比較常見的情況是,在其他環境建立表和數據文件,然后使用 Impala 對其進行實時查詢。相同的數據文件和表的元數據在 Hadoop 生態圈的不同組件之間共享。例如,Impala 可以訪問 Hive 里的表和數據,而 Hive 也可以訪問在 Impala 中建立的表及其數據。許多其他的 Hadoop 組件可以生成 Parquet 和 Avro 格式的文件,Impala 也可以查詢這些文件。
- Hadoop 和 Impala 的關注點在大數據集上的數據倉庫型操作,因此 Impala 包含一些對于傳統數據庫應用系統非常重要的 SQL 方言。例如,可以在 create table 語句中指定分隔符,通過表讀取以逗號和 tab 做分隔的文本文件。還可以建立外部表,在不遷移和轉換現有數據文件的前提下讀取它們。
- impala 讀取的大量數據可能不太容易確定其長度,所以不能強制字符串類型數據的長度。例如,可以定義一個表列為 string 類型,而不是象 char(1) 或 varchar(64) 限制字符串長度。(在 Impala 1.2 及其以后版本中,可以使用 char 和 varchar 類型限制字符串長度。)
2. Impala 編程接口
? ? ? ? 可以通過下面的接口連接 Impala,并向 Impala 守護進程提交請求。
- impala-shell 命令行接口
- Hue 基于 web 的用戶界面
- JDBC
- ODBC
? ? ? ? 使用這些接口,可以在異構環境下使用 Impala,如在非 Linux 平臺上運行的 JDBC、ODBC 應用,還可以使用 JDBC、ODBC 接口將 Impala 和商業智能工具結合使用。
? ? ? ? 每個 impalad 守護進程運行在集群中的不同節點上,監聽來自多個端口的請求。來自 impala-shell 和 Hue 的請求通過相同的端口被路由至 impalad 守護進程,而 JDBC 和 ODBC 的請求發往不同的 impalad 監聽端口。
(6)Impala 與 Hadoop 生態圈
? ? ? ? Impala 可以利用 Hadoop 生態圈中許多熟悉的組件,并且可以和這些組件交換數據,即可作為生產者也可作為消費者,因此可以靈活地加入到 ETL 管道中。
1.?Impala 與 Hive
? ? ? ? Impala 的一個主要目標是讓 SQL-on-Hadoop 操作足夠快,以吸引新的 Hadoop 用戶,或開發 Hadoop 新的使用場景。在實際中,許多 Hadoop 用戶使用 Hive 來執行長時間運行的、面向批處理的 SQL 查詢,而 Impala 可以利用這些已有的 Hive 架構。Impala 將它的表定義存儲在一個傳統的 MySQL 或 PostgreSQL 數據庫中,這個數據庫被稱為 metastore,而 Hive 也將其元數據存儲在同一個的數據庫中。通過這種方式,只要 Hive 表定義的文件類型和壓縮算法為 Impala 所支持,所有列的數據類型也是 Impala 所支持的類型,Impala 就可以訪問它。
? ? ? ? Impala 最初被設計成致力于提高查詢的性能,這就意味著在 Impala 里,select 語句能夠讀取的數據的類型比 insert 語句能夠插入的數據的類型要多。Impala 可以讀取使用 Hive 裝載的 Avro、RCFile 或 SequenceFile 文件格式的數據。
? ? ? ? Impala 查詢優化器也可以利用表和列的統計信息。在 Impala 1.2.2 版本前,使用 Hive 里的 analyze table 語句收集這些信息,在 Impala 1.2.2 及其更高版本中,使用 Impala 的 compute stats 語句收集信息。compute stats 更靈活也更簡單,并且不需要再 impala-shell 和 Hive shell 之間來回切換。
2.?Impala 的元數據和元數據存儲
? ? ? ? 前面討論 Impala 如何與 Hive 一起使用時提到,Impala 使用一個叫做 metastore 的數據庫維護它的表定義信息。同時 Impala 還跟蹤其他數據文件底層特性的元數據,如 HDFS 中數據塊的物理位置信息。
? ? ? ? 對于一個有很多分區或很多數據的大表,獲取它的元數據可能很耗時,有時需要花上幾分鐘的時間。因此每個 Impala 節點都會緩存這些元數據,當后面再查詢該表時,就可以復用緩存中的元數據。
? ? ? ? 如果表定義或表中的數據更新了,集群中所有其他的 Impala 守護進程在查詢該表前, ? 都必須能收到最新的元數據,并更新自己緩存的元數據。在 Impala 1.2 或更高版本中,這種元數據的更新是自動的,由 catalogd 守護進程為所有通過 Impala 發出的 DDL 和 DML 語句進行協調。
? ? ? ? 對于通過 Hive 發出的 DDL 和 DML,或者手工改變了 HDFS 文件的情況,還是需要在 Impala 中使用 refresh 語句(當新的數據文件被加到已有的表上)或 invalidate metadata 語句(新建表、刪除表、執行了 HDFS 的 rebalance 操作,或者刪除了數據文件)。invalidate metadata 語句獲取 metastore 中存儲的所有表的元數據。如果能夠確定在 Impala 外部只有特定的表被改變,可以為每一個受影響的表使用 refresh 表名,該語句只獲取特定表的最新元數據。
3.?Impala 與 HDFS
? ? ? ? Impala 使用分布式文件系統 HDFS 作為主要的數據存儲介質。Impala 依賴 HDFS 提供的冗余功能,保證在單獨節點因硬件、軟件或網絡問題失效后仍能工作。Impala 表數據物理表現為 HDFS 上的數據文件,這些文件使用常見的 HDFS 文件格式和壓縮算法。
4.?Impala 與 Hbase
? ? ? ? 除 HDFS 外,HBase 也是 Impala 數據存儲介質的備選方案。HBase 是建立在 HDFS 之上的數據庫存儲系統,不提供內建的 SQL 支持。許多 Hadoop 用戶使用 HBase 存儲大量的稀疏數據。在 Impala 中可以定義表,并映射為 HBase 中等價的表,通過這種方式就可以使用 Impala 查詢 HBase 表的內容,甚至可以聯合 Impala 表和 HBase 表執行關聯查詢。