|
pycurl实现hadoop的客户端功能
目前在测试一个hadoop的功能,需要频繁的和hadoop打交道。刚开始采用的python的subprocess模块来调用底层的hadoop提供的命令行工具实现的。
一,hadoop提供的命令行格式说明:
hadoop fs [cmd]具体的命令有:
hadoop fs [-fs ] [-conf ]
[-D ] [-ls ] [-lsr ] [-du ]
[-dus ] [-mv ] [-cp ] [-rm [-skipTrash] ]
[-rmr [-skipTrash] ] [-put ... ] [-copyFromLocal ... ]
[-moveFromLocal ... ] [-get [-ignoreCrc] [-crc]
[-getmerge [addnl]] [-cat ]
[-copyToLocal [-ignoreCrc] [-crc] ] [-moveToLocal ]
[-mkdir ] [-report] [-setrep [-R] [-w] ]
[-touchz ] [-test -[ezd] ] [-stat [format] ]
[-tail [-f] ] [-text ]
[-chmod [-R] PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-chgrp [-R] GROUP PATH...]
[-count[-q] ]
[-help [cmd]]
从上面可以看出命令提供的功能还是挺强大的。包括了文件和对目录的各种操作。
举个例子:
要列出hadoop的根目录下面的文件,具体命令如下:
#hadoop fs -ls hdfs://192.168.0.112:50081/
drwx---r-x - test test 0 2013-03-08 11:20 /static
drwx---r-x - test test 0 2013-02-19 15:40 /system
drwxrwxrwx - test test 0 2013-01-22 18:42 /video
其他的命令功能就不一一介绍了,相信看帮组文档自己也可以看懂。
这样会有一个问题,每执行一个命令都会新生成一个jvm,对运行命令的机器造成很大的负担,在命令多的情况下,查看top可以看到java的进程会跑到99%,严重影响到的使用。于是有了下面的实现方法。
二,hadoop提供的web方式
在网上查看官方的客户端API,发现hadoop提供一个web REST API,既采用curl的方式可以轻松实现。官方文档连接为:http://hadoop.apache.org/docs/stable/webhdfs.html
上面对使用方式进行充分的说明。
curl的方式可以进行对hadoop中的文件和目录进行一些基本的操作。
目前官网上提供的有
1,创建并写入文件
2,追加文件
3,打开并读入文件
4,创建目录
5,重命名文件或者目录
6,删除文件或者目录
7,列出文件或者目录状态
8,列出目录列表
下面提供一些具体的使用例子:
a,列出目录的状态
#curl -i http://192.168.0.112:50071/webhdfs/v1/?op=GETFILESTATUS
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Server: Jetty(6.1.26)
{"FileStatus":{"accessTime":0,"blockSize":0,"group":"TEST","length":0,"modificationTime":1362812718704,"owner":"TEST","pathSuffix":"","permission":"705","replication":0,"type":"DIRECTORY"}} b,重命名目录
#curl -i -X PUT http://192.168.0.112:50071/webhdfs/v1/test?op=RENAME&destination=/test1
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
{"boolean":true}
其他的功能就不一一介绍了。具体的实现方式请看官方文档
三,由curl的方式想到的
因为我的程序是用python跑的,那么采用curl命令行的方式同样是调用底层命令,python的模块那么多,那么我如果使用python的curl库那不是可以轻松实现python对hadoop中文件和目录的操作。
在经过查资料后,写了一个基本的webhadoop的class,基本的功能大概完成了,其他的东西以后再加吧。
具体的代码如下:
- #!/usr/bin/env python
- # -*- encoding:utf-8 -*-
- """A library to access Hadoop HTTP REST API,
- make sure you hadoop cluster open the http access .
- """
- '''
- author : liran
- data : 2013-03-11
- 致谢:xwu
- 武汉云雅科技有限公司
- '''
- import StringIO
- import pycurl
- import re
- import sys
- import logging
- import os
- class WebHadoop(object):
- def __init__(self,host,port,username,logger,prefix="/webhdfs/v1"):
- self.host = host
- self.port = port
- self.user = username
- self.logger = logger
- self.prefix = prefix
- self.status = None
- self.url = "http://%s:%s" % (host,port)
- selfself.url_path = self.url + self.prefix
- def checklink(self):
- try:
- b = StringIO.StringIO()
- c = pycurl.Curl()
- checkurl = self.url + "/dfsnodelist.jsp?whatNodes=LIVE"
- c.setopt(pycurl.URL, checkurl)
- c.setopt(pycurl.HTTPHEADER, ["Accept:"])
- c.setopt(pycurl.WRITEFUNCTION, b.write)
- c.setopt(pycurl.FOLLOWLOCATION, 1)
- c.setopt(pycurl.MAXREDIRS, 5)
- c.perform()
- self.status = c.getinfo(c.HTTP_CODE)
- bbody = b.getvalue()
- self.Write_Debug_Log(self.status,checkurl)
- p = re.compile(r'''Live Datanodes :(.*)
|
|
|