Python 无法将收集的RDD保存到驱动程序的本地文件系统
在对RDD调用collect()后,我试图保存它。我在主机1上调用spark submit(我假设驱动程序就是从中调用spark submit脚本的主机,所以在本例中,主机1就是驱动程序),从HBase获取一些数据,对其运行一些操作,然后在RDD上调用collect(),迭代收集的列表并将其保存到本地文件系统文件。实质上:Python 无法将收集的RDD保存到驱动程序的本地文件系统,python,hadoop,apache-spark,hbase,pyspark,Python,Hadoop,Apache Spark,Hbase,Pyspark,在对RDD调用collect()后,我试图保存它。我在主机1上调用spark submit(我假设驱动程序就是从中调用spark submit脚本的主机,所以在本例中,主机1就是驱动程序),从HBase获取一些数据,对其运行一些操作,然后在RDD上调用collect(),迭代收集的列表并将其保存到本地文件系统文件。实质上: if __name__ == "__main__": sc = SparkContext(appName="HBaseInputFormat") # read
if __name__ == "__main__":
sc = SparkContext(appName="HBaseInputFormat")
# read the data from hbase
# ...
# ...
output = new_rdd.collect()
with open("/var/tmp/tmpfile.csv", 'w') as tmpf:
for o in output:
print (o)
tmpf.write("%s\n"%str(o))
tmpf.close()
这实际上适用于保存在/var/tmp/tmpfile.csv中的数据,但数据保存在与驱动程序不同的主机上,比如主机3。
我的印象是collect总是在驱动程序主机上收集分布式数据集,因此文件也应该在驱动程序上创建。
我错在哪里
我假设驱动程序是从中调用spark submit脚本的主机,因此在本例中,主机1是驱动程序
这是不对的!请参阅上的文档
在纱线集群模式下,Spark驱动程序在应用程序主进程内运行,该主进程由集群上的纱线管理,客户端可以在启动应用程序后离开。在Thread客户端模式下,驱动程序在客户端进程中运行,而应用程序主机仅用于向Thread请求资源。
您可能正在纱线簇模式下运行spark,并且驱动程序被选择在簇内的一个节点上
将此更改为Thread client,驱动程序将在提交作业的节点上运行