[spark] 序列化错误 object not serializable

java.io.NotSerializableException: DmpLogEntry
Serialization stack:
- object not serializable (class: dmp.entry.DmpLogEntry, value: dmp.entry.DmpLogEntry@6cfc5a6a)
at org.apache.spark.serializer.SerializationDebugger$.improveException(SerializationDebugger.scala:40)
at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:47)
at org.apache.spark.serializer.SerializationStream.writeValue(Serializer.scala:147)
at org.apache.spark.storage.DiskBlockObjectWriter.write(DiskBlockObjectWriter.scala:181)
at org.apache.spark.util.collection.WritablePartitionedPairCollection$$anon$1.writeNext(WritablePartitionedPairCollection.scala:55)
at org.apache.spark.util.collection.ExternalSorter.spill(ExternalSorter.scala:300)
at org.apache.spark.util.collection.ExternalSorter.spill(ExternalSorter.scala:90)
at org.apache.spark.util.collection.Spillable$class.maybeSpill(Spillable.scala:83)
at org.apache.spark.util.collection.ExternalSorter.maybeSpill(ExternalSorter.scala:90)
at org.apache.spark.util.collection.ExternalSorter.maybeSpillCollection(ExternalSorter.scala:244)
at org.apache.spark.util.collection.ExternalSorter.insertAll(ExternalSorter.scala:221)
at org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:73)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41)
at org.apache.spark.scheduler.Task.run(Task.scala:88)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

在spark 1.4  jobserver 0.5 环境执行的时候,程序并没有出错.

在spark1.5 jobserver0.6 环境执行的时候出了上面的错误

 

所以肯定跟环境是有关系的.在spark-defaults.conf中设置serializer 为 org.apache.spark.serializer.KryoSerializer 就好了

spark.serializer                 org.apache.spark.serializer.KryoSerializer

 

转载于:https://www.cnblogs.com/pingjie/p/5333178.html

<think>嗯,用户遇到了一个函数执行失败的问题,具体报错是"Args对象无法JSON序列化"。从用户描述看,这显然是个Python环境下的序列化异常。用户可能正在开发涉及跨进程通信或分布式计算的应用,因为这类场景常需要对象序列化。用户提供的四个引用中,[1]提到Promise的unhandledRejection处理,虽然属于错误处理范畴,但和序列化关系不大。[2]讲的Spark广播变量强调对象需满足Serializable接口,这点很关键——说明分布式框架对可序列化有强制要求。[3][4]的MapReduce输出格式和Docker操作应该不是当前重点。深入思考问题本质:当出现"notJSONserializable"时,意味着用户试图用json.dumps()序列化包含Args对象的复杂结构,而Args可能嵌套了datetime、lambda等JSON不支持的类型。用户可能需要同时解决两个层面问题:定位具体不可序列化的成员,以及选择合适的替代方案。想到几个排查方向:首先让用户检查Args对象属性,特别是自定义类的实例;其次建议用default参数处理特殊类型;最后考虑到用户提到的"Function"可能是分布式任务,还得确认是否混用了pickle和JSON序列化。不过用户没说明具体使用场景,可能需要后续追问。补充的替代方案要兼顾实用性和学习成本:pickle虽然方便但有安全风险;结构体平坦化适合简单场景;PyArrow在跨语言场景更优。用户若是临时调试,可能更适合快速修复方案;若是生产环境,就需要设计可持续的序列化策略。最后生成的问题都围绕序列化场景延伸:云函数适配能帮助使用Serverless的用户,自定义编码器则是进阶需求,跨语言方案瞄准技术选型阶段。这样覆盖了不同阶段的用户需求。</think> 问题分析与解决方案: ### 原因定位 `Args object not JSON serializable` 错误表明您尝试序列化的对象包含非基本类型数据。Python内置的`json`模块仅支持基础类型(如str/int/list/dict等)和包含`__dict__`的自定义对象。若对象包含以下元素即会报错: 1. 非字符串的键名(如元组) 2. 特殊数据类型(如datetime/Numpy数组) 3. 未实现`__dict__`的自定义类实例 4. 循环引用的数据结构 ### 解决方案 #### 方法1:自定义JSON编码器(推荐) ```python import json from datetime import datetime class CustomEncoder(json.JSONEncoder): def default(self, obj): # 处理datetime类型 if isinstance(obj, datetime): return obj.isoformat() # 处理自定义类 elif hasattr(obj, '__dict__'): return obj.__dict__ # 处理Numpy等特殊类型 elif hasattr(obj, 'tolist'): return obj.tolist() return super().default(obj) # 使用示例 args = YourComplexObject() serialized_args = json.dumps(args, cls=CustomEncoder) # 成功序列化 ``` #### 方法2:转换非标准数据类型 ```python def convert_arg(arg): if isinstance(arg, tuple): return list(arg) # 元组转列表 elif isinstance(arg, np.ndarray): return arg.tolist() # Numpy转列表 return arg args = {k: convert_arg(v) for k, v in args.items()} # 遍历处理值 ``` #### 方法3:利用`__dict__`提取数据 ```python # 若Args是自定义类实例 if hasattr(args, '__dict__'): serializable_args = vars(args) # 提取为字典 json_data = json.dumps(serializable_args) ``` ### 分布式场景特别处理 在分布式框架中(如Spark[^2]): 1. **广播变量处理**:确保被广播对象实现`Serializable`接口 2. **跨进程通信**:使用支持复杂类型的序列化工具(如PyArrow或cloudpickle) ### 错误预防实践 ```python import json def safe_serialize(obj): try: return json.dumps(obj) except TypeError: # 失败时启动诊断 problem_items = [] for k, v in obj.items(): try: json.dumps(v) except TypeError: problem_items.append(k) return f"序列化失败: {problem_items} 包含非法类型" ``` ### 最佳实践建议 1. **分布式框架场景**:优先使用框架内置序列化器(如Spark的`cloudpickle`) 2. **API传输场景**:预先将数据转换为`dict`类型 3. **复杂对象场景**:使用`pickle`替代JSON(注意安全风险) 4. **频繁传输场景**:采用Protocol Buffers或Apache Avro
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值