【问题标题】:Listing HDFS directory on a remote machine using python使用 python 在远程机器上列出 HDFS 目录
【发布时间】:2017-04-28 05:37:24
【问题描述】:

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

为此,我需要在远程机器上执行一个hadoop命令hadoop fs -ls /var/log/*20161202*

在 google 上进行了长时间的搜索后,我无法选择一个 pyspark 界面来获取文件列表。 pyspark 好像没有提供这样的接口。

我看到一个 SO 回答说我需要使用 hdfscli 并将其导入我的 python 脚本中。这也是唯一的方法吗?我不敢相信 Spark 没有 hdfs 文件列表方法。

【问题讨论】:

标签: python hadoop hdfs pyspark


【解决方案1】:

不清楚您所说的“远程”机器是什么意思。如果您的意思是直接连接到集群(即一部分)的机器,我的另一个答案是成立的;如果您的意思是一台不属于集群的机器,那么正如@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>

【讨论】:

    【解决方案2】:

    您不需要 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

    【讨论】:

    • 哦..但是执行hadoop命令的机器不是本地计算机。那是远程的。
    • @choiapril 如果您的机器是 Hadoop 集群的一部分,HDFS 文件系统对整个集群来说是通用的,并且可以从其中的每台机器访问(它不是“本地”的)。如果没有,我看不到问题的上下文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2019-04-13
    • 2012-06-20
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    相关资源
    最近更新 更多