【问题标题】:Can't access directory from HDFS inside a Python script无法从 Python 脚本中的 HDFS 访问目录
【发布时间】:2019-06-03 07:14:52
【问题描述】:

我有以下 python 脚本(我设法在本地运行它):

#!/usr/bin/env python3

import folderstats

df = folderstats.folderstats('hdfs://quickstart.cloudera.8020/user/cloudera/files', hash_name='md5', ignore_hidden=True)

df.to_csv(r'hdfs://quickstart.cloudera.8020/user/cloudera/files.csv', sep=',', index=True)

我在该位置有目录:“文件”。我通过命令行甚至使用 HUE 检查了它,它就在那里。

(myproject) [cloudera@quickstart ~]$ hadoop fs -ls /user/cloudera
Found 1 items
drwxrwxrwx   - cloudera cloudera          0 2019-06-01 13:30 /user/cloudera/files

问题是目录无法访问。

我尝试在我的本地终端上运行它:python3 script.py,甚至使用超级用户:sudo -u hdfs python3 script.py 并且输出显示:

Traceback (most recent call last):
  File "script.py", line 5, in <module>
    df = folderstats.folderstats('hdfs://quickstart.cloudera:8020/user/cloudera/files', hash_name='md5', ignore_hidden=True)
  File "/home/cloudera/miniconda3/envs/myproject/lib/python3.7/site-packages/folderstats/__init__.py", line 88, in folderstats
    verbose=verbose)
  File "/home/cloudera/miniconda3/envs/myproject/lib/python3.7/site-packages/folderstats/__init__.py", line 32, in _recursive_folderstats
    for f in os.listdir(folderpath):
FileNotFoundError: [Errno 2] No such file or directory: 'hdfs://quickstart.cloudera:8020/user/cloudera/files'

你能帮我澄清一下这个问题吗?

谢谢!

【问题讨论】:

  • 如果您想使用 Python、Pyspark 或 PyArrow(使用 Pandas)在 HDFS 上处理 CSV,我知道的唯一选择是
  • 感谢您的回答。我基本上尝试从我的 python 脚本“扫描”位于 HDFS 中的目录中的所有文件。我不知道如何访问这个目录。
  • HDFS 不是您的传统文件系统。所有请求都必须通过名称节点汇集。 WebHdfs 有一个可能有用的 LIST 操作,但您必须以某种方式知道哪些返回的条目是目录与文件
  • 我已经尝试过 pyhdfs(pypi.org/project/pywebhdfs) 但没有成功。如果我想从 HDFS 写入/读取例如 .txt 文件,它会起作用。 Java 看起来是目前最快的选择。
  • Webhdfs 需要先开启,然后,你试过list_dir 功能吗? pythonhosted.org/pywebhdfs/…

标签: python hadoop hdfs cloudera


【解决方案1】:

Python 在具有本地 linux(或 windows)文件系统 (FS) 的单台机器上运行。

Hadoop 的 HDFS 项目是跨多台机器(节点)的分布式文件系统设置。

可能有一些自定义类可以在单台机器上读取 HDFS 数据,但我不知道有什么,它违背了分布式计算的目的。

您可以通过 Python 所在的 hadoop fs -get hdfs://quickstart.cloudera:8020/user/cloudera/files /home/user/&lt;target_directory_name&gt; 将数据从 HDFS 复制(源 HDFS 位置 => 目标本地 FS 位置)到本地文件系统,或者使用类似的东西Spark、Hive 或 Impala 来处理/查询数据。

如果数据量很小,那么将文件从 HDFS 复制到本地 FS 以执行 python 脚本对于 Cloudera Quickstart VM 之类的东西应该是有效的。

【讨论】:

  • 感谢您的回答!不幸的是,我希望该 HDFS 目录中有大量文件。因此,将内容从 HDFS 复制到本地并应用脚本将效率不高。我想我会尝试使用 Java。它似乎为此类任务提供了更好的支持。
  • @TheRichUncle - 看看下面的链接是否可以解决您的问题。 stackoverflow.com/questions/12485718/…
  • 你有多少数据?您是否有理由不能使用 spark、hive、impala、kafka 等 hadoop 服务之一?
猜你喜欢
  • 2012-05-14
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多