sparkSession/sparkContext无法获取hadoop配置

xub*_*ild 7 hadoop apache-spark

我在本地机器上运行spark 2,hive,hadoop,我想使用spark sql从hive表中读取数据.

当我在默认情况下运行hadoop时,它工作正常hdfs://localhost:9000,但如果我更改为core-site.xml中的其他端口:

<name>fs.defaultFS</name>
<value>hdfs://localhost:9099</value>
Run Code Online (Sandbox Code Playgroud)

spark.sql("select * from archive.tcsv3 limit 100").show();在spark-shell中运行一个简单的sql 会给我错误:

ERROR metastore.RetryingHMSHandler: AlreadyExistsException(message:Database default already exists)
.....
From local/147.214.109.160 to localhost:9000 failed on connection exception: java.net.ConnectException: Connection refused;
.....
Run Code Online (Sandbox Code Playgroud)

我之前得到了AlreadyExistsException,这似乎不会影响结果.

我可以通过创建一个新的sparkContext来使它工作:

import org.apache.spark.SparkContext
import org.apache.spark.sql.SparkSession
sc.stop()
var sc = new SparkContext()
val session = SparkSession.builder().master("local").appName("test").enableHiveSupport().getOrCreate()
session.sql("show tables").show()
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么最初的sparkSession/sparkContext没有得到正确的配置?我该如何解决?谢谢!

小智 6

如果您正在使用SparkSession并且想要在spark上下文中设置配置,请使用session.sparkContext

val session = SparkSession
  .builder()
  .appName("test")
  .enableHiveSupport()
  .getOrCreate()
import session.implicits._

session.sparkContext.hadoopConfiguration.set("fs.s3.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
Run Code Online (Sandbox Code Playgroud)

您不需要SparkContext在之前导入或创建它SparkSession

  • 或者,您也可以将 `.config()` 插入构建器方法链: `SparkSettion.builder().appName("app-name").config("fs.s3a.impl", "org.apache.hadoop .fs.s3a.S3AFileSystem").getOrCreate()` 这比编写另一个语句更简单。(我测试了Apache Spark v2.4.3) (2认同)