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 ></code><code>=</code> <code>'[27/Oct/2014:10:40:00 +0800]'</code> <code>and</code> <code>time <</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