任務(wù)
將一批登陸日志導(dǎo)入到hive中朗若,然后通過hive計(jì)算如下數(shù)據(jù)材失,并將計(jì)算結(jié)果存入mongoDB磨淌。
1级遭、每小時(shí)的登陸用戶數(shù)(qid消重)
2香嗓、每小時(shí)通過各渠道登陸各游戲的用戶數(shù)
3、12月9日10點(diǎn)的新用戶登陸日志的數(shù)據(jù)結(jié)構(gòu)如下所示装畅。
年月時(shí)分秒gkey登陸時(shí)間qid skey 渠道ip地址
步驟
1靠娱、在hive中建立日志的表結(jié)構(gòu)
由于登陸日志中,有一些無用的信息需要剔除掠兄,例如”info像云、SPR“等,因此在建表時(shí)蚂夕,需要通過自定義SerDe(serialize/deserialize迅诬,數(shù)據(jù)序列化和反序列化時(shí)格式化數(shù)據(jù))來提取特定信息。
2婿牍、加載數(shù)據(jù)到登陸日志表
日志文件是按小時(shí)組織的侈贷,因此一天有24個(gè)文件。通過使用“20131208*”可以將12月8號(hào)那天的24個(gè)文件一次性加載到hive中等脂。
3俏蛮、在hive中建立計(jì)算結(jié)果的表結(jié)構(gòu)
storedby指定了該表的存儲(chǔ)位置。這里使用了開源的Hive-mongo程序使hive的計(jì)算結(jié)果直接保存到mongoDB中上遥。tblproperties中指定了mongo的host搏屑、port、db粉楚、collection辣恋。
4蹦疑、加載數(shù)據(jù)到計(jì)算結(jié)果表
遇到的坑
1.加載數(shù)據(jù)到登陸日志表失敗甘邀,所有記錄的值都為null
原因:正則表達(dá)式編寫不正確。由于自定義了表屬性信息serdeproperties扼雏,因此要求正則表達(dá)式必須能與日志格式完全匹配燃异,否則提取不到特定信息携狭。為了寫出正確的正則表達(dá)式,首先在Regex Match Tracer中編寫來匹配日志特铝,成功后再將每個(gè)正則表達(dá)式中的轉(zhuǎn)義字符再加上一個(gè)轉(zhuǎn)義符號(hào)""(詳細(xì)解釋)暑中,但仍然加載不成功壹瘟。仔細(xì)分析后發(fā)現(xiàn)鲫剿,在Regex Match Tracer中用來匹配的那條日志記錄,其"渠道"字段都為字符串稻轨,因此我在正則表達(dá)式中直接使用\w+來匹配灵莲,而日志中絕大多數(shù)的記錄,其“渠道”字段中有分隔符“-”殴俱,從而導(dǎo)致絕大多數(shù)日志記錄不匹配政冻。而每次查看日志表時(shí)枚抵,只查看前10條記錄,恰好前10條記錄都不匹配明场,讓我誤以為所有的都是null汽摹。
2.加載數(shù)據(jù)到計(jì)算結(jié)果表時(shí),經(jīng)常性的失敗
原因:將mongo.host寫成127.0.0.1苦锨。hive會(huì)將操作語(yǔ)句轉(zhuǎn)換為map-reduce任務(wù)逼泣,map-reduce會(huì)在w5-w15集群中進(jìn)行分布式運(yùn)算。本機(jī)為w5舟舒,而mongodb只有在w5上才有拉庶。若任務(wù)分配到w5則能成功連上mongodb,若分配到其他機(jī)器上秃励,則會(huì)嘗試連接其他機(jī)器的mongodb氏仗,當(dāng)然會(huì)連不上而導(dǎo)致失敗。