我编写了一个pyspark脚本来遍历蜂巢数据库中的表并对它们做一些事情(不能确切地说出每个公司的政策),例如:
hc = HiveContext(sc)
for table in tables:
df = hc.sql("select * from {}".format(table))
df.do_something()
df.unpersist()
它工作正常,直到我得到几张桌子,然后我收到一个错误:
ERROR DiskBlockObjectWriter:...
java.io.FileNotFoundException ... (Too many open files)
这是因为在shuffle之前spark创建了所有中间文件。
我认为我可以通过在使用它并进入下一个循环之后立即取消数据框(df.unpersist()
)来避免这种情况,但这似乎没有帮助。
有没有办法可以在使用后和下一个循环之前关闭所有打开的文件?一旦我完成每个循环,我就不再使用该df了。我确信特定的表没有问题,它失败了,因为只要我还没有打开过多的其他表,我就可以把这个特定的表读成DF就好了。