binghai03 发表于 2018-11-1 06:31:27

pycurl实现hadoop的客户端功能

  pycurl实现hadoop的客户端功能
  目前在测试一个hadoop的功能,需要频繁的和hadoop打交道。刚开始采用的python的subprocess模块来调用底层的hadoop提供的命令行工具实现的。
  一,hadoop提供的命令行格式说明:
  hadoop fs 具体的命令有:
  hadoop fs [-fs ] [-conf ]
  [-D ] [-ls ] [-lsr ] [-du ]
  [-dus ] [-mv] [-cp] [-rm [-skipTrash] ]
  [-rmr [-skipTrash] ] [-put... ] [-copyFromLocal... ]
  [-moveFromLocal... ] [-get [-ignoreCrc] [-crc]
  [-getmerge   ] [-cat ]
  [-copyToLocal [-ignoreCrc] [-crc]] [-moveToLocal]
  [-mkdir ] [-report] [-setrep [-R] [-w]]
  [-touchz ] [-test - ] [-stat ]
  [-tail [-f] ] [-text ]
  [-chmod [-R]PATH...]
  [-chown [-R] [:] PATH...]
  [-chgrp [-R] GROUP PATH...]
  [-count[-q] ]
  [-help ]

从上面可以看出命令提供的功能还是挺强大的。包括了文件和对目录的各种操作。
举个例子:
要列出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 :(.*)
页: [1]
查看完整版本: pycurl实现hadoop的客户端功能