2016-04-02 25 views
0

我有一个运行在centos 6.5上的hadoop集群。我目前使用Python 2.6。由于不相关的原因,我无法升级到Python 2.7。由于这个不幸的事实,我不能安装pydoop。在hadoop集群中,我有大量的原始数据文件,名为raw“yearmonthdaytimehour”.txt括号中的所有内容都是数字。 有没有办法在python中制作hadoop目录下的所有文件列表?所以程序会创建一个类似的列表。在没有pydoop的情况下列出HDFS中的所有文件

listoffiles=['raw160317220001.txt', 'raw160317230001.txt', ....] 

它将使一切我需要做很多更容易,因为摆脱每天2小时15文件,我将只需要调用dothing(listoffiles [39])。为什么我必须这样做呢,有一些无关的复杂因素。

我知道有一种方法可以很容易地使用本地目录来完成这项工作,但hadoop使得一切都变得更加复杂。

+0

所以你要求一种方法来在Python中列出没有pydoop的HDFS文件? – kichik

+0

只需通过shell进程运行'hadoop fs -ls'命令(假设你已经安装了Hadoop二进制文件) –

+0

im问如何创建一个包含所有hdfs文件名称的数组。 – Sam

回答

1

如果pydoop不起作用,您可以尝试使用Python 2.6的Snakebite库。另一种选择是启用WebHDFS API并直接使用requests或类似的东西。

print requests.get("http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=LISTSTATUS").json() 

随着毒蛇咬伤:

from snakebite.client import Client 
client = Client("localhost", 8020, use_trash=False) 
for x in client.ls(['/']): 
    print x 
+0

我将如何使用蛇咬伤呢?我有这个安装。 – Sam

+0

我更新了答案以包含[示例](http://snakebite.readthedocs.org/en/latest/client.html?highlight=list)。 – kichik

+0

本地主机被定义为在core-site.xml中发现的内容?或者只是字符串“localhost”?我得到一个错误“没有模块命名客户端”与小写字母c – Sam

0

我建议检查出hdfs3

>>> from hdfs3 import HDFileSystem 
>>> hdfs = HDFileSystem(host='localhost', port=8020) 
>>> hdfs.ls('/user/data') 
>>> hdfs.put('local-file.txt', '/user/data/remote-file.txt') 
>>> hdfs.cp('/user/data/file.txt', '/user2/data') 

Snakebite,通信hdfs3使用protobufs和绕过JVM。不同于Snakebite,hdfs3提供kerberos支持

1

我会推荐这个Python项目:https://github.com/mtth/hdfs 它使用HttpFS,它实际上非常简单和快速。我一直在使用Kerberos的集群上使用它,并且像魅力一样工作。您只需要设置namenode或HttpFs服务URL。

相关问题