反序列化内存中的 Hadoop 序列文件对象

Posted

技术标签:

【中文标题】反序列化内存中的 Hadoop 序列文件对象【英文标题】:Deserialize an in-memory Hadoop sequence file object 【发布时间】:2022-01-13 18:59:09 【问题描述】:

Pyspark 有一个函数 sequenceFile,它允许我们读取存储在 HDFS 或所有节点可用的本地路径中的序列文件。

但是,如果我在驱动程序内存中已经有一个字节对象需要反序列化并作为序列文件写入呢?

例如,我正在处理的应用程序(我无法更改应用程序逻辑)运行一个 spark 作业,该作业将此文件写入不符合 HDFS 的文件系统,然后我可以将其作为内存中的 python 字节对象检索,它似乎只包含一个序列化的 Sequence 对象,我应该能够在内存中对其进行反序列化。

因为这个对象已经在内存中(因为我无法控制),我必须反序列化它并实际查看当前输出(这是一个 json 文件)的唯一方法是将它作为本地文件写入,移动该文件进入 HDFS,然后使用 sequenceFile 方法读取文件(因为该方法仅适用于 HDFS 文件路径或每个节点上的本地路径上的文件) - 这会在应用程序工作流程中产生问题。

我需要做的是在内存中反序列化它,这样我就可以将它写为 json 文件,而不必在本地写入,然后将其放入 HDFS 中,然后用 spark 将其读回

在 python 中是否有像 NullWritable Object 这样的字节并将其反序列化为 python 字典或将其放回 hadoop 作为我可以实际读取的内容?

【问题讨论】:

您的意思是它在驱动程序内存还是执行程序内存中?有关系吗?是的,直接在内存中传输到可以写入 hdfs 的格式会更有效。但是您是否正在编写一个时间紧迫的系统,以至于这一步会严重妨碍您的工作?我知道使用不完善的工具感觉不好,但这是您需要解决的瓶颈吗? 【参考方案1】:

基本上,您必须查看 spark 本身的序列文件代码并应用正确的部分并将其转换为 RDD,以便您可以在其上执行 spark 操作,例如写入文件。

这里有一个 link 可以帮助您入门,但需要一些挖掘。

【讨论】:

以上是关于反序列化内存中的 Hadoop 序列文件对象的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop之序列化

Hadoop序列化与Java序列化

对象流的序列化与反序列化:ObjectInputStream 和 ObjectOutputStream

python中的序列化和反序列化

反序列化文件中的数据。性能问题

序列化和反序列化