【发布时间】:2020-06-14 12:05:42
【问题描述】:
我想使用 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 库。 会有错误,像这里:How to create SparkSession with Hive support (fails with "Hive classes are not found")?
当我将 spark-hive 依赖项添加到 spark-shell 时(spark-submit 也会受到影响)使用
spark.jars.packages=org.apache.spark:spark-hive_2.11:2.4.5
在 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)
因为 spark-shell 无法同时处理分类器和捆绑包依赖关系,请参阅 https://github.com/apache/spark/pull/21339 和 https://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
但 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
(一切正常 - 除了 Hive)
- Spark 2.4.5 和 Hadoop 2.10 的组合是否可以在任何地方使用?怎么样?
- 如何将 Spark 2.4.5 与用户提供的 Hadoop 和 Hadoop 2.9 或 2.10 结合起来?
- 是否有必要构建 Spark 来解决 Hive 依赖问题?
【问题讨论】:
-
对有关预构建版本的评论感到好奇。我只看到 Hadoop 2.6 和 Hadoop 2.7 的预构建二进制文件,但这表明可用性是 Hadoop 2.7 和 Hadoop 2.8。这是一个错误的错误,还是发生了一些变化?
-
我想将我的 hadoop aws 升级到 3.2。目前坚持对 hadoop 2.7 的火花依赖。是否可以遮蔽hadoop aws?我将使用 uber jar。
-
@Knight71 它可能适用于您的情况。然而,根据我的经验,这通常会导致问题,尤其是在 AWS 依赖项的情况下。正是出于这个原因,我构建了 Spark(具有一致的)依赖关系。
-
Spark 集群在 2.2.1 中,预构建了 hadoop 2.7。它不起作用,因为 2.7 jars 已经存在于类路径中。获取 hadoop 配置的 ClassNotFound 错误。
标签: apache-spark hadoop hive hadoop2