`

对象反序列化readFields时报Error: java.lang.NullPointerException

 
阅读更多

场景:在使用自定义对象序列化时,报错:

<2015-09-29 14:59:15,578> <INFO > <org.apache.hadoop.mapreduce.Job> - Task Id : attempt_1441852661551_0672_r_000002_2, Status : FAILED(Job.java:printTaskEvents:1462)

Error: java.lang.NullPointerException

at com.wbkit.cobub.models.UserActionDay.readFields(UserActionDay.java:86)

at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java:71)

at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java:42)

at org.apache.hadoop.mapreduce.task.ReduceContextImpl.nextKeyValue(ReduceContextImpl.java:146)

at org.apache.hadoop.mapreduce.task.ReduceContextImpl.nextKey(ReduceContextImpl.java:121)

at org.apache.hadoop.mapreduce.lib.reduce.WrappedReducer$Context.nextKey(WrappedReducer.java:307)

at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:170)

at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:627)

at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:389)

at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAs(Subject.java:415)

at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671)

at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)

 

自定义对象序列化应用分析:

所有的Writable实现都必须有一个默认的构造函数,以便MapReduce框架可以对它们进行实例化,然后再调用readFields()函数查看(填充)各个字段的值。

 

解决办法:

在自定义序列化对象中,即使在默认构造中也对对象的成员变量进行初始化。

 

参考:

详细请参见 Hadoop权威指南(第三版) 4.3.3小节;

 

 

分享到:
评论

相关推荐

    对象流(序列化)

    - 网络传输:在网络应用中,可以将对象序列化为字节流,然后通过网络发送,接收端再进行反序列化。 - RMI(远程方法调用):序列化是RMI实现的基础,因为需要将对象从一个JVM传递到另一个JVM。 8. **序列化安全...

    Java对象序列化标准最新版

    ### Java对象序列化标准知识点详解 #### 一、系统架构概览 **1.1 概览** Java 对象序列化是一种将Java对象的状态转换成字节流的过程,以便于在网络上传输或存储到磁盘上。Java序列化标准定义了一套规则来描述如何...

    几种序列化的实现方法 java自带, Writable, Avro

    当对象实例需要序列化时,Java会调用`writeObject()`和`readObject()`方法来处理对象的状态。这个过程是自动的,开发者只需要在类定义上添加`implements Serializable`即可。然而,这种方式有几个缺点: - 安全性...

    16_尚硅谷大数据之MapReduce_Hadoop序列化1

    序列化是将内存中的对象转化为可存储或可传输的数据格式的过程,而反序列化则是相反的操作,将这些数据恢复为原来的对象。在Hadoop中,序列化主要用于持久化数据和在网络中高效地传输数据。Java自带的序列化框架虽然...

    java-Hadoop序列化

    在Java编程语言中,序列化是一个关键的概念,它允许我们将对象的状态转换成字节流,以便于存储或在网络上传输。这使得数据能够在不同的时间点恢复,并在不同的系统之间进行交换。Java提供了一个标准的接口`java.io....

    Hadoop平台技术 序列化操作案例.docx

    此外,还需要实现`write()`和`readFields()`方法,分别用于序列化和反序列化`FlowBean`对象,以及重写`toString()`方法,方便输出结果。 2. 编写Mapper类: 在`com.dh.mapreduce.writable`包下创建`FlowMapper`类...

    【Hadoop篇09】Hadoop序列化1

    } //4 读反序列化方法 @Override public void readFields(DataInput in) throws IOException { this.upFlow = in.readLong(); this.downFlow = in.readLong(); this.sumFlow = in.readLong(); } //5 重写toString...

    javacsv_CsvReader:解析CSV文件

    在Java编程环境中,CSV(Comma Separated Values)文件是一种常见的数据存储格式,用于存储表格数据,如电子表格或数据库。CSV文件以纯文本形式存储,每一行代表一个记录,记录间的字段通过逗号分隔。`javacsv`库是...

    sqoop的原理及概念

    6. 读取以上 2)写入的范围 DataDrivenDBInputFormat.readFields(DataInput input)。 7. 创建 RecordReader 从数据库中读取数据。 8. 创建 MAP,MapTextImportMapper.setup(Context context)。 9. RecordReader 一行...

    Hadoop源代码分析(三)

    在反序列化时,接收端可以根据接收到的类名信息创建相应的对象实例,然后调用`readFields()`进行反序列化。 为了确保`ObjectWritable`能够正确地创建各种`Writable`子类的实例,Hadoop使用了`WritableFactories`。...

    18Nov_Serialization.docx

    在大数据处理领域,序列化和反序列化是至关重要的技术,特别是在Hadoop生态系统中。Hadoop的序列化机制主要用于在节点之间进行进程间通信(IPC)以及数据的持久化存储。文档"18Nov_Serialization.docx"主要讨论了...

    hadoop访问数据库

    它主要用于存储和分析非结构化或半结构化数据,而对于结构化数据,则通常采用数据库进行管理。将Hadoop与现有数据库结合,可以在Hadoop应用程序中访问数据库文件,实现数据的高效处理和分析。 #### 二、...

    16、MapReduce的基本用法示例-自定义序列化、排序、分区、分组和topN

    例如,你可以创建一个包含日期、县、州、FIPS代码、病例数和死亡病例数的自定义类,并重写readFields和write方法来实现对象的序列化和反序列化。 二、排序 MapReduce框架会默认对输出的键值对进行排序,首先按照键...

    MapReduce原理.docx

    例如,如果使用Java,则可以创建自定义的Writable类,并实现write和readFields方法来实现序列化和反序列化。这对于提高MapReduce作业的性能非常重要。 通过以上介绍,我们可以看出MapReduce作为一种分布式计算框架...

    大数据第二次作业1

    Hadoop 中的数据类型和序列化 Hadoop 作为一个大数据处理平台,对数据类型和序列化的处理至关重要。在 Hadoop 中,所有的数据类型都需要实现 Writable 接口,以便这些类型定义的数据可以被网络传输和文件存储。今天...

    Hadoop源码分析 完整版 共55章

    - **序列化机制**:为了满足Hadoop MapReduce和HDFS的通信需求,Hadoop采用了自定义的序列化机制而不是Java自带的序列化方式。这一机制主要体现在`org.apache.hadoop.io`包中的各类可序列化对象,它们实现了`...

    数据分析—排序.pdf

    `write`用于序列化字段值为二进制,`readFields`用于反序列化,`compareTo`用于自定义比较规则。 2. 方案二:继承`WritableComparator`类,重写无参构造函数,指定key的类型,如`super(Text.class, true)`。再重写`...

    hadoop代码分析

    - **Writable接口**:`org.apache.hadoop.io`包下的类通常实现了`Writable`接口,这个接口定义了如何将对象序列化到流中以及如何从流中反序列化对象的方法。例如,`MyWritable`类实现了`Writable`接口,并提供了相应...

    hadoop源码分析

    在这个例子中,`MyWritable`类实现了`Writable`接口,并重写了`write`和`readFields`方法,用于序列化和反序列化对象的状态。 #### 四、总结 通过对Hadoop源码的分析,我们可以更深入地理解其背后的原理和技术细节...

Global site tag (gtag.js) - Google Analytics