標籤:style http color io os 使用 ar for 資料
grep 由於內建高效的字串搜尋演算法,相容各種風格的正則,且功能眾多,有著 linux 下字串處理三劍客之一的稱號,但是到了如今的大資料/分布式時代,這種單機時代的工具顯得有些廉頗老矣。。。
1、需求背景
我們經常會遇到需要在 hadoop 上尋找原始日誌,校對 ETL 資料的情況,往往很多同學直接用的老辦法:
hadoop fs -cat /M_track/$yesterday/* | grep ooxx | wc -l
這種情況下是要把分布在整個叢集上的日誌都拉到單機上 grep 然後 wc,這是一件極其痛苦的事情,瓶頸很顯然卡在了網路 IO 上,一百多 G 的日誌,一個簡單的 grep 往往半小時都出不來結果。。。
好在資料在 hadoop 上,那我們為了執行分散式查詢,自然可以想到寫 mr 來解決,但是一個簡單的統計查詢,也太重量級了,整個編寫打包上傳流程走下來,時間成本太高,那我們自然想到了 hive, 使用 hive 直接解析,查詢原始日誌。
hive 中的 like 支援的是通配,和 mysql 一樣,RLIKE/REGEXP 支援的是正則,這樣大部分的 grep 正則、通配能乾的事情,hive 也都可以幹了。
2、流程與案例 2.1 首先針對整個原始日誌建表
create EXTERNAL table IF NOT EXISTS ext_M_track ( line string)PARTITIONED BY (statDate STRING)ROW FORMAT DELIMITEDFIELDS TERMINATED BY ‘\001‘COLLECTION ITEMS TERMINATED BY ‘\002‘MAP KEYS TERMINATED BY ‘\003‘LINES TERMINATED BY ‘\n‘STORED AS TEXTFILELOCATION ‘/M_track‘;
2.2 添加分區
ALTER TABLE ext_M_track ADD PARTITION (statDate=‘20140903‘) LOCATION ‘/M_track/20140903‘;
2.3 案例分析 2.3.1 尋找包含某個字串的記錄總數
select count(1) from ext_M_track where statDate=‘20140903‘ and line like ‘%tag=pvstatall%‘;
2.3.2 按小時統計全天的流量分布
select regexp_extract(line, "(03/Sep/2014:\\d{2})", 1) hour, count(1) pv from ext_M_track where statDate=‘20140903‘ and line like ‘%tag=pvstatall%‘ group by regexp_extract(line, "(03/Sep/2014:\\d{2})", 1);03/Sep/2014:2240867 03/Sep/2014:2138951 03/Sep/2014:1335113 03/Sep/2014:1434285 03/Sep/2014:1534120 03/Sep/2014:2033852 03/Sep/2014:1233308 03/Sep/2014:1032644 03/Sep/2014:1132362 03/Sep/2014:1632284 03/Sep/2014:0930031 03/Sep/2014:1729023 03/Sep/2014:2328247 03/Sep/2014:1928125 03/Sep/2014:1826250 03/Sep/2014:0824452 03/Sep/2014:0717456 03/Sep/2014:0016103 03/Sep/2014:0111679 03/Sep/2014:0611074 03/Sep/2014:027262 03/Sep/2014:055367 03/Sep/2014:035047 4666 03/Sep/2014:044221 2.4 如何流程化
步驟 2.2 中我們對某天的日誌進行了手動處理,我們實際使用當中,很容易流程化,將下面的指令碼用 crontab 定期調度即可:
#!/bin/bash# 為庫 tmpdb 表 ext_M_track 每天建立分區yesterday=`date -d ‘1 days ago‘ +‘%Y%m%d‘`hive -e "use tmpdb; ALTER TABLE ext_M_track ADD PARTITION (statDate=‘$yesterday‘) LOCATION ‘/M_track/$yesterday‘;"
3、Refer:
[1] LanguageManual UDF
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
[2] archive-analysis
https://github.com/vinaygoel/archive-analysis/tree/master/hive/cdx
巧用 Hive 類比分布式 grep