天天看點

hadoop中的hive查詢cdn通路日志指定時間段内url通路次數最多的前10位(結合python語言)

hadoop環境描述:

master節點:node1

slave節點:node2,node3,node4

遠端伺服器(python連接配接hive):node29

需求:通過hive查詢到cdn日志中指定時間段内url通路次數最多的前10個url

ps:用pig查詢可以查詢文章:

<a href="http://shineforever.blog.51cto.com/1429204/1571124" target="_blank">http://shineforever.blog.51cto.com/1429204/1571124</a>

說明:python操作遠端操作需要使用Thrift接口:

hive源碼包下面自帶Thrift插件:

[root@node1 shell]# ls -l /usr/local/hive-0.8.1/lib/py

total 28

drwxr-xr-x 2 hadoop hadoop 4096 Nov  5 15:29 fb303

drwxr-xr-x 2 hadoop hadoop 4096 Oct 15 10:30 fb303_scripts

drwxr-xr-x 2 hadoop hadoop 4096 Nov  5 15:29 hive_metastore

drwxr-xr-x 2 hadoop hadoop 4096 Oct 15 10:30 hive_serde

drwxr-xr-x 2 hadoop hadoop 4096 Nov  5 15:29 hive_service

drwxr-xr-x 2 hadoop hadoop 4096 Nov  5 15:20 queryplan

drwxr-xr-x 6 hadoop hadoop 4096 Nov  5 15:20 thrift

1)把相關檔案scp到遠端的node29相關目錄下:

scp -r /usr/local/hive-0.8.1/lib/py/* 172.16.41.29:/usr/local/hive_py/.

2) 在node1伺服器上開發hive:

[hadoop@node1 py]$ hive --service  hiveserver

Starting Hive Thrift Server

3)在node29上編寫查詢腳本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

<code>#!/usr/bin/env python</code>

<code>#coding:utf-8</code>

<code>#找出cdn日志指定時間段,url通路次數最多的前10個;</code>

<code>import</code> <code>sys</code>

<code>import</code> <code>os</code>

<code>import</code> <code>string</code>

<code>import</code> <code>re</code>

<code>import</code> <code>MySQLdb</code>

<code>#加載hive的python相關庫檔案;</code>

<code>sys.path.append(</code><code>'/usr/local/hive_py'</code><code>)</code>

<code>from</code> <code>hive_service </code><code>import</code> <code>ThriftHive</code>

<code>from</code> <code>hive_service.ttypes </code><code>import</code> <code>HiveServerException</code>

<code>from</code> <code>thrift </code><code>import</code> <code>Thrift</code>

<code>from</code> <code>thrift.transport </code><code>import</code> <code>TSocket</code>

<code>from</code> <code>thrift.transport </code><code>import</code> <code>TTransport</code>

<code>from</code> <code>thrift.protocol </code><code>import</code> <code>TBinaryProtocol</code>

<code>dbname</code><code>=</code><code>"default"</code>

<code>hsql</code><code>=</code><code>"select request,count(request) as counts </code><code>from</code> <code>cdnlog where time &gt;</code><code>=</code> <code>'[27/Oct/2014:10:40:00 +0800]'</code> <code>and</code> <code>time &lt;</code><code>=</code> <code>'[</code><code>27</code><code>/</code><code>Oct</code><code>/</code><code>2014</code><code>:</code><code>10</code><code>:</code><code>49</code>

<code>:</code><code>59</code> <code>+</code><code>0800</code><code>]' group by request order by counts desc limit </code><code>10</code><code>"</code>

<code>def</code> <code>hiveExe(hsql,dbname):</code>

<code>    </code><code>try</code><code>:</code>

<code>        </code><code>transport </code><code>=</code> <code>TSocket.TSocket(</code><code>'172.16.41.151'</code><code>, </code><code>10000</code><code>)</code>

<code>        </code><code>transport </code><code>=</code> <code>TTransport.TBufferedTransport(transport)</code>

<code>        </code><code>protocol </code><code>=</code> <code>TBinaryProtocol.TBinaryProtocol(transport)</code>

<code>        </code><code>client </code><code>=</code> <code>ThriftHive.Client(protocol)</code>

<code>        </code><code>transport.</code><code>open</code><code>()</code>

<code>#加載增長表達式支援,必需(以下加載路徑為遠端hive路徑,不是腳本的本地路徑!)</code>

<code>        </code><code>client.execute(</code><code>'add jar /usr/local/hive-0.8.1/lib/hive_contrib.jar'</code><code>)</code>

<code>#        client.execute("use " + dbname)</code>

<code>#        row = client.fetchOne()</code>

<code>        </code><code>client.execute(hsql)</code>

<code>        </code><code>return</code> <code>client.fetchAll() </code><code>#查詢所有資料;</code>

<code>        </code><code>transport.close()</code>

<code>    </code><code>except</code> <code>Thrift.TException, tx:</code>

<code>        </code><code>print</code> <code>'%s'</code> <code>%</code> <code>(tx.message)</code>

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>

<code>    </code><code>results</code><code>=</code><code>hiveExe(hsql,dbname)</code>

<code>    </code><code>num</code><code>=</code><code>len</code><code>(results)</code>

<code>    </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(num):</code>

在node29上執行腳本,輸入結果為:

<a href="http://s3.51cto.com/wyfs02/M02/4D/DB/wKioL1RbHoPT0rHZAAHHICCIv7U438.jpg" target="_blank"></a>

node1伺服器上hive計算過程為:

<a href="http://s3.51cto.com/wyfs02/M02/4D/DC/wKiom1RbHjnhxxvdAAcmfK-RneY166.jpg" target="_blank"></a>

本文轉自 shine_forever 51CTO部落格,原文連結:http://blog.51cto.com/shineforever/1573439