我需要从pyspark worker 中读取/扫描/写入hdfs文件。
请注意,以下api不适用,因为它们用于驱动程序:
sc.textFile()
sc.saveAsParquetFile()
等
最好不要涉及其他第三方库(例如pyhadoop)。
一种选择是炮轰,例如。
os.system('hdfs dfs -ls %(hdfsPath)s' %locals())
但是,有更多原生的pyspark方法来实现这一目标吗?
UPDATE 这不是广播数据的情况,因为每个工作人员都会从hdfs读取不同的数据。其中一个用例是在每个worker中读取一些大的二进制文件(这显然不是广播的情况)。另一种情况是读取包含指令的“命令”文件。我已经成功地在原生hadoop和scala spark中使用了这种模式。
答案 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或广播变量传递给工作者,如果它足够小以适应每个遗嘱执行人的记忆。
你能描述一下你的情况吗,我怀疑你真的需要阅读工人的文件
更新:
简短摘要:
textFile()
方法的文件集,或使用wholeTextFiles()
或binaryFiles()
方法读取文件集及其名称sequenceFile()
方法读取pipe()
Spark方法调用Java程序读取HDFS文件并将它们以序列化形式返回到stdout。另一种选择是通过转义到shell将文件从HDFS复制到临时空间,然后使用标准读取文件功能读取此文件。就个人而言,我会解雇我的开发人员实施我在此提出的任何方法