如何从 Spark Shell 中删除 derby.log、metastore_db

问题描述 投票:0回答:8

运行

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忽略它们。

有谁知道如何删除这些或为它们指定默认目录?

apache-spark derby
8个回答
18
投票

自 Spark 2.0.0 起,已弃用

hive.metastore.warehouse.dir
请参阅文档

正如这个答案所暗示的,在每个工作子目录中创建

metastore_db
目录和
derby.log
文件的真正罪魁祸首是默认为
derby.system.home
.
属性。

因此,可以通过将以下行添加到

spark-defaults.conf
来指定两者的默认位置:

spark.driver.extraJavaOptions -Dderby.system.home=/tmp/derby

其中

/tmp/derby
可以替换为您选择的目录。


16
投票

对于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"

4
投票

在启动 Spark shell 之前,尝试将

derby.system.home
设置为其他目录作为系统属性。德比将在那里创建新的数据库。该属性的默认值为
.

参考:https://db.apache.org/derby/integrate/plugin_help/properties.html


3
投票

对我来说,设置 Spark 属性不起作用,无论是在驱动程序还是执行程序上。因此,在寻找这个问题时,我最终为我的系统设置了属性:

System.setProperty("derby.system.home", "D:\\tmp\\derby")

val spark: SparkSession = SparkSession.builder
    .appName("UT session")
    .master("local[*]")
    .enableHiveSupport
    .getOrCreate

[...]

这终于让我摆脱了那些烦人的东西。


2
投票

使用

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

1
投票

如果您使用 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)

0
投票

我在 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()

0
投票

我正在使用 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 之间的根路径应该相同

© www.soinside.com 2019 - 2024. All rights reserved.