Spark尝试序列化连接对象,以便可以在执行程序中使用,这肯定会失败,因为反序列化的db连接对象无法将读取/写入权限授予其他作用域(甚至计算机)。通过尝试广播连接对象可以重现该问题。对于这种情况,在序列化I
/ O对象时存在问题。
通过连接到map函数内部的数据库,部分解决了该问题。由于map函数中每个RDD元素的连接过多,因此我不得不切换到分区处理以将db连接从20k减少到大约8-64(基于分区的数量)。Spark开发人员应考虑为执行程序创建初始化函数/脚本,以避免出现此类死胡同问题。
假设我让每个节点都执行了此init函数,然后每个节点都将连接到数据库(某些conn池或单独的zookeeper节点),因为init函数和map函数将共享相同的作用域,然后出现问题不见了,所以您编写的代码比我发现的解决方法快。在执行结束时,spark将释放/卸载这些定义的变量,程序将结束。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)