如何从 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 应用程序
解决SecureCRT下spark-shell中scala无法删除问题
如何从 Derby 数据库中获取在最后 30 秒内插入的条目?