Spark:hive on spark

spark默认会使用基于derby数据库存储元数据的hive,数据文件存储位置由spark.sql.warehouse.dir参数指定(默认为当前目录)。
比如当我们在/spark/目录下调用spark-shell,并且用Dataset的saveAsTable方法持久化一个表后。会发现在/spark目录下多出了:

  1. 一个文件:derby.log,记录了derby数据库相关日志信息;
  2. 一个目录:metastore_db,derby用于记录hive元数据的数据库;
  3. 一个目录:spark-warehouse,Dataset的相关数据文件,默认是parquet格式。

但是这种方式不支持并发,因为derby数据库不支持并发(同一个数据库的事务机制不支持并发)。也就是说,如果在同一个目录下运行两个spark-shell,然后使用hive功能,就会报错:

Caused by: org.apache.derby.iapi.error.StandardException: Another instance of Derby may have already booted the database /root/metastore_db.

当然,如果是在不同的目录下分别运行spark-shell,然后都用hive不会有问题,因为这时候实际上是用了两个derby数据库来存储元数据的。


我们可以使用在$SPARK_HOME/conf下增加hive-site.xml配置文件的方式来配置hive,包括配置元数据存储位置,数据文件存储位置等等。
比如我们想用mysql存储hive的元数据,同时需要将mysql的jdbc jar包加入$SPARK_HOME/jar目录,以便spark在调用hive的时候hive能连接到mysql库。(spark本身包含了一些hive的相关jar,所以如果仅仅用saveAsTable不需要额外加载hive jar包)。

spark文档一段:

  • Spark SQL 还支持在 Apache Hive 中读写数据。然而,由于 Hive 依赖项太多,这些依赖没有包含在默认的 Spark 发行版本中。如果在 classpath 上配置了 Hive 依赖,那么 Spark 会自动加载它们。注意,Hive 依赖也必须放到所有的 worker 节点上,因为如果要访问 Hive 中的数据它们需要访问 Hive 序列化和反序列化库(SerDes)。
  • Hive 配置是通过将 hive-site.xml,core-site.xml(用于安全配置)以及 hdfs-site.xml(用于HDFS 配置)文件放置在conf/目录下来完成的。
  • 如果要使用 Hive, 你必须要实例化一个支持 Hive 的 SparkSession,包括连接到一个持久化的 Hive metastore, 支持 Hive 序列化反序列化库以及 Hive 用户自定义函数。即使用户没有安装部署 Hive 也仍然可以启用 Hive 支持。如果没有在 hive-site.xml 文件中配置,Spark 应用程序启动之后,上下文会自动在当前目录下创建一个 metastore_db 目录并创建一个由 spark.sql.warehouse.dir 配置的、默认值是当前目录下的 spark-warehouse 目录的目录。请注意 : 从 Spark 2.0.0 版本开始,hive-site.xml 中的 hive.metastore.warehouse.dir 属性就已经过时了,你可以使用 spark.sql.warehouse.dir 来指定仓库中数据库的默认存储位置。你可能还需要给启动 Spark 应用程序的用户赋予写权限。

spark-shell里的SparkSession变量spark默认开启了hive支持。

以下是加入$SPARK_HOME/conf目录的hive-site.xml内容:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>

    <property> 
	    <name>javax.jdo.option.ConnectionURL</name>  
	    <value>jdbc:mysql://slave5/hivedb?createDatabaseIfNotExist=true&amp;characterEncoding=latin1</value>  
    </property>  

    <property>  
	    <name>javax.jdo.option.ConnectionDriverName</name>  
	    <value>com.mysql.jdbc.Driver</value>  
    </property>  

    <property>  
	    <name>javax.jdo.option.ConnectionUserName</name>  
	    <value>hive</value>  
    </property>  

    <property>  
	    <name>javax.jdo.option.ConnectionPassword</name>  
	    <value>***</value>  
    </property> 

    <property>
	    <name>datanucleus.autoStartMechanism</name>
	    <value>SchemaTable</value>
    </property>

    <property>
	    <name>hive.metastore.schema.verification</name>
	    <value>false</value>
    </property>

    <property>
	    <name>datanucleus.schema.autoCreateAll</name>
	    <value>true</value>
    </property>

    <property>
        <name>hive.metastore.warehouse.dir</name> 
        <value>hdfs://slave5:9000/user/hive/warehouse/</value> 
    </property> 

</configuration>

综上:spark如果使用hive需要

  1. 增加hive-site.xml配置文件;
  2. 加入数据库依赖jar包。
posted @ 2019-01-07 13:36  xuejianbest  阅读(886)  评论(0编辑  收藏  举报