赞
踩
由于hive原生是基于MapReduce的,导致其查询耗时较长。
为了保留Hive的架构解决方案,并优化查询速度,采用SparkSql与hive整合(spark on hive),通过SparkSql读取hive中表的元数据,把HiveHQL底层采用MapReduce处理任务导致性能慢的特点,改为更加强大的Spark引擎来进行相应的计算处理。
1、搭建hadoop集群
2、安装hive构建数据仓库
3、安装spark集群
Spark SQL的其中一个分支就是Spark on Hive,就是使用Hive中HQL的解析逻辑、执行计划翻译、执行计划优化等逻辑,近似认为仅将物理执行计划从MR作业替换成了Spark作业。
Spark SQL整合hive就是获取hive表中的元数据信息(在mysql中),然后通过Spark SQL来操作数据。
整合步骤:
查看hive 目录中conf目录下的配置文件,hive-site.xml,可以发现之前配置的hive的元数据信息在node03的mysql数据库中。
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node03.hadoop.com:3306/hive?createDatabaseIfNotExis
t=true</value>
</property>
整合需要spark能够读取找到Hive的元数据以及数据存放位置。所以需要将hive-site.xml文件拷贝到Spark的conf目录下。
在node01的hive安装目录下执行以下命令:
cp conf/hive-site.xml /export/servers/spark/conf/
scp conf/hive-site.xml node02:/export/servers/spark/conf/
scp conf/hive-site.xml node03:/export/servers/spark/conf/
在node01中hive的lib目录下执行以下命令(因为在安装hive时已经拷贝了mysql驱动):
/export/servers/hive-1.1.0-cdh5.14.0/lib
cp mysql-connector-java-5.1.38.jar /export/servers/spark/jars/
scp mysql-connector-java-5.1.38.jar node02:/export/servers/spark/jars/
scp mysql-connector-java-5.1.38.jar node03:/export/servers/spark/jars/
以上命令也可以在其他设备上执行,因为每台设备配置文件及mysql驱动jar包都相同。只要文件可以拷贝成功即可。
启动HDFS,YARN集群(yarn集群也可以不启动,只启动hdfs即可);
启动spark集群;
启动hive,在node03上hive目录下(首先启动一下metastore服务):
nohup bin/hive --service metastore &
bin/hive
启动spark sql
在spark安装目录的bin目录下:
spark-sql --master spark://node01:7077 --executor-memory 1g --total-executor-cores 2
启动时,发现有大量日志:
可进入/export/servers/spark/conf目录,调整日志级别:
cp log4j.properties.template log4j.properties
vim log4j.properties
将
# Set everything to be logged to the console
log4j.rootCategory=INFO, console
改为:
# Set everything to be logged to the console
log4j.rootCategory=WARN, console
重新启动sparkSQL
可以像在spark-sql中操作hive中的数据库和表,表明整合成功。
在spark2.0版本后由于出现了sparkSession,在初始化sqlContext的时候,会设置默认的spark.sql.warehouse.dir=spark-warehouse,
此时将hive与sparksql整合完成之后,在通过spark-sql脚本启动的时候,还是会在哪里启动spark-sql脚本,就会在当前目录下创建一个spark.sql.warehouse.dir为spark-warehouse的目录,存放由spark-sql创建数据库和创建表的数据信息,与之前hive的数据信息不是放在同一个路径下(可以互相访问)。但是此时spark-sql中表的数据在本地,不利于操作,也不安全。
所有在启动的时候需要加上这样一个参数:
--conf spark.sql.warehouse.dir=hdfs://node1:9000/user/hive/warehouse
保证spark-sql启动时不在产生新的存放数据的目录,sparksql与hive最终使用的是hive同一存放数据的目录。
如果使用的是spark2.0之前的版本,由于没有sparkSession,不会有spark.sql.warehouse.dir配置项,不会出现上述问题。
spark-sql \
--master spark://node01:7077 \
--executor-memory 1g \
--total-executor-cores 2 \
--conf spark.sql.warehouse.dir=hdfs://node01:8020/user/hive/warehouse
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。