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-shell(spark-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/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
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)
似乎没有一种简单的方法可以使用用户提供的 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到参数列表中
假设您不想运行 Spark-on-YARN - 从捆绑包“Spark 2.4.5 with Hadoop 2.7”开始,然后挑选 Hadoop 库从捆绑包“Hadoop 2.10.x”升级
spark-yarn//丢弃hadoop-yarn-*JAR hadoop-mapreduce-client-*,因为您不需要它们,除非 hadoop-mapreduce-client-coreHDFS 和 S3 上的写入操作引用它们(参见“MR 提交过程”V1 或 V2)
spark-mesos/mesos-*和/或spark-kubernetes/ kubernetes-* JAR,具体取决于您计划运行 Spark 的内容spark-hive-thriftserverJARS ,除非您可能猜到,管理 Metastore (常规 Hive Metastore 服务或 Spark 会话中的嵌入式 Metastore)是必需的)hive-* hive-metastorehadoop-hdfs/ hadoop-common/ hadoop-auth/ hadoop-annotations/ htrace-core*/ xercesImplJARhadoop-hdfs-client/ hadoop-common/ hadoop-auth/ hadoop-annotations/ htrace-core*/ xercesImpl/ stax2-apiHadoop 2.10 中的 JAR(在common/和common/lib/、或hdfs/和 下hdfs/lib/)hadoop-awsJAR (在 下jets3t)woodstox-coretools/lib/aws-java-sdk(我猜不能与 Hadoop 捆绑,因为它不是 Apache 许可证)
经过一番试验和错误后,这对我有用——但需要注意的是:我针对 S3 兼容的存储系统运行了测试,但不是针对“真正的”S3,也不是针对常规 HDFS。并且没有“真正的”Hive Metastore 服务,只有 Spark 默认运行的嵌入式内存和易失性 Metastore。
guavaxercesImpl也不htrace-core需要stax2-apijets3t了hadoop-mapreduce-client-*JAR(可能是因为新的“S3 提交者”)| 归档时间: |
|
| 查看次数: |
3590 次 |
| 最近记录: |