我试图在调用collect()之后保存RDD。我在Host-1上调用spark-submit(我假设Driver是我调用spark-submit脚本的主机,所以在这种情况下Host-1是Driver),从HBase获取一些数据,对它运行一些操作然后在RDD上调用collect()并迭代收集的列表并将其保存到本地文件系统文件。实质上:
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总是收集Driver主机上的分布式数据集,因此该文件也应该在Driver上创建。 我哪里错了?
答案 0 :(得分:3)
我假设驱动程序是我调用spark-submit脚本的主机,所以在这种情况下Host-1是驱动程序
这不正确!请参阅running spark on yarn上的文档。
In yarn-cluster mode, the Spark driver runs inside an application master process which is managed by YARN on the cluster, and the client can go away after initiating the application. In yarn-client mode, the driver runs in the client process, and the application master is only used for requesting resources from YARN.
您可能在纱线群集模式下运行spark,并且选择驱动程序位于群集中的一个节点上。
将其更改为yarn-client,驱动程序将在您提交作业的节点上运行。