如何使用用户提供的hadoop正确配置spark2.4

a6b3iqyw  于 2021-05-27  发布在  Hadoop
关注(0)|答案(2)|浏览(563)

我想使用spark2.4.5(当前稳定的spark版本)和hadoop2.10(2.x系列中当前稳定的hadoop版本)。此外,我需要访问hdfs、hive、s3和kafka。
http://spark.apache.org provides spark 2.4.5已预构建并与Hadoop2.6或Hadoop2.7捆绑。另一个选择是在用户提供的hadoop中使用spark,所以我尝试了这个方法。
由于与用户提供的hadoop一起使用,spark也不包括配置单元库。会有一个错误,比如:如何使用配置单元支持创建sparksession(失败时显示“未找到配置单元类”)?
当我通过使用将spark配置单元依赖项添加到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)

因为sparkshell不能同时处理分类器和包依赖,请参阅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来绕过配置单元依赖性问题吗?

rlcwz9us

rlcwz9us1#

使用用户提供的hadoop配置spark2.4.5以使用hadoop2.10.0似乎不是一种简单的方法
由于我的任务实际上是最小化依赖性问题,所以我选择了针对hadoop2.10.0编译spark2.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

现在maven处理配置单元依赖项/分类器,结果包就可以使用了。
在我个人看来,编译spark实际上比用用户提供的hadoop配置spark更容易。
集成测试到目前为止还没有显示出任何问题,spark可以访问hdfs和s3(minio)。

jutyujz0

jutyujz02#

假设您不想在yarn上运行spark——从bundle“spark 2.4.5 with hadoop 2.7”开始,然后选择hadoop库从bundle“hadoop 2.10.x”升级
丢弃 spark-yarn / hadoop-yarn-* / hadoop-mapreduce-client-* 因为你不需要它们,除了 hadoop-mapreduce-client-core 由hdfs和s3上的写操作引用(参见“mr commit procedure”v1或v2)
您也可以丢弃 spark-mesos / mesos-* 和/或 spark-kubernetes / kubernetes-* jar取决于你的计划运行Spark
您也可以丢弃 spark-hive-thriftserver 以及 hive-* 如果你不打算运行一个“thrift服务器”示例,除了 hive-metastore 正如您可能猜到的,这对于管理metastore(常规的hive metastore服务或spark会话中的嵌入式metastore)是必要的
丢弃 hadoop-hdfs / hadoop-common / hadoop-auth / hadoop-annotations / htrace-core* / xercesImpl
替换为 hadoop-hdfs-client / hadoop-common / hadoop-auth / hadoop-annotations / htrace-core* / xercesImpl / stax2-api hadoop2.10的jars(在 common/ 以及 common/lib/ ,或 hdfs/ 以及 hdfs/lib/ )
添加hadoop2.10中的s3a连接器。 hadoop-aws / jets3t / woodstox-core jar(下) tools/lib/ )
下载 aws-java-sdk 来自amazon(不能与hadoop捆绑,因为我猜它不是apache许可证)
最后,做了很多测试。。。
在经历了一番尝试和错误之后,这对我来说是有效的——但有一点需要注意:我是针对s3兼容的存储系统运行测试的,但不是针对“真正的”s3,也不是针对常规的HDF。没有一个“真正的”hive元存储服务,只有spark默认运行的嵌入式内存和易失性元存储。
作为记录,这个过程与spark3.0.0预览和hadoop3.2.1相同,只是
你还必须升级 guava 你不必升级 xercesImpl 也不是 htrace-core 也不是 stax2-api 你不需要 jets3t
你需要保留更多 hadoop-mapreduce-client-* jar(可能是因为新的“s3提交者”)

相关问题