Hive on Spark && Spark on Hive配置
目录
- [Hive on Spark && Spark on Hive配置](#Hive on Spark && Spark on Hive配置)
- Spark官网
- [Hive on Spark配置](#Hive on Spark配置)
- [Spark on Hive配置](#Spark on Hive配置)
Spark官网
Hive on Spark配置
由于默认的引擎是MapRduce,在任务执行过程中由Hive解析元数据,然后把sql翻译成MapReduce任务,此时这个运行效率是非常慢的,因为要落盘,有大量的IO操作,但是好处就是不会出现OOM问题,处理非常大的数据是可以用它的。Hive中集成Spark,Hive既作为元数据存储,又负责解析HQL语句,只是将Hive的引擎改为Spark,由Spark负责运算工作,Spak计算是基于内存的效率较高,但要注意内存配置,数据量的时候容器出现OOM问题。
具体配置
-
去官网下载Spark,解压安装(这个是带有Hadoop依赖的,非纯净版)
-
配置环境变量
shellexport SPARK_HOME=/opt/module/spark export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin -
进入Hive的conf文件中,新建
spark-defaults.conf,添加以下内容shellspark.master=yarn spark.eventLog.enabled=true spark.eventLog.dir=hdfs://hadoop102:8020/spark/history-logDir spark.executor.memory=2g spark.driver.memory=2g spark.memory.offHeap.enabled=true spark.memory.offHeap.size=1g spark.driver.extraLibraryPath=/opt/module/hadoop-3.1.3/lib/native spark.executor.extraLibraryPath=/opt/module/hadoop-3.1.3/lib/native -
在HDFS上面创建目录
shellhdfs dfs -mkdir -p /spark hdfs dfs -mkdir -p /spark/history-logDir hdfs dfs -mkdir -p /spark/jars -
在Hive的hive-site.xml添加以下配置
xml<!--Spark依赖位置(注意:端口号8020必须和namenode的端口号一致)--> <property> <name>spark.yarn.jars</name> <value>hdfs://hadoop102:8020/spark/jars/*</value> </property> <!--Hive执行引擎指定为Spark--> <property> <name>hive.execution.engine</name> <value>spark</value> </property> <!--Hive和Spark连接超时时间--> <property> <name>hive.spark.client.connect.timeout</name> <value>10000ms</value> </property> -
在Spark的conf目录spark-env.sh文件中添加以下内容
shellexport SPARK_DIST_CLASSPATH=$(hadoop classpath) -
去官网下载Spark纯净版的安装包,把里面的jars目录下的所有文件,上传到刚刚HDFS创建的jars目录
-
测试:进入Hive客户端,创建一张测试表,通过insert测试是否以Spark执行
Spark on Hive配置
Spark on Hive是共用Hive中的元数据,由Spark来解析与执行sql语句,而且Spark提供了更灵活的编程接口,适用于各种数据处理需求,性能高于Hive on Spark。
-
把Hive中的hive-site.xml拷贝到Spark的conf目录下
-
然后添加以下内容,如果hive-site.xml包含以下配置,可不做修改,一定要确保Hive中的hive-site.xml文件也配置了开启元数据访问
xml<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!--Spark读取表的位置--> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <!--Spark读取Hive元数据--> <property> <name>hive.metastore.uris</name> <value>thrift://hadoop102:9083</value> </property> </configuration> -
将对应版本的mysql的驱动拷贝到Spark的jars目录下
shellcp /opt/module/hive-3.1.2/lib/mysql-connector-java-8.0.17.jar /opt/module/spark-3.0.0-with-hadoop/jars/ -
启动Hive的MetaStore(元数据)服务
shellnohup hive --service metastore 1> /opt/moule/hive-3.1.2/logs/metastore.log 2>&1 & -
然后启动spark-shell测试
shellscala> spark.sql("show databases").show(); +---------+ |namespace| +---------+ | default| | gxc| | test| +---------+ -
如果spark-shell里面查询数据出现中文乱码,则在Spark的conf目录中的spark-default.conf中添加以下配置
shellspark.driver.extraJavaOptions -Dfile.encoding=UTF-8 spark.executor.extraJavaOptions -Dfile.encoding=UTF-8 -
到此结束