1. 程式人生 > >開源大資料分析引擎Impala實戰 筆記

開源大資料分析引擎Impala實戰 筆記

第三章 Impala 概念及架構

	3.1 Impala服務元件

3.1.1 Impala Deamon


該程序運行於叢集每個節點的守護程序,是Impala的核心元件,每個節點該程序的名稱為 impalad 	> ps -ef|grep impalad

負責讀取資料檔案;接受來自impala-shellHue / JDBC/ODBC的查詢請求,與其他節點並行分散式工作,
並將本節點的查詢結果返回給中心協調者節點(建議使用JDBC/ODBC介面以round-robin的方式將每個查詢提交的不同節點 impalad上)。

3.1.2 Impala Statestore


		Statestore 
蒐集叢集中 impalad 程序節點的健康狀況,並不斷的將健康狀況結果轉發給所有的 impalad 程序節點. > ps -ef|grep statestored 一個 impala 叢集只需要一個 statestore 程序節點。 Statestore的目的:在叢集故障時對 impalad程序節點同步資訊, 3.1.3 Impala Catalog Impalad 叢集中執行SQL 語句會引起元資料變化時,catalog服務負責將這些變化推送到其他 impalad程序節點上。 3.3.1 蒐集資訊 hive> analyze table; impala> compute stats;
第四章 SQL語句 4.1 註釋 -- /* .. */ 4.2 資料型別 BIGINTBOOLEANFLOATINTREAL(DOUBLE) SMALLINT2位元組的整型; TINTYNT1位元組的整型、 STRING、不能直接將STRING轉成BOOLEAN,但是可以使用CASE表示式針對不同的STRING資料返回TRUE/FALSE > select cast("123" as int);//返回123 > select cast(true as int);//返回1 > select cast(false as int);//
返回0 TIMESTAMP> select cast('1966-07-30' as timestamp);、、返回1966-07-30 00:00:00Now() 4.4 SQL操作符 4.4.1 表示式 where * BETWEEN 上限值 AND 下限值; IN> select * from test where a in("a","abc");//傳入的值(a) 只要與期中的任意一個值匹配,就會返回RURE//返回a abc IS NULL> select * from test where a is not null;//判斷給定的值是否為空 LIKE> select * from test where a like 'ab_'; //比較string資料,_匹配單個字元,%匹配多個字元。 REGEXP/reglike> select * from test where a regexp 'a.*'; //用來檢查一個值是否與一個正則表示式相匹配.、、返回a ab abc 4.5 AS 別名 ; 原始的名後緊跟別名也可以; 可為表、列、join結果集等指定更直觀的別名 4.5.2 識別符號,大小寫不敏感 4.5.3 啟動 $ impala-shell 資料庫、內部表、外部表(external)、檢視(>creat view v1 as select c1,c2 from t1 group by c1,c2 order by c1 limit 5;4.5.5 檢視是可以作為別名查詢的輕量級的邏輯結構。我們可以在查詢中使用表明的位置指定一個檢視名稱。可以實現更細粒度的訪問控制。只能查詢到允許他看到的列。 > creat table slow (x int,s string) stored as textfile; ---------例一 > creat view report as select s from slow where x between 20 and 30; > insert into slow values(21,'ajhk'),(30,'kjhk'); > select * from report; //查詢的是檢視名 指向對應表 > creat table fast (s string) partitioned by (x int) stored as parquet; --------例二 > insert into fast partitione(x=22) values('ddfd'); > insert into fast partitione(x=28) values('hgdd'); > alter view report as select s from fast where x between 20 and 30; > select * from report; 4.5.6 顯示檢視 > desc report; > desc formatted report; > select * from v1 order by c1 desc limit 10; 注:不能向檢視進行插入操作。如果針對檢視的 where條件列中包含了分割槽鍵,Impala 不會進行分割槽修剪。 4.6 SQL語句子集--DDL資料定義語言 > alter table old_name rename to new_name; //通過在表名前指定資料庫,可以把一張表從一個數據庫 移動 到另一個數據庫。 > > creat database d1; > creat database d2; > creat database d3; > > use d1; > creat table mobile(x int); > > use d2; > alter table d1.mobile rename to mobile; > > use d1 ; > alter table d2.mobile rename to d3.mobile; > > use d3; > show tables; //出現了mobile > alter table ** set location 'hdfs_path_directory'; //改變 Impala的表對應的資料檔案的物理位置 > alter table ** set fileformat {...}; //改變底層資料檔案格式 > alter table ** set serdeproperties ('serialization.format' = ',' , 'field.delim' = ','); //改變已存在的表/分割槽的分隔符 $ hdfs dfs -ls /user/hive/warehouse/表名 $ hdfs dfs -cat /user/hive/warehouse/表名/****.0 //查看錶內容 > alter table ** add columns (defs_column); //可以一次新增多個列 > alter table ** replace columns (defs_column); //定義新的列 > alter table ** change old_col new_col new_spec; //重新命名列 > alter table ** drop * ; //只能一次刪除一列 只有針對分割槽表才能進行新增或者刪除分割槽操作。 4.6.2 ALTER VIEW 只改變元資料資訊 > creat table t2 like t1; > creat view v1 as select ... > desc formatted v1; 4.6.3 compute stats > show table/cloumn stats **; //在執行 compute stats ** ;之後,show stats 可以顯示更多的資訊 4.6.4 creat database 如果不想每次都執行 invalidate metadata 語句,可以在建立資料庫的DDL語句上啟用SYNC_DDL 查詢選項。 4.6.5 creat function UDF:每次對單行呼叫返回一行的標量自定義函式。 UDA:對多行進行呼叫返回單行結果,使用者自定義聚集函式。 通常,UDAgroup by 結合將一個很大的結果集聚合成一個很小的結果集,甚至整個表進行值彙總得到一行記錄。 > creat aggregate funtion [if not exists] [db_name.] *** ( , , ,); //aggregate建立UDA 4.6.6 creat table 外部表:刪除時,不會刪除資料檔案。 partitioned by 子句將一句一列或多列的值將資料檔案分開存放。 stored as 子句指定底層儲存的資料檔案的格式。 escaped by 選擇一個從未出現過的字元作為轉義字元,並把它放在欄位內分隔符例項之前。如使用\ > .. escaped by '\\' > creat table t2 like t1 stored as parquet; //克隆表 tblproperties: 指定元資料的屬性。 with serdeproperties: 指定鍵值對,來指定表的 SerDe 屬性。 4.6.11 刪除表 if exists : 無論表是否存在,刪除語句都不會報錯。這個子句在執行標準的安裝指令碼,刪除已經存在的物件或者建立新的物件是非常有用。 4.6.13 > explain ...; 返回一個語句的執行計劃 compute stats *;執行分析之後,explain能夠顯示為優化查詢提供幫助的更為詳細的資訊。 併發考慮: insert into 如果插入失敗,插入期間資料被臨時存放的資料檔案和子目錄不會被刪除,需要使用 hdfs dfs -rm -r 跟工作目錄的全目錄刪除。 > insert overwrite t1 values(,,,),(,,,); 可以將帶有具體列值得行插入到表中。值需與表定義的列順序相同,對於不想插入資料的列,指定NULL Hbase考慮: 不能使用 insert overwrite 向表中插入資料,對於hbase表只能增加的方式插入,不能覆蓋。 在底層,HBase基於列族的方式管理列。insert into h_t1 select * from hdfs_t1;可能引起插入不匹配, 需要先通過 describe 查看錶中列順序。 4.6.14 invalidate metadata refresh 成本更高。 invalidate metadata 會強制元資料過期,這樣下次表被引用時元資料會重新載入。對於一個超大表 invalidate metadata 將會消耗大量的時間。 refresh 可能可以避免不可預知的延遲。 describe 會更新該表最新元資料資訊,也會避免下次查詢由於重新載入元資料帶來的延遲。 執行impalad-shell-r :會重新整理元資料資訊保持最新。多分割槽 大表不介意使用。-refresh_after_connect 4.6.16 移動資料檔案 > load data inpath '/.../..' [overwrite] into table t1; // '移動資料檔案' 不是拷貝喲,目前只支援從HDFS中載入資料。 載入一個目錄下所有資料檔案時,需要保證資料檔案位於該目錄之下,而不是巢狀的子目錄下。 shell指令碼生成幾個包含數字串的檔案,將檔案上傳到HDFS上。 # cat random_strings.sh #!/bin/sh num=$1 for (( c=1; c<=num; c++)) do echo $RANDOM; done; # chomd +x random_strings.sh # sh random_strings.sh 5 $ random_strings.sh 1000 | hdfs dfs -put - /dir/thousand_strings.txt $ random_strings.sh 100 | hdfs dfs -put - /dir/hundred_strings.txt $ random_strings.sh 10 | hdfs dfs -put - /dir/ten_strings.txt > creat table t1 (s string); > load data inpath '/dir/thousand_strings.txt' into table t1; > load data inpath '/dir/thousand_strings.txt' into table t1; //報錯!因為檔案已經不存在了 $ hdfs dfs -ls /user/hive/warehouse/.../t1 4.6.18 SELECT 1.SQL-92 風格JOIN:查詢中顯示指定jion 關鍵字,使用 on using 指定哪些列作為連線鍵。 > select t1.c1, t2.c2 from t1 JOIN t2 ON t1.id = t2.id and t1.type = t2.type /*該句或者*/ USING id, type where t1.c1 > 100; //USING id, type)用於各表關聯列具有相同名稱的情況。 2.SQL-89 風格JOIN: 用逗號分隔用到的表,用 where 條件關聯列進行等值比較。 易使用,也很容易由於刪除某些 where子句導致連線無法工作。 > select t1.c1, t2.c2 from t1t2 WHERE t1.id = t2.id and t1.type = t2.type AND t1.c1 > 100; 3.自連線 對某張表 不同列 進行關聯查詢 以展示資料之間的父子關係或樹形結構。 無需顯式指定自連線關鍵字,只要對 一張表 指定不同的 別名,看作兩張表即可。 > select t1.id, t2.parent, t1.c1, t2.c2 from a t1a t2 where t1.id = t2.parent; // 不能理解 4.笛卡爾連線 不能用於 ON子句,和: > select ... from t1 JOIN t2; > select ... from t1, t2; 只用於 CROSS JOIN,或可以用 where子句進行過濾: > select ... from t1 CROSS JOIN t2; > select ... from t1 CROSS JOIN t2 WHERE ...; 5.內連線 是最常用的型別,結果集包含所有參與連線的表中匹配的列,這些列具有滿足在不同表之間關聯列的等值匹配。 如果參與連線的表具有相同的列名,則需要使用完全限定名 或者列別名進行引用。支援SQL-89/92 > select t1.id, c1,c2 from t1t2 WHERE t1.id = t2.id; > select t1.id, c1,c2 from t1 JOIN t2 ON t1.id = t2.id; > select t1.id, c1,c2 from t1 INNER JOIN t2 ON t1.id = t2.id; 6.外連線 ..OUTER join 從左手型表(LEFT),右手型表(RIGHT),全外連線表(FULL) 獲取所有的 行資料。 如果外連線的表中沒有與其他表關聯匹配的資料,結果集中相關列會被置為 NULL。 用的是 SQL-92語法,(join不能用逗號代替),不支援 SQL-89的連線語法。 > select * from t1 LEFT OUTER JOIN t2 on t1.id = t2.id; > select * from t1 RIGHT OUTER JOIN t2 on t1.id = t2.id; > select * from t1 FULL OUTER JOIN t2 on t1.id = t2.id; 7.等值連線和非等值連線 Impala預設進行等值連線查詢。inner outer full semi 都是。 可以使用比較運算子實現 非等值連線,可以避免產生超出資源限制的超大結果集。 如果執行的 非等值連結產生的結果集大小可以接受,可使用 cross join ,並且在 where子句中進行額外的比較操作。 > select .. from t1 CROSS JOIN t2 WHERE t1.total > t2.maximum_price; 8.Impala不支援自然連線和反連線 9.在如下情況使用連線查詢: 。當需要從不同物理上獨立儲存的表進行關聯獲取資料時。 。將資料歸一化,連線查詢允許我們減少資料複製,將不同的資料儲存在不同的表中。 。對於那些很少使用的某些列,我們可以將其移動到其他表中以減少大部分查詢的負載。 。減少歧義on where > select t1.c1 as first_id, t2.c2 as second_id from t1 join t2 on first_id = second_id; > select fact.custno, dimension.custno from customer_data as fact join customer_address as dimension using (custno); 10.order by 排序 這是一個代價非常高的操作,因為在排序之前,整個結果集需要傳輸到一個節點上進行排序,需要更多的記憶體容量。 order by .. [ASC | DESC] [NULLS FIRST | NULLS LAST] 指定升序/降序,null值位於結果集開頭還是結尾。 Impala-shell中對一個會話所有的查詢設定預設limit > set DEFAULT_ORDER_BY_LIMIT=... 也可以在啟動Inpala程序時指定: -default_query_options default_order_by_limit=...在例項級別進行限制。 11.group by 需要使用像 count()sun()avg()min()max()這樣的聚集函式。 > select **,sum(s1) as s from *** group by *** order by sum(s1) desc limit 5; 12.having 對帶有group by 子句的select查詢執行過濾操作,它過濾的是 聚集函式運算的結果,而不是原始資料的行。 > select ss_item as item, count(ss_item) as time_p, sum(ss_11) as **, from ** group by ss_item //用的是原始資料 having item >= 100 //用的是別名 order by sum(ss_11) //用的是原始資料 limit 5; 13.offset 查詢自邏輯第一行之後的某行開始返回結果。經常結合order by limit一起使用。 > select x from numbers order by x limit 5 offset 5; //5開始對快取的結果集進行分頁顯示在頁面上 14.union 合併多個查詢結果集。就好像是使用了 distinct一樣。 > select**1 union [distinct | all] select**2 //去重. 不使用allunion耗更多記憶體和時間。 15.with 放在 select之前,用於為 複雜表示式定義一個別名。 方便維護、可讀性強、提高相容性。 > with t1 as (select 1), t2 as (select 2) select * from t1 union all select * from t2; 16.hints 可以更好的從底層調整SQL查詢的工作方式。 對於那些丟失了統計資訊或者其他因素導致查詢成本異常昂貴時,作為臨時解決方案。 使用【】將特定的hints括起來使用。 explain可以確認一個特定查詢使用了什麼關聯策略。 [shuffle]:join使用分割槽技術,該方式對於處理 大表與大表之間的關聯非常有效。 [broadcast]join使用廣播技術,將右手型表的所有內容傳送到與之關聯的所有節點上。對於處理 大表與小表 之間的關聯非常有效。 > select ... from d1 join [broadcast]d2 on ..=..; 17.distinct 去重 過濾並刪除結果集中的重複值。 > select distinct c1,c2 from xx; //過濾兩列組合的重複值 > select count(distinct c1,c2) from xx; //計算兩個列 非重複值的個數 18.show..; use..; > show databases like 'd*'; > show tables in default 't*'; > show functions in **; //顯示的是UDFs, 檢視內嵌函式的定義 > show aggregate functions in **; //UDAFs > show table/column stats db.tb; //對於調整和診斷效能,大表和複雜連線查詢非常重要 啟動impala-shell時連線到特定資料庫: impala-shell -d db_name //-d 選項對於執行SQL指令碼非常有用,使用之後無需把USE語句硬編碼在SQL指令碼中。 4.7 內嵌函式 聚集函式不會返回Null值,會忽略掉列中null值。 cast10 as string) 型別轉換 concat('123', cast45 as string, '6') 字串連線 case a when b then c [when d then e].. end 將表示式與多個可能進行比較,如果匹配到則返回相應結果。 pid()返回會話連線到的impala程序ID user()返回連線到impala程序的Linux使用者名稱。 current_database()返回當前資料庫名稱。 version()... ... 4.8 聚集函式