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

wlwcrazw  于 2023-02-09  发布在  Apache
关注(0)|答案(7)|浏览(432)

当运行spark-shell时,它会创建一个文件derby.log和一个文件夹metastore_db,我如何配置spark来把它们放在其他地方?
对于derby log,我尝试过Getting rid of derby.log,比如spark-shell --driver-memory 10g --conf "-spark.driver.extraJavaOptions=Dderby.stream.info.file=/dev/null",它有几个不同的属性,但是spark忽略了它们。
有人知道如何摆脱这些或为它们指定一个默认目录吗?

6kkfgxo0

6kkfgxo01#

自Spark 2.0.0起,hive.metastore.warehouse.dir的使用已弃用,请参阅文档。
正如this answer所暗示的,metastore_db目录和每个工作子目录中创建的derby.log文件的真实的罪魁祸首是derby.system.home属性默认为.
因此,可以通过向spark-defaults.conf添加以下行来指定两者的默认位置:

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

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

ntjbwcob

ntjbwcob2#

对于spark-shell,为了避免使用metastore_db目录,并避免在代码中这样做(因为上下文/会话已经创建,您不会停止它们并每次使用新配置重新创建它们),您必须在hive-site.xml文件中设置其位置,并将此文件复制到spark conf目录中。
一个hive-site.xml示例文件,用于确定metastore_db/tmp中的位置(参考我的答案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"
envsm3lx

envsm3lx3#

在启动spark shell之前,尝试将derby.system.home作为系统属性设置为其他目录,Derby将在那里创建新数据库。
参考:https://db.apache.org/derby/integrate/plugin_help/properties.html

dced5bon

dced5bon4#

使用hive.metastore.warehouse.dir属性。来自文档:

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

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

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

tcbh2hod5#

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

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

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

[...]

而那最终让我摆脱了那些烦人的物品。

rn0zuynd

rn0zuynd6#

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

plicqrtu7#

对于pyspark,下面的配置工作!!

from pyspark.sql import SparkSession
from os.path import abspath
location = abspath("C:\self\demo_dbx\data\spark-warehouse")
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()

相关问题