设为首页 收藏本站
查看: 1531|回复: 0

[经验分享] pycurl实现hadoop的客户端功能

[复制链接]

尚未签到

发表于 2018-11-1 06:31:27 | 显示全部楼层 |阅读模式
  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 :(.*)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629081-1-1.html 上篇帖子: Hadoop周边生态软件和简要工作原理(一) 下篇帖子: hadoop上lzop的安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表