背景
在基于hadoop 集群的spark2环境中,使用python编写任务。groupByKeys后,对value进行处理的时候,处理函数fun需要一个参数。传入后,使用spark2-submit提交后,出现如题的错误。
input:
rdd = ...\
.groupByKey(...)\
.mapValues(lambda grouped: func(grouped, rule_dict)\
...
处理
- 首先按照出错,安装bson,问题依旧;
- 多次调试后,发现和传入rule_dict有关系。因为一般编写的lambda方法只有当前行作为参数,推断是否和推入额外参数有关;
- 一顿搜索猛如虎,查到一种:
filterVar = sc.broadcast(filter_option)
rdd.map(lambda x: func(x, filterVar.value)
但仍然报错(其实这是一种共享参数,减少每次传参到集群计算)
- 最终回到报错上,看是int64,再看传入参数实际内容时,发现dict的key都是int,而且比较大(用户id),尝试改成string,解决。
总结
暂时使用string来规避这个问题,个人认为由于任务在集群执行,集群的python环境可能对bson缺乏支持。
网友评论