从pyspark工作人员访问HDFS / Hadoop api

时间:2015-03-09 19:10:18

标签: apache-spark hdfs pyspark

我需要从pyspark worker 中读取/扫描/写入hdfs文件。

请注意,以下api不适用,因为它们用于驱动程序

sc.textFile()
sc.saveAsParquetFile()

最好不要涉及其他第三方库(例如pyhadoop)。

一种选择是炮轰,例如。

 os.system('hdfs dfs -ls %(hdfsPath)s' %locals())

但是,有更多原生的pyspark方法来实现这一目标吗?

UPDATE 这不是广播数据的情况,因为每个工作人员都会从hdfs读取不同的数据。其中一个用例是在每个worker中读取一些大的二进制文件(这显然不是广播的情况)。另一种情况是读取包含指令的“命令”文件。我已经成功地在原生hadoop和scala spark中使用了这种模式。

2 个答案:

答案 0 :(得分:2)

解决方案似乎是子进程(没有直接的python访问)。将接受的答案和其中一条评论拼凑在一起:Python read file as stream from HDFS

cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE)
for line in iter(cat.stdout.readline, ''): 
    print line,   # include the comma

答案 1 :(得分:-1)

更多本机PySpark方法是使用sc.textFile()或其他读取方法读取驱动程序中的数据,并将其作为RDD或广播变量传递给工作者,如果它足够小以适应每个遗嘱执行人的记忆。

你能描述一下你的情况吗,我怀疑你真的需要阅读工人的文件

更新:

简短摘要:

  1. 直接从大型集群上的工作人员读取文件集可能会导致名称节点
  2. 在大多数情况下,直接从工人那里读取单独的文件并不是必需的。您可以通过通配符textFile()方法的文件集,或使用wholeTextFiles()binaryFiles()方法读取文件集及其名称
  3. 在具有千兆字节图像的图像处理的特定情况下,只需将它们放入序列文件并使用sequenceFile()方法读取
  4. 可以通过直接查询WebHDFS REST API来实现直接从HSFS使用Python直接读取而无需额外的库,这是一种过度杀伤,因为这正是库实现的。另一种选择可能是使用pipe() Spark方法调用Java程序读取HDFS文件并将它们以序列化形式返回到stdout。另一种选择是通过转义到shell将文件从HDFS复制到临时空间,然后使用标准读取文件功能读取此文件。就个人而言,我会解雇我的开发人员实施我在此提出的任何方法