from subprocess import Popen, PIPE
process = Popen('hdfs dfs -cat filename.dat',shell=True,stdout=PIPE, stderr=PIPE)
std_out, std_err = process.communicate()
check for returncode, std_err
if:
everything is OK, do whatever with stdout
else:
do something in else condition
据我所知,目前还没有现成的解决方案,我找到的大多数答案都是通过调用 hdfs 命令。我在linux上运行,也面临同样的挑战。我找到了 sh 包是有用的。这将为您处理运行o/s命令和管理stdin/out/err。 更多信息请参见此处:https://amoffat.github.io/sh/ 不是最整洁的解决方案,但它是一行(ish)和使用标准包。 下面是我的代码截取一个hdfs目录列表。它将列出相似的文件和文件夹,因此如果需要区分它们,您可能需要修改它们。
import sh
hdfsdir = '/somedirectory'
filelist = [ line.rsplit(None,1)[-1] for line in sh.hdfs('dfs','-ls',hdfsdir).split('\n') if len(line.rsplit(None,1))][1:]
5条答案
按热度按时间g52tjvyc1#
我的电脑上需要有什么?
您需要安装并运行hadoop,当然还需要python。
如何在hdfs上查询文件名?
你可以试试这个。我还没有测试过代码,所以不要依赖它。
您还可以看看pydoop,它是一个用于hadoop的pythonapi。
尽管我的例子包括
shell=true
,您可以尝试在没有它的情况下运行,因为它存在安全风险。为什么你不应该使用shell=True
?wi3ka0sx2#
据我所知,目前还没有现成的解决方案,我找到的大多数答案都是通过调用
hdfs
命令。我在linux上运行,也面临同样的挑战。我找到了sh
包是有用的。这将为您处理运行o/s命令和管理stdin/out/err。更多信息请参见此处:https://amoffat.github.io/sh/
不是最整洁的解决方案,但它是一行(ish)和使用标准包。
下面是我的代码截取一个hdfs目录列表。它将列出相似的文件和文件夹,因此如果需要区分它们,您可能需要修改它们。
我的输出-在本例中,这些都是目录:
我们来分解一下:
运行
hdfs dfs -ls /somedirectory
命令我们可以使用sh
Package 如下:Found 366 items
drwxrwx---+ - impala hive 0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-01
drwxrwx---+ - impala hive 0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-02
drwxrwx---+ - impala hive 0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-03
drwxrwx---+ - impala hive 0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-04
drwxrwx---+ - impala hive 0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-05
vulvrdjw3#
正如jgc所说的,您可以做的最简单的事情就是从登录(via)开始
ssh
)其中一个节点(参与hadoop群集的服务器)并验证您是否具有正确的访问控制和权限:使用hdfs客户机列出您的主目录。
hdfs dfs -ls
列出生活在hdfs中的感兴趣的目录。hdfs dfs -ls <absolute or relative path to HDFS directory>
然后,在python中,应该使用子流程和hdfs客户机来访问感兴趣的路径,并使用-C
标记以排除不必要的元数据(以避免以后进行丑陋的后处理)。即。
Popen(['hdfs', 'dfs', '-ls', '-C', dirname])
之后,在新行上拆分输出,然后您将得到路径列表。下面是一个示例以及日志记录和错误处理(包括当目录/文件不存在时):
pgky5nke4#
对于仅使用Python3的原始子进程库的“在hdfs上查询文件名”:
xqk2d5yq5#
您应该具有群集中某个节点的登录权限。让集群管理员选择节点并设置帐户,并通知您如何安全地访问节点。如果您是管理员,请告诉我群集是本地的还是远程的,如果是远程的,那么它是托管在您的计算机上、公司内部还是第三方云上,如果是谁的,那么我可以提供更多相关信息。
要在hdfs中查询文件名,请登录到集群节点并运行
hadoop fs -ls [path]
. 路径是可选的,如果未提供,则会列出主目录中的文件。如果-R
作为选项提供,然后递归列出路径中的所有文件。此命令还有其他选项。有关此命令和其他hadoop文件系统shell命令的更多信息,请参见http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/filesystemshell.html.在python中查询hdfs文件名的一种简单方法是
esutil.hdfs.ls(hdfs_url='', recurse=False, full=False)
,执行hadoop fs -ls hdfs_url
在子进程中,它还具有许多其他hadoop文件系统shell命令的函数(请参阅http://code.google.com/p/esutil/source/browse/trunk/esutil/hdfs.py). esutil可以与一起安装pip install esutil
. 在pypi上https://pypi.python.org/pypi/esutil,文档位于http://code.google.com/p/esutil/ 它的github站点是https://github.com/esheldon/esutil.