如何使用用户提供的 Hadoop 正确配置 Spark 2.4

Ber*_*ium 5 hadoop hive apache-spark hadoop2

我想使用 Spark 2.4.5(当前稳定的 Spark 版本)和 Hadoop 2.10(当前稳定的 Hadoop 2.x 系列版本)。此外,我需要访问 HDFS、Hive、S3 和 Kafka。

http://spark.apache.org提供 Spark 2.4.5 预构建并与 Hadoop 2.6 或 Hadoop 2.7 捆绑在一起。另一种选择是将 Spark与用户提供的 Hadoop 一起使用,所以我尝试了那个。

由于与用户提供的 Hadoop 一起使用,Spark 也不包含 Hive 库。会有一个错误,就像这里:如何创建带有 Hive 支持的 SparkSession(因“找不到 Hive 类”而失败)?

当我通过使用将spark-hive依赖项添加到spark-shellspark-submit也受到影响)

spark.jars.packages=org.apache.spark:spark-hive_2.11:2.4.5
Run Code Online (Sandbox Code Playgroud)

spark-defaults.conf 中,我收到此错误:

20/02/26 11:20:45 ERROR spark.SparkContext: 
Failed to add file:/root/.ivy2/jars/org.apache.avro_avro-mapred-1.8.2.jar to Spark environment
java.io.FileNotFoundException: Jar /root/.ivy2/jars/org.apache.avro_avro-mapred-1.8.2.jar not found
at org.apache.spark.SparkContext.addJarFile$1(SparkContext.scala:1838)
at org.apache.spark.SparkContext.addJar(SparkContext.scala:1868)
at org.apache.spark.SparkContext.$anonfun$new$11(SparkContext.scala:458)
at org.apache.spark.SparkContext.$anonfun$new$11$adapted(SparkContext.scala:458)
at scala.collection.immutable.List.foreach(List.scala:392)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:458)
at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2520)
at org.apache.spark.sql.SparkSession$Builder.$anonfun$getOrCreate$5(SparkSession.scala:935)
at scala.Option.getOrElse(Option.scala:189)
at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:926)
at org.apache.spark.repl.Main$.createSparkSession(Main.scala:106)
Run Code Online (Sandbox Code Playgroud)

因为spark-shell无法将分类器与包依赖项一起处理,请参阅https://github.com/apache/spark/pull/21339https://github.com/apache/spark/pull/17416

分类器问题的解决方法如下所示:

$ cp .../.ivy2/jars/org.apache.avro_avro-mapred-1.8.2-hadoop2.jar .../.ivy2/jars/org.apache.avro_avro-mapred-1.8.2.jar
Run Code Online (Sandbox Code Playgroud)

但 DevOps 不会接受这一点。

完整的依赖列表如下所示(为了更好的可读性,我添加了换行符)

root@a5a04d888f85:/opt/spark-2.4.5/conf# cat spark-defaults.conf
spark.jars.packages=com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.10,
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.10,
org.apache.spark:spark-hive_2.11:2.4.5,
org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.5,
org.apache.hadoop:hadoop-aws:2.10.0,
io.delta:delta-core_2.11:0.5.0,
org.postgresql:postgresql:42.2.5,
mysql:mysql-connector-java:8.0.18,
com.datastax.spark:spark-cassandra-connector_2.11:2.4.3,
io.prestosql:presto-jdbc:307
Run Code Online (Sandbox Code Playgroud)

(一切正常 - 除了 Hive)

  • Spark 2.4.5 和 Hadoop 2.10 的组合是否在任何地方使用?如何?
  • 如何将Spark 2.4.5 与用户提供的 Hadoop和 Hadoop 2.9 或 2.10结合起来?
  • 是否有必要构建 Spark 来解决 Hive 依赖问题?

Ber*_*ium 5

似乎没有一种简单的方法可以使用用户提供的 Hadoop配置Spark 2.4.5以使用 Hadoop 2.10.0

由于我的任务实际上是最小化依赖问题,因此我选择针对 Hadoop 2.10.0编译 Spark 2.4.5。

./dev/make-distribution.sh \
  --name hadoop-2.10.0 \
  --tgz \
  -Phadoop-2.7 -Dhadoop.version=hadoop-2.10.0 \
  -Phive -Phive-thriftserver \
  -Pyarn
Run Code Online (Sandbox Code Playgroud)

现在 Maven 处理 Hive 依赖项/分类器,并且生成的包已准备好使用。

在我个人看来,编译 Spark 实际上比使用用户提供的 Hadoop配置Spark更容易。

到目前为止集成测试没有显示任何问题,Spark 可以访问 HDFS 和 S3(MinIO)。

更新 2021-04-08

如果要添加对 Kubernetes 的支持,只需添加-Pkubernetes到参数列表中


Sam*_*ter 3

假设您不想运行 Spark-on-YARN - 从捆绑包“Spark 2.4.5 with Hadoop 2.7”开始,然后挑选 Hadoop 库从捆绑包“Hadoop 2.10.x”升级

  1. spark-yarn//丢弃hadoop-yarn-*JAR hadoop-mapreduce-client-*,因为您不需要它们,除非 hadoop-mapreduce-client-coreHDFS 和 S3 上的写入操作引用它们(参见“MR 提交过程”V1 或 V2)
    • 您还可以丢弃spark-mesos/mesos-*和/或spark-kubernetes/ kubernetes-* JAR,具体取决于您计划运行 Spark 的内容
    • 如果您不打算运行“thrift server”实例,您也可以丢弃spark-hive-thriftserverJARS ,除非您可能猜到,管理 Metastore (常规 Hive Metastore 服务或 Spark 会话中的嵌入式 Metastore)是必需的hive-* hive-metastore
  2. 丢弃hadoop-hdfs/ hadoop-common/ hadoop-auth/ hadoop-annotations/ htrace-core*/ xercesImplJAR
  3. 替换为hadoop-hdfs-client/ hadoop-common/ hadoop-auth/ hadoop-annotations/ htrace-core*/ xercesImpl/ stax2-apiHadoop 2.10 中的 JAR(在common/common/lib/、或hdfs/和 下hdfs/lib/
  4. 添加来自 Hadoop 2.10 的 S3A 连接器,即// hadoop-awsJAR (在 下jets3twoodstox-coretools/lib/
  5. 从 Amazon下载aws-java-sdk(我猜不能与 Hadoop 捆绑,因为它不是 Apache 许可证)
  6. 最后,进行大量测试......


经过一番试验和错误后,这对我有用——但需要注意的是:我针对 S3 兼容的存储系统运行了测试,但不是针对“真正的”S3,也不是针对常规 HDFS。并且没有“真正的”Hive Metastore 服务,只有 Spark 默认运行的嵌入式内存和易失性 Metastore。


根据记录,该过程与 Spark 3.0.0 预览版和 Hadoop 3.2.1 相同,不同之处在于

  • 你还必须升级guava
  • 你不需要升级xercesImpl也不htrace-core需要stax2-api
  • 你不再需要jets3t
  • 您需要保留更多hadoop-mapreduce-client-*JAR(可能是因为新的“S3 提交者”)