Spark On Hive,通过spark sql模块访问和使用Hive,默认Spark预编译(pre-built)版不包含hive相关依赖,并不支持此功能,因此需要对spark源码进行重新编译,并进行相关的配置,下面是具体操作步骤:
1.下载最新版spark源码包
http://spark.apache.org/downloads.html
cd /data/soft/
wget -c http://apache.fayea.com/spark/spark-1.5.2/spark-1.5.2.tgz
tar -xzf spark-1.5.2.tgz
2.编译Spark源码
根据自己需要的hadoop版本进行编译并打成分发包
cd spark-1.5.2
./make-distribution.sh --tgz --name 2.3.0 -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0 -Phive -Phive-thriftserver
主要是通过maven进行编译,所以要下载很多依赖包,这个过程非常痛苦和漫长,可以先看一下spark-1.5.2/pom.xml文件,看看整合了哪些module,如果编译过程中报错,链接超时或者依赖包长时间无法下载,可以重试几次,或者手动在各个整合的module下面,进行预编译。
执行成功之后,会在生成一个分发包spark-1.5.2/spark-1.5.2-bin-2.3.0.tgz(注意这个包名称中的2.3.0就是前面执行命令中-name参数制定的名称)
3.部署Spark环境
mkdir /data/hadoop/
tar -xzf spark-1.5.2/spark-1.5.2-bin-2.3.0.tgz -C /data/hadoop/
4.确保Hive正常
我的Hive部署在/data/hadoop/hive-0.12.0-cdh5.1.0/
通过执行bin/hive进入hive交互环境,执行一下HQL语句看是否能够执行成功。
5.Spark on Hive配置
复制hive-site.xml文件到spark-1.5.2-bin-2.3.0/conf/下面
cp /data/hadoop/hive-0.12.0-cdh5.1.0/hive-site.xml /data/hadoop/spark-1.5.2-bin-2.3.0/conf/
修改spark-env.sh文件,添加如下配置(基于前一篇《Spark环境部署》配置基础上):
注:根据自己服务器环境情况配置
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79.x86_64
export HADOOP_HOME=/data/hadoop/hadoop-2.3.0-cdh5.1.0
export HADOOP_CONF_DIR=/data/hadoop/hadoop-2.3.0-cdh5.1.0/etc/hadoop
export YARN_CONF_DIR=/data/hadoop/hadoop-2.3.0-cdh5.1.0/etc/hadoop
export HIVE_HOME=/data/hadoop/hive-0.12.0-cdh5.1.0
export SCALA_HOME=/usr/local/scala-2.11.7
export SPARK_HOME=/data/hadoop/spark-1.5.2-bin-2.3.0
export SPARK_MASTER_IP=host20
export SPARK_MASTER_PORT=7077
export PYSPARK_PYTHON=/usr/local/bin/python2.7
export PYSPARK_DRIVER_PYTHON=/usr/local/bin/python2.7
export SPARK_LOCAL_IP=host20
export SPARK_YARN_QUEUE=hadoop
export SPARK_WORKER_CORES=10
export SPARK_WORKER_INSTANCES=1
export SPARK_WORKER_MEMORY=30G
export SPARK_WORKER_WEBUI_PORT=8081
export SPARK_EXECUTOR_CORES=1
export SPARK_EXECUTOR_MEMORY=5G
export SPARK_CLASSPATH=$SPARK_CLASSPATH:$HIVE_HOME/lib/mysql-connector-java-5.1.20-bin.jar
修改/etc/profile文件,添加如下配置(基于前一篇《Spark环境部署》配置基础上):
注:根据自己服务器环境情况配置
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.19.x86_64
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export SCALA_HOME=/usr/local/scala-2.11.7
export PATH=$PATH:$SCALA_HOME/bin
export SPARK_HOME=/data/hadoop/spark-1.5.2-bin-2.3.0
export PATH=$PATH:$SPARK_HOME/bin
export HADOOP_HOME=/data/hadoop/hadoop-2.3.0-cdh5.1.0
export PATH=$PATH:$HADOOP_HOME/bin
下面列出来我的hive-site.xml文件主要配置:
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://host220:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<!--
<property>
<name>hive.metastore.uris</name>
<value>thrift://host20:9083</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
<description>Port number of HiveServer2 Thrift interface. Can be overridden by setting $HIVE_SERVER2_THRIFT_PORT</description>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>host20</value>
<description>Bind host on which to run the HiveServer2 Thrift interface.Can be overridden by setting$HIVE_SERVER2_THRIFT_BIND_HOST</description>
</property>
-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>hdfs://mycluster/hive/warehouse</value>
</property>
注意:注释部分后面会介绍
6.通过jdbc方式直接访问Hive
启动master和worker
sbin/start-master.sh
sbin/start-slave.sh spark://host20:7077
使用spark-sql访问hive
bin/spark-sql –executor-cores 2 –total-executor-cores 4 –master spark://host20:7077
进来之后可以执行一下HQL语句,查看是否能访问到Hive中的数据
使用pyspark访问hive
bin/pyspark
>>> from pyspark.sql import HiveContext
>>> sqlContext=HiveContext(sc)
>>> results=sqlContext.sql("show databases").collect()
7.通过thrift方式间接访问Hive
需要配置启动hive metastore服务和spark的thriftserver
修改/data/hadoop/hive-0.12.0-cdh5.1.0/hive-site.xml,添加如下配置:
<property>
<name>hive.metastore.uris</name>
<value>thrift://host20:9083</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
<description>Port number of HiveServer2 Thrift interface. Can be overridden by setting $HIVE_SERVER2_THRIFT_PORT</description>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>host20</value>
<description>Bind host on which to run the HiveServer2 Thrift interface.Can be overridden by setting$HIVE_SERVER2_THRIFT_BIND_HOST</description>
</property>
并将新的hive-site.xml文件,替换掉spark下面的hive-site.xml文件,同步配置。
cp /data/hadoop/hive-0.12.0-cdh5.1.0/hive-site.xml /data/hadoop/spark-1.5.2-bin-2.3.0/conf/
启动metastore服务
./hive --service metastore > metastore.log 2>&1 &
启动spark的thriftserver
sbin/start-thriftserver.sh --executor-cores 2 --total-executor-cores 2 --master spark://host20:7077
8.集群部署
在其他服务器上,同步/data/soft/目录下面的spark-1.5.2-bin-2.3.0.tar.gz和hive-0.12.0-cdh5.1.0.tar.gz文件
rsync -az --include "soft/" --exclude "/*" host20::data /data/
每个服务器上执行下面的步骤
tar -xzf /data/soft/spark-1.5.2-bin-2.3.0.tar.gz -C /data/hadoop/
tar -xzf /data/soft/hive-0.12.0-cdh5.1.0.tar.gz -C /data/hadoop/
修改spark-env.sh中的配置与本服务器环境一致。