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

Posted

技术标签:

【中文标题】如何从 Spark Shell 中删除 derby.log、metastore_db【英文标题】:How to get rid of derby.log, metastore_db from Spark Shell 【发布时间】:2016-11-17 13:07:47 【问题描述】:

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

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

【问题讨论】:

您在问题文本中输入了derby.stream.info.file。您链接到的问题***.com/questions/1004327/getting-rid-of-derby-log 说要配置derby.stream.error.file。您实际上尝试了哪一个? 【参考方案1】:

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

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

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

[...]

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

自 Spark 2.0.0 起,hive.metastore.warehouse.dir 的使用已被弃用, see the docs。

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

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

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

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

【讨论】:

这似乎不再起作用了。使用火花 2.2 :( 我在新安装的 Spark 2.2.1 上进行了测试,它对我有用。也许它与权限有关? 我尝试使用 Spark 2.2.0 使用 spark.config("spark.driver.extraJavaOptions", "-Dderby.system.home=D:\\tmp\\derby"),但没有成功。 您似乎正在尝试在 启动 Spark 上下文之后更改配置。但是到那时,这个设置已经太晚了...您需要按照上面的说明更改spark-defaults.conf文件中的Spark默认配置...【参考方案4】:

对于 spark-shell,要避免使用 metastore_db 目录并避免在代码中执行此操作(因为已经创建了上下文/会话,您不会停止它们并每次使用新配置重新创建它们),您必须在 hive-site.xml 文件中设置它的位置,然后将此文件复制到 spark conf 目录中。 一个示例hive-site.xml 文件,用于在/tmp 中制作metastore_db 的位置(参考我的回答here):

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

【讨论】:

如何在独立模式下完全禁用 derby。很多旧方法(postgres setup + db creation + hive-site.xml 似乎不再适用于 spark 2.2)【参考方案5】:

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

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

【讨论】:

【参考方案6】:

使用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.properties

以上是关于如何从 Spark Shell 中删除 derby.log、metastore_db的主要内容,如果未能解决你的问题,请参考以下文章

如何从 spark-shell/spark-submit 运行交互式 Spark 应用程序

删除 Derby DB 中的所有表

解决SecureCRT下spark-shell中scala无法删除问题

如何从 Derby 数据库中获取在最后 30 秒内插入的条目?

如何将数据从 Ms 访问迁移到 Derby 数据库或如何将数据从 My sql 迁移到 Derby 数据库

spark-shell - 如何避免抑制省略堆栈跟踪(异常)