使用python在远程计算机上列出HDFS目录

时间:2016-12-13 08:15:52

标签: python hadoop hdfs pyspark

我正在使用python进行日志挖掘工作。在mapreduce之前,程序应该知道远程机器上的hdfs中有哪些文件来创建日志挖掘对象文件列表。

要做到这一点,首先,我需要执行一个hadoop命令,即 例如,hadoop fs -ls /var/log/*20161202*在远程计算机上。

经过长时间的谷歌搜索后,我没有选择一个pyspark界面来获取文件列表。看来他们pyspark不提供这样的界面。

我看到一个stackoverflow回答说我需要使用hdfscli并在我的python脚本中导入它。你认为这也是唯一的方法吗?我不敢相信Spark没有hdfs文件列表方法。任何评论都会对我有所帮助。感谢

2 个答案:

答案 0 :(得分:3)

目前尚不清楚你的意思是"远程"机。如果你的意思是直接连接到群集(即部分群集)的机器,我的另一个答案成立;如果您指的是不属于群集的计算机,则@jedijs建议的答案是使用pywebhdfs(只需按pip install pywebhdfs安装):

from pywebhdfs.webhdfs import PyWebHdfsClient
from pprint import pprint

hdfs = PyWebHdfsClient(host='192.10.10.73',port='50070', user_name='ctsats')  # your Namenode IP & username here
my_dir = 'user/ctsats'
pprint(hdfs.list_dir(my_dir))

结果是一个(相当长的)Python字典(未显示) - 尝试一点以获得感觉。您可以解析它以获取名称和类型(文件/目录),如下所示:

data = hdfs.list_dir(my_dir)
pprint([[x["pathSuffix"], x["type"]] for x in data["FileStatuses"]["FileStatus"]])
# [[u'.Trash', u'DIRECTORY'],
#  [u'.sparkStaging', u'DIRECTORY'],
#  [u'checkpoint', u'DIRECTORY'],
#  [u'datathon', u'DIRECTORY'],
#  [u'ms-spark', u'DIRECTORY'],
#  [u'projects', u'DIRECTORY'],
#  [u'recsys', u'DIRECTORY'],
#  [u'sparklyr', u'DIRECTORY'],
#  [u'test.data', u'FILE'],
#  [u'word2vec', u'DIRECTORY']]

为了比较,这里是同一目录的实际列表:

[ctsats@dev-hd-01 ~]$ hadoop fs -ls
Found 10 items
drwx------   - ctsats supergroup          0 2016-06-08 13:31 .Trash
drwxr-xr-x   - ctsats supergroup          0 2016-12-15 20:18 .sparkStaging
drwxr-xr-x   - ctsats supergroup          0 2016-06-23 13:23 checkpoint
drwxr-xr-x   - ctsats supergroup          0 2016-02-03 15:40 datathon
drwxr-xr-x   - ctsats supergroup          0 2016-04-25 10:56 ms-spark
drwxr-xr-x   - ctsats supergroup          0 2016-06-30 15:51 projects
drwxr-xr-x   - ctsats supergroup          0 2016-04-14 18:55 recsys
drwxr-xr-x   - ctsats supergroup          0 2016-11-07 12:46 sparklyr
-rw-r--r--   3 ctsats supergroup         90 2016-02-03 16:55 test.data
drwxr-xr-x   - ctsats supergroup          0 2016-12-15 20:18 word2vec

必须启用Hadoop群集中的WebHDFS服务,即您的hdfs-site.xml文件必须包含以下条目:

<property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
</property>

答案 1 :(得分:0)

您不需要pyspark细节 - 调用系统命令的标准Python方法应该可以解决这个问题:

>>> import os
>>> os.system("hadoop fs -ls")
Found 11 items
drwxr-xr-x   - oracle oracle          0 2016-12-02 07:25 .Trash
drwxr-xr-x   - oracle oracle          0 2016-11-18 06:48 .sparkStaging
drwx------   - oracle oracle          0 2016-12-06 11:10 .staging
drwxr-xr-x   - oracle oracle          0 2016-12-06 10:45 datathon
drwxr-xr-x   - hdfs   oracle          0 2016-10-24 16:16 indexMetadata
drwxr-xr-x   - hdfs   oracle          0 2016-10-24 16:14 jobRegistry
drwxr-xr-x   - oracle oracle          0 2016-10-04 19:29 mediademo
drwxr-xr-x   - oracle oracle          0 2016-10-04 19:30 moviedemo
drwxr-xr-x   - oracle oracle          0 2016-10-04 19:30 moviework
drwxr-xr-x   - oracle oracle          0 2016-10-04 19:30 oggdemo
drwxr-xr-x   - oracle oracle          0 2016-10-04 19:30 oozie-oozi
0
>>> os.system("hadoop fs -ls datathon")
Found 1 items
-rw-r--r--   3 oracle oracle    2810687 2016-12-06 10:44 datathon/2013_09_01.log
0

您可以看到更多选项和示例here