Impala:大数据丛林中敏捷迅速的黑斑羚
在大數據蓬勃發展的今天,基于Hadoop黃金搭檔HDFS和MapReduce的Hive,已經無法滿足人們對于海量數據處理速度越來越快的要求。時勢造英雄,Cloudera依據Google的Dremel為原型開發了跨時代的查詢引擎:Impala。
Impala的本意是黑斑羚,產于非洲中南部,行動敏捷,奔跑迅速。下面我們就來揭開這只敏捷迅速黑斑羚的神秘面紗,以饗各位看官。?
01 概述
Impala是基于MPP的SQL查詢系統,可以直接為存儲在HDFS或HBase中的Hadoop數據提供快速、交互式的SQL查詢。Impala和Hive一樣也使用了相同的元數據、SQL語法(Hive SQL)、ODBC驅動和用戶接口(Hue Beeswax),這就很方便地為用戶提供了一個相似并且統一的平臺來進行批量或實時查詢。
Impala系統架構圖如下所示:
Impala主要包括以下組成部分:
Impala Shell:客戶端工具,提供一個交互接口ODBC,供使用者連接到Impalad發起數據查詢或管理任務等。
Impalad:分布式查詢引擎,由Query Planner、Query Coordinator和Query Exec Engine三部分組成,可以直接從HDFS或者HBase中用SELECT、JOIN和統計函數查詢數據。
State Store:主要為跟蹤各個Impalad實例的位置和狀態,讓各個Impalad實例以集群的方式運行起來。
Catalog Service:主要跟蹤各個節點上對元數據的變更操作,并且通知到每個節點。
Impala支持以下特性:
支持ANSI-92 SQL所有子集,包括CREATE/ALTER/SELECT/INSERT/JOIN/subqueries
支持分區join、完全分布式聚合以及完全分布式top-n查詢
支持多種數據格式:Hadoop原生格式(apache Avro,SequenceFile,RCFile with Snappy,GZIP, BZIP或未壓縮)、文本(未壓縮或者LZO壓縮)和Parquet(Snappy或未壓縮)
可以通過JDBC、ODBC、Hue GUI或者命令行shell進行連接
02 查詢處理流程
Impalad分為Java前端(Frontend)與C++處理后端(Backend),接受客戶端連接的Impalad即作為這次查詢的Coordinator,Coordinator通過JNI調用Java前端對用戶的查詢SQL進行分析生成執行計劃樹,不同的操作對應不用的PlanNode, 如:SelectNode, ScanNode, SortNode, AggregationNode, HashJoinNode等等。
執行計劃樹的每個原子操作由一個PlanFragment表示,通常一條查詢語句由多個Plan Fragment組成, Plan Fragment 0表示執行樹的根,匯聚結果返回給用戶,執行樹的葉子結點一般是Scan操作,分布式并行執行。
Java前端產生的執行計劃樹以Thrift數據格式返回給Impala C++后端Coordinator,執行計劃分為多個階段,每一個階段叫做一個PlanFragment,每一個PlanFragment在執行時可以由多個Impalad實例并行執行(有些PlanFragment只能由一個Impalad實例執行,如聚合操作),整個執行計劃即為一個執行計劃樹。Coordinator收到執行計劃后,數據存儲信息(Impala通過libhdfs與HDFS進行交互,通過hdfsGetHosts方法獲得文件數據塊所在節點的位置信息),通過調度器(現在只有simple-scheduler, 使用round-robin算法)Coordinator::Exec對生成的執行計劃樹分配給相應的后端執行器Impalad執行(查詢會使用LLVM進行代碼生成,編譯,執行),通過調用GetNext()方法獲取計算結果,如果是insert語句,則將計算結果通過libhdfs寫回HDFS,當所有輸入數據被消耗光,執行結束,之后注銷此次查詢服務。
Impala查詢處理流程如下圖所示:
03 訪問Impala
訪問Impala有兩種方式,一種是使用命令行工具impala-shell,另一種是使用JDBC編程,下面分別闡述。
Impala-shell
可以通過命令行工具Impala-shell來創建數據庫、表、插入數據、執行查詢等。
Impala shell命令格式如下:
impala-shell [選項]
impala-shell使用選項如下:
選項 | 描述 |
-B or --delimited | 導致使用分隔符分割的普通文本格式打印查詢結果。當為其他?Hadoop?組件生成數據時有用。對于避免整齊打印所有輸出的性能開銷有用,特別是使用查詢返回大量的結果集進行基準測試的時候。使用?--output_delimiter 選項指定分隔符。使用 -B 選項常用于保存所有查詢結果到文件里而不是打印到屏幕上。 |
--print_header | 是否打印列名。整齊打印時是默認啟用。同時使用 -B 選項時,在首行打印列名 |
-o?filename?or ?--output_file?filename | 保存所有查詢結果到指定的文件。通常用于保存在命令行使用 -q 選項執行單個查詢時的查詢結果。對交互式會話同樣生效;此時你只會看到獲取了多少行數據,但看不到實際的數據集。當結合使用 -q 和 -o 選項時,會自動將錯誤信息輸出到 /dev/null。 |
--output_delimiter=character | 當使用 -B 選項以普通文件格式打印查詢結果時,用于指定字段之間的分隔符。默認是制表符 tab ('\t')。假如輸出結果中包含了分隔符,該列會被引起且/或轉義。 |
-p or --show_profiles | 對 shell 中執行的每一個查詢,顯示其查詢執行計劃 (與?EXPLAIN 語句輸出相同) 和發生低級故障的執行步驟的更詳細的信息 |
-h or --help | 顯示幫助信息 |
-i?hostname?or ?--impalad=hostname | 指定連接運行 impalad 守護進程的主機。默認端口是 21050。你可以連接到集群中運行 impalad 的任意主機。假如你連接到 impalad 實例通過?--fe_port 標志使用了其他端口,則應當同時提供端口號,格式為 hostname:port |
-q?query?or --query=query | 從命令行中傳遞一個查詢或其他 shell 命令。執行完這一語句后 shell 會立即退出。限制為單條語句,可以是?SELECT,?CREATE ?TABLE,?SHOW TABLES, 或其他 impala-shell 認可的語句。因為無法傳遞 USE 語句再加上其他查詢,對于 default?數據庫之外的表,應在表名前加上數據庫標識符(或者使用 -f 選項傳遞一個包含 USE 語句和其他查詢的文件) |
-f?query_file?or --query_file=query_file | 傳遞一個文件中的 SQL 查詢。文件內容必須以分號分隔 |
-k or --kerberos | 當連接到 impalad 時使用 Kerberos 認證。如果要連接的 impalad 實例不支持?Kerberos,將顯示一個錯誤 |
-s?kerberos_service_name?or ?--kerberos_service_name=name | 指示impala-shell對特定impalad服務主體進行身份驗證。 如果沒有設置 ?kerberos_service_name?,默認使用 impala。如果啟用了本選項,而試圖建立不支持Kerberos 的連接時,返回一個錯誤。 |
-V or --verbose | 啟用詳細輸出 |
--quiet | 關閉詳細輸出 |
-v or --version | 顯示版本信息 |
-c | 查詢執行失敗時繼續執行 |
-r or --refresh_after_connect | 建立連接后刷新 Impala 元數據,與建立連接后執行?REFRESH?語句效果相同 |
-d?default_db?or --database=default_db | 指定啟動后使用的數據庫,與建立連接后使用?USE?語句選擇數據庫作用相同,如果沒有指定,那么使用 default 數據庫 |
-l | 啟用 LDAP 認證 |
-u | 當使用 -l 選項啟用 LDAP 認證時,提供用戶名(使用短用戶名,而不是完整的 LDAP 專有名稱distinguished name),shell 會提示輸入密碼 |
JDBC編程
Impala支持JDBC訪問,JAVA程序通過JDBC驅動訪問Impala。配置Impala的JDBC連接包括以下步驟:
配置Impala JDBC端口
默認的Impala JDBC訪問端口是21050,確保Impala上此端口能被其他機器訪問;如果使用其他端口,啟動impalad時帶上--hs2_port參數。
在客戶端安裝Impala JDBC驅動
客戶端impala JDBC驅動包含一些jar文件,文件列表如下:
下載上述jar文件到impala JDBC客戶端。
保存jar文件到CLASSPATH路徑中。
設置CLASSPATH環境變量包含jar文件路徑
在linux系統:增加jar路徑到CLASSPATH前面:比如jar文件保存到/opt/jars/,設置命令為:export CLASSPATH=/opt/jars/*.jar:$CLASSPATH
在windows系統:在“系統屬性”控制面板中修改“環境變量”,設置CLASSPATH開頭包含jar文件路徑
Java應用程序配置JDBC連接字符串,連接Impalad
JDBC驅動類是org.apache.hive.jdbc.HiveDriver,連接分為以下幾種:
連接的Impala集群沒有使用Kerberos鑒權,JDBC連接字符串形式為:jdbc:hive2://host:port/;auth=noSasl
連接的Impala集群使用Kerberos鑒權,JDBC連接字符串形式為:jdbc:hive2://host:port/;principal=principal_name
連接的Impala集群使用LDAP鑒權,JDBC連接字符串形式為:jdbc:hive2://host:port/db_name;user=ldap_userid;password=ldap_password
下面的例子使用Impala JDBC編程接口查詢指定表的數據:
04 性能調優
Impala性能調優使用以下方法:
選擇合適的文件格式
通常情況,對大量數據,Parquet文件格式是最好的,因為它結合了列存儲布局、大的I / O請求大小、壓縮和編碼。
避免數據攝入過程產生許多小文件
使用INSERT……SELECT復制表數據,避免對任何海量數據或影響性能的關鍵型表使用INSERT……VALUES,因為每一個這樣的語句產生一個單獨的小數據文件。
如果在數據處理中產生過多小文件,需要使用INSERT……SELECT將數據復制到另外一張表,這樣解決了小文件過多的問題。
選擇合適的分區技術
分區是一種技術,基于一個或多個列的值物理上把數據分成多部分。當你發出查詢請求一個特定分區鍵列的值或值范圍,Impala可以避免讀取無關的數據可能產生的巨大的磁盤I / O。
分區技術適用于以下情況:
表的數據量非常大,讀取整個表的時間不在我們的承受范圍之內
表總是依據某些特定的列進行查詢
列有合理的基數(不同值的數量)
數據已經經過ETL處理
使用COMPUTE STATS搜集連接查詢中海量數據表或者影響性能的關鍵表的統計信息
最小化返回結果給客戶端的傳輸開銷
使用聚合、過濾、限制、避免精細打印結果集等方法返回最小化結果。
在運行查詢前使用EXPLAIN查看執行計劃是否高效合理
在運行查詢后使用PROFILE從底層確認IO、內存消耗、網絡帶寬占用、CPU使用率等信息是否在預期范圍內
來源:中興大數據
精彩活動
福利 · 閱讀 | 免費申請讀大數據新書 第23期
推薦閱讀
2017年數據可視化的七大趨勢!?
全球100款大數據工具匯總(前50款)?
論大數據的十大局限
大數據時代的10個重大變革
大數據七大趨勢 第一個趨勢是物聯網
Q:?關于Impala,你還了解什么?
歡迎留言與大家分享
請把這篇文章分享給你的朋友
轉載 / 投稿請聯系:hzzy@hzbook.com
更多精彩文章,請在公眾號后臺點擊“歷史文章”查看
總結
以上是生活随笔為你收集整理的Impala:大数据丛林中敏捷迅速的黑斑羚的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑客魔术!如何黑掉一台根本不联网的电脑
- 下一篇: STM32之RTC例程