我试图在调用collect()后保存rdd。我在host-1上调用spark submit(我假设驱动程序是从中调用spark submit脚本的主机,因此在本例中,host-1是驱动程序),从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总是在驱动程序主机上收集分布式数据集,因此文件也应该在驱动程序上创建。我错在哪里?
1条答案
按热度按时间icnyk63a1#
我假设驱动程序是从中调用spark submit脚本的主机,因此在本例中,host-1是驱动程序
这是不对的!请参阅有关在Yarn上运行spark的文档。
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.
您很可能在yarn cluster模式下运行spark,并且驱动程序被选择在集群中的一个节点上。将此更改为“Yarn客户端”,驱动程序将在提交作业的节点上运行。