Spark2.0集成Hive操作的相关配置与注意事项
前言
Apache Hive已成功完成安装,请查阅相关教程以获取具体操作步骤:Linux基于Hadoop2.8.0集群安装配置Hive2.1.1及基础操作
补充说明
Hive中metastore(元数据存储)的三种方式:
内嵌Derby方式
Local方式
Remote方式
[一]、内嵌Derby方式
Hive默认启动模式主要用于单元测试场景;该存储方式存在一个主要局限性:即在同一时间段内仅能支持一个进程连接数据库。
配置文件 hive-site.xml 中jdbc URL、驱动、用户名、密码等的配置信息
执行初始化命令:schematool -dbType derby -initSchema
查看初始化后的信息: schematool -dbType derby -info
配置完成后就可在shell中以CLI的方式访问hive 进行操作验证。
[二]、Local方式
以本地Mysql数据库为例:创建好用户:hive;database:hive。
配置文件 hive-site.xml 中jdbc URL、驱动、用户名、密码等属性值配置信息
ps:需要把数据库的驱动包copy到目录 <HIVE_HOME>/lib 中
如果在初始状态下需要启动初始化命令,则使用MySQL作为数据库类型,并启动初始化配置:schematool -dbType mysql -initSchema
查看初始化后信息 schematool -dbType mysql -info
初始化后查看mysql中表情况:show tables;
配置完成后就可在shell中以CLI的方式访问hive 进行操作验证。
[三]、Remote方式
使用Postgres数据库(IP地址为192.168.174.200)作为示例来注册并配置 hive 用户及 hive 数据表。
远程连接通常需要分别设置服务端以及客户端的配置文件。
服务端的 hive-site.xml 中jdbc URL、驱动、用户名、密码等属性值配置如下:
ps:需要把Postgres的驱动包copy到目录 <HIVE_HOME>/lib 中
如果这是初始操作,则需启动初始配置流程,请输入以下命令:schematool -database.mysql -initSchema.
客户端中配置内容修改如下:

hive metastore 服务端启动命令:
hive --service metastore -p <port_num>
当不配置端口以启动metastore服务时,默认监听的是9083号端口,请确保客户端的Hive应用所使用的Hive代理服务器地址与该监听地址匹配。一旦服务端启动成功,则客户端能够顺利进行Hive操作。
以下异常,可通过Remote方式配置解决。
Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStor
Spark2.0安装
下载
官网下载地址:http://spark.apache.org/downloads.html

Spark 原始代码需要通过编译器构建才能运行;而 Scala 2.11 则需要从原始代码开始构建才能执行
基于用户提供的Hadoop预构建版本:这是一个名为"Hadoop free"的开源版本,适用于所有Hadoop版本
为 Hadoop 版本 2.7 及以上提供预编译选项:这些选项需与本地部署的 Hadoop 版本保持一致。此外还包括了从 Hadoop 大纲项目中支持的所有版本:包括从 HDFS 开始支持的 CDH(即可行解算器)版本。
解压
tar -zxvf spark-2.0.0-bin-hadoop2.7.tgz
移动文件夹
mv spark-2.0.0-bin-hadoop2.7 /usr/local/hadoop/
修改配置文件
新建修改spark-env.sh
cd /usr/local/hadoop/spark-2.0.0-bin-hadoop2.7/conf
cp spark-env.sh.template spark-env.sh
在spark-env.sh文件顶部添加以下内容
export SPARK_MASTER_HOST=127.0.0.1
export SPARK_LOCAL_IP=127.0.0.1
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.8.0
export HIVE_HOME=/usr/local/hadoop/apache-hive-2.1.1-bin
export HIVE_CONF_DIR=${HIVE_HOME}/conf
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HDFS_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_CLASSPATH=$HIVE_HOME/lib:$SPARK_CLASSPATH
根据实际情况进行相应修改

export SPARK_MASTER_HOST=127.0.0.1
export SPARK_LOCAL_IP=127.0.0.1
是为了解决 Spark2.0单机模式无法启动master的问题
未配置会显示以下异常
Exception in thread "main" java.net.BindException: 无法指定被请求的地址: Service 'sparkMaster' failed after 16 retries (starting from 7077)! Consider explicitly setting the appropriate port for the service 'sparkMaster' (for example spark.ui.port for SparkUI) to an available port or increasing spark.port.maxRetries.
集成访问已安装的Hive
复制HIVE_HOME/conf/hive-site.xml和hive-log4j.properties至SPARK_HOME/conf/目录中,并编辑spark-env.sh文件以添加
export HIVE_HOME=/usr/local/hadoop/apache-hive-2.1.1-bin
export SPARK_CLASSPATH=$HIVE_HOME/lib:$SPARK_CLASSPATH

另外一种方法是避免在屏幕上输出额外的INFO级别日志,并详细配置Spark的日志级别以达到预期效果。
具体的配置如下:
例如:设置日志级别为WARN并禁止打印到控制台。
这可以通过以下代码实现:
log4j.rootCategory=WARN
console
针对此类情况:
Caused by: MetaException(message:Version information not found in metastore. )
建议在conf/hive-site.xml中将hive.metastore.schema.verification属性设置为false以有效解除该问题

修改spark-submit、spark-sql
在文件顶部添加以下内容:
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.8.0
export HIVE_HOME=/usr/local/hadoop/apache-hive-2.1.1-bin
export HIVE_CONF_DIR=${HIVE_HOME}/conf
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HDFS_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
为了解决以下异常:
EXCEPTION: When running with master 'yarn' either HADOOP_CONF_DIR or YARN_CONF_DIR must be set in the environment. in spark
启动
启动spark-sql
spark-sql


启动spark-submit
spark-submit --class com.gm.hive.SparkHive.App --master yarn /usr/local/hadoop/kczyqktj_spark-0.0.1-SNAPSHOT-allinone.jar

JAVA编写Spark2.0程序的注意事项
访问已有Hive
.config("spark.sql.warehouse.dir", "/user/hive/warehouse/").enableHiveSupport()
完整示例
package com.gm.hive.SparkHive;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
/** * Spark sql获取Hive数据
* */
public class App {
public static void main(String[] args) {
SparkSession spark = SparkSession.builder().master("local[2]")
.appName("SparkHive")
.config("spark.sql.warehouse.dir", "/user/hive/warehouse/").enableHiveSupport()
.getOrCreate();
spark.sql("show databases").show();
spark.sql("show tables").show();
spark.sql("use db_hive_edu");
Dataset<Row> data = spark
.sql("select hc_storetypeid,count(hc_storetypeid) from db_hive_edu.hc_casewoodlist where hc_wpstate=2 and hc_storetypeid !='null' group by hc_storetypeid order by hc_storetypeid");
data.show();
}
}
可访问的文档链接:http://spark.apache.org/docs/2.0.0/sql-programming-guide.htmll
