天天看点

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