巧用 Hive 類比分布式 grep

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.