![](/img/trans.png)
[英]apache flink org.apache.hadoop.ipc.RpcException: RPC response exceeds maximum data length when writing string to HDFS
[英]Writing a Custom Class to HDFS in Apache Flink
在开始使用Spark之后,我试图熟悉Flink的语义。 我想将DataSet[IndexNode]
写入HDFS中的持久性存储,以便以后可以由另一个进程读取。 Spark有一个提供这种功能的简单ObjectFile
API,但我在Flink中找不到类似的选项。
case class IndexNode(vec: Vector[IndexNode],
id: Int) extends Serializable {
// Getters and setters etc. here
}
内置接收器倾向于基于toString
方法对实例进行序列化,由于类的嵌套结构,此处不适合。 我想解决方案是使用FileOutputFormat
并将实例转换为字节流。 但是,我不确定如何对向量进行序列化,该向量的长度是任意的,并且深度可能很多。
您可以使用SerializedOutputFormat
和SerializedInputFormat
实现此目的。
请尝试以下步骤:
使IndexNode
从FLINK扩展IOReadableWritable
接口。 将@transient
序列化的字段设置为@transient
。 实现write(DataOutputView out)
和read(DataInputView in)
方法。 write方法将从IndexNode
写出所有数据,而read方法将它们读回并构建所有内部数据字段。 例如,我没有将Result
类中arr
字段中的所有数据序列化,而是将所有值写出,然后读回它们并以read方法重建数组。
class Result(var name: String, var count: Int) extends IOReadableWritable { @transient var arr = Array(count, count) def this() { this("", 1) } override def write(out: DataOutputView): Unit = { out.writeInt(count) out.writeUTF(name) } override def read(in: DataInputView): Unit = { count = in.readInt() name = in.readUTF() arr = Array(count, count) } override def toString: String = s"$name, $count, ${getArr}" }
用写数据
myDataSet.write(new SerializedOutputFormat[Result], "/tmp/test")
然后读回去
env.readFile(new SerializedInputFormat[Result], "/tmp/test")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.