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

How to get rid of derby.log, metastore_db from Spark Shell

当 运行 spark-shell 时,它会创建一个文件 derby.log 和一个文件夹 metastore_db。我如何配置 spark 以将它们放在其他地方?

对于 derby 日志,我已经尝试 Getting rid of derby.log 像这样 spark-shell --driver-memory 10g --conf "-spark.driver.extraJavaOptions=Dderby.stream.info.file=/dev/null" 有几个不同的属性,但 spark 忽略了它们。

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

使用hive.metastore.warehouse.dir属性。 From docs:

val spark = SparkSession
  .builder()
  .appName("Spark Hive Example")
  .config("spark.sql.warehouse.dir", warehouseLocation)
  .enableHiveSupport()
  .getOrCreate()

对于德比日志:Getting rid of derby.log 可能是答案。通常在 你的工作目录 中创建 derby.properties 文件,内容如下:

derby.stream.error.file=/path/to/desired/log/file

尝试将 derby.system.home 设置为其他目录作为系统 属性,然后再启动 spark shell。 Derby 将在那里创建新的数据库。此 属性 的默认值为 .

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

对于 spark-shell,避免拥有 metastore_db 目录并避免在代码中执行此操作(因为 context/session 已经创建并且您不会停止它们并且每次都用新的配置重新创建它们),你必须在 hive-site.xml 文件中设置它的位置,并将这个文件复制到 spark conf 目录中。
示例 hive-site.xml 文件,用于在 /tmp 中创建 metastore_db 的位置(参考我的回答 ):

<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 2.0.0 以来,不推荐使用 hive.metastore.warehouse.dirsee the docs

正如 所暗示的,在每个工作子目录中创建 metastore_db 目录和 derby.log 文件的真正罪魁祸首是 derby.system.home 属性 默认为 ..

因此,可以通过将以下行添加到 spark-defaults.conf 来指定两者的默认位置:

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

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

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

对我来说,设置 Spark 属性 无效,无论是在驱动程序还是执行程序上。所以在搜索这个问题时,我最终为我的系统设置了 属性 而不是:

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

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

[...]

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