在 Scala 和 Spark 中读取 zst 存档:本机 zStandard 库不可用

问题描述

我正在尝试在 Scala 上使用 Spark 读取 zst 压缩文件

 import org.apache.spark.sql._
 import org.apache.spark.sql.types._
 val schema = new StructType()
      .add("title",StringType,true)
      .add("selftext",true)
      .add("score",LongType,true)
      .add("created_utc",true)
      .add("subreddit",true)
      .add("author",true)
 val df_with_schema = spark.read.schema(schema).json("/home/user/repos/concepts/abcde/RS_2019-09.zst")

 df_with_schema.take(1)

不幸的是,这会产生以下错误

org.apache.spark.SparkException:由于阶段失败,作业中止: 阶段 0.0 中的任务 0 失败 1 次,最近失败:丢失任务 0.0 在阶段 0.0 (TID 0) (192.168.0.101 executor driver): java.lang.RuntimeException: 本机 zStandard 库不可用: 这个版本的 libhadoop 是在没有 zstd 支持的情况下构建的。

我的 hadoop checknative 看起来如下,但我从 here 了解到 Apache Spark 有自己的 ZStandardCodec。

本地库检查:

  • hadoop: true /opt/hadoop/lib/native/libhadoop.so.1.0.0
  • zlib: true /lib/x86_64-linux-gnu/libz.so.1
  • zstd : true /lib/x86_64-linux-gnu/libzstd.so.1
  • snappy: true /lib/x86_64-linux-gnu/libsnappy.so.1
  • lz4:真实版本:10301
  • bzip2:真 /lib/x86_64-linux-gnu/libbz2.so.1
  • openssl:false EVP_CIPHER_CTX_cleanup
  • ISA-L:错误的 libhadoop 是在没有 ISA-L 支持的情况下构建的
  • PMDK:false 本机代码是在没有 PMDK 支持的情况下构建的。

感谢您的任何想法,谢谢!

更新1: 根据此 post,我更了解消息的含义,即认情况下编译 Hadoop 时未启用 zstd,因此可能的解决方案之一显然是在启用该标志的情况下构建它。

解决方法

由于我不想自己构建 Hadoop,受到所使用的解决方法 here 的启发,我将 Spark 配置为使用 Hadoop 本机库:

spark.driver.extraLibraryPath=/opt/hadoop/lib/native
spark.executor.extraLibraryPath=/opt/hadoop/lib/native

我现在可以毫无问题地将 zst 存档读取到 DataFrame 中。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...