运行
spark-shell
时,它会创建一个文件 derby.log
和一个文件夹 metastore_db
。如何配置 Spark 将它们放在其他地方?
对于德比日志,我已经尝试过摆脱derby.log,像这样
spark-shell --driver-memory 10g --conf "-spark.driver.extraJavaOptions=Dderby.stream.info.file=/dev/null"
,具有几个不同的属性,但spark忽略它们。
有谁知道如何删除这些或为它们指定默认目录?
对于spark-shell,为了避免拥有
metastore_db
目录并避免在代码中执行此操作(因为上下文/会话已经创建,并且您不会每次都停止它们并使用新配置重新创建它们),您有设置其在 hive-site.xml
文件中的位置并将该文件复制到 Spark conf 目录中。hive-site.xml
文件,用于在 metastore_db
中确定 /tmp
的位置(请参阅我的答案此处):
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=/tmp/metastore_db;create=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/tmp/</value>
<description>location of default database for the warehouse</description>
</property>
</configuration>
之后,您可以按照以下方式开始您的
spark-shell
,以摆脱derby.log
$ spark-shell --conf "spark.driver.extraJavaOptions=-Dderby.stream.error.file=/tmp"
在启动 Spark shell 之前,尝试将
derby.system.home
设置为其他目录作为系统属性。德比将在那里创建新的数据库。该属性的默认值为 .
参考:https://db.apache.org/derby/integrate/plugin_help/properties.html
对我来说,设置 Spark 属性不起作用,无论是在驱动程序还是执行程序上。因此,在寻找这个问题时,我最终为我的系统设置了属性:
System.setProperty("derby.system.home", "D:\\tmp\\derby")
val spark: SparkSession = SparkSession.builder
.appName("UT session")
.master("local[*]")
.enableHiveSupport
.getOrCreate
[...]
这终于让我摆脱了那些烦人的东西。
使用
hive.metastore.warehouse.dir
属性。 来自文档:
val spark = SparkSession
.builder()
.appName("Spark Hive Example")
.config("spark.sql.warehouse.dir", warehouseLocation)
.enableHiveSupport()
.getOrCreate()
对于德比日志:摆脱 derby.log 可能是答案。一般来说,在
您的工作目录中创建
derby.properties
文件,其中包含以下内容:
derby.stream.error.file=/path/to/desired/log/file
如果您使用 Jupyter/Jupyterhub/Jupyterlab 或只是在 python 中设置此conf参数,请使用以下命令:
from pyspark import SparkConf, SparkContext
conf = (SparkConf()
.setMaster("local[*]")
.set('spark.driver.extraJavaOptions','-Dderby.system.home=/tmp/derby')
)
sc = SparkContext(conf = conf)
我在 pyspark 项目中使用了以下配置,我能够在示例路径中设置 Sparkwarehouse db 和 derby db,因此能够避免在当前目录中设置它们。
from pyspark.sql import SparkSession
from os.path import abspath
location = abspath("C:\self\demo_dbx\data\spark-warehouse") #Path where you want to setup sparkwarehouse
local_spark = SparkSession.builder \
.master("local[*]") \
.appName('Spark_Dbx_Session') \
.config("spark.sql.warehouse.dir", location)\
.config("spark.driver.extraJavaOptions",
f"Dderby.system.home='{location}'")\
.getOrCreate()
我正在使用 pyspark 3.5 / ubuntu 20.04LTS 这是conf,它对我来说效果很好:
location = "/home/amine/Desktop/myderby"
spark = SparkSession \
.builder \
.appName("Python Spark SQL Hive integration example") \
.config("spark.sql.warehouse.dir", "/home/amine/Desktop/spark-warehouse") \
.config("spark.driver.extraJavaOptions",
f"-Dderby.system.home='{location}'") \
.enableHiveSupport() \
.getOrCreate()
并在您的工作目录中创建一个文件 derby.properties 并放入: derby.stream.error.file=/home/amine/Desktop/myderby/derby.log
注意 location 和 derby.stream.error.file 之间的根路径应该相同