我想使用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来绕过配置单元依赖性问题吗?
2条答案
按热度按时间rlcwz9us1#
使用用户提供的hadoop配置spark2.4.5以使用hadoop2.10.0似乎不是一种简单的方法
由于我的任务实际上是最小化依赖性问题,所以我选择了针对hadoop2.10.0编译spark2.4.5。
现在maven处理配置单元依赖项/分类器,结果包就可以使用了。
在我个人看来,编译spark实际上比用用户提供的hadoop配置spark更容易。
集成测试到目前为止还没有显示出任何问题,spark可以访问hdfs和s3(minio)。
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提交者”)