0%

spark中连接hive

spark连接 Hive 全指南:从配置到实战

Spark 与 Hive 的集成是大数据生态中常见的场景,Spark 提供了对 Hive 元数据和数据的无缝访问能力,允许用户通过 Spark SQL 操作 Hive 表数据。本文将详细讲解 Spark 连接 Hive 的配置步骤、访问方式及常见问题解决,帮助你快速实现两者的集成。

Spark 与 Hive 集成的核心原理

Spark 连接 Hive 的本质是通过共享 Hive 元数据实现数据访问:

  • 元数据(Metastore):Hive 的元数据存储在关系型数据库(如 MySQL)中,记录了表结构、分区信息等;
  • 数据存储:Hive 表数据通常存储在 HDFS 或对象存储(如 S3)中,格式包括 Parquet、ORC、CSV 等;
  • Spark 角色:Spark 作为计算引擎,通过读取 Hive 元数据定位数据位置,直接操作底层数据文件,替代 Hive 的 MapReduce 执行引擎。

Spark 连接 Hive 的前置条件

在配置集成前,需确保以下环境就绪:

  1. Hive 环境正常运行
    • Hive Metastore 服务已启动(负责元数据管理);
    • Hive 表数据已存储在 HDFS 或其他存储系统中。
  2. Spark 环境准备
    • 下载与 Hive 版本兼容的 Spark 发行版(推荐 Spark 2.4+ 搭配 Hive 2.3+);
    • 确保 Spark 节点能访问 Hive Metastore 和 HDFS 集群。
  3. 依赖组件
    • MySQL 驱动(Hive Metastore 若使用 MySQL 存储元数据);
    • Hadoop 配置文件(core-site.xmlhdfs-site.xml)。

Spark 连接 Hive 的配置步骤

集成 Hive 元数据配置

复制 Hive 配置文件

将 Hive 的核心配置文件复制到 Spark 的 conf 目录,确保 Spark 能读取 Hive 元数据信息:

1
2
3
4
# 复制 Hive 配置文件到 Spark conf 目录  
cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf/
cp $HADOOP_HOME/etc/hadoop/core-site.xml $SPARK_HOME/conf/
cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml $SPARK_HOME/conf/

hive-site.xml 中需包含 Hive Metastore 的连接信息(以 MySQL 为例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<property>  
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive_metastore?createDatabaseIfNotExist=true</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> <!-- Metastore 数据库用户名 -->
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hivepassword</value> <!-- Metastore 数据库密码 -->
</property>
添加 MySQL 驱动

若 Hive Metastore 使用 MySQL 存储元数据,需将 MySQL 驱动包放入 Spark 的 jars 目录:

1
2
3
4
# 下载 MySQL 驱动(版本需与 MySQL 兼容)  
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar
# 复制到 Spark jars 目录
cp mysql-connector-java-5.1.49.jar $SPARK_HOME/jars/
编译 Spark 支持 Hive(可选)

若使用的 Spark 发行版未预集成 Hive,需重新编译 Spark 并启用 Hive 支持:

1
2
# 进入 Spark 源码目录,启用 Hive 支持编译  
./build/mvn -Phive -Phive-thriftserver -DskipTests clean package

编译完成后,Spark 会生成包含 Hive 依赖的发行包,位于 assembly/target/scala-2.12/ 目录。

启动 Hive Metastore 服务

确保 Hive Metastore 服务已启动,否则 Spark 无法访问元数据:

1
2
3
4
# 后台启动 Hive Metastore  
nohup $HIVE_HOME/bin/hive --service metastore &
# 验证 Metastore 是否启动(默认端口 9083)
netstat -tlnp | grep 9083

Spark 访问 Hive 的四种方式

使用 Spark Shell 访问 Hive

Spark Shell 是交互式访问 Hive 的便捷方式,支持 Scala 和 Python 语法:

Scala 交互式访问
1
2
3
4
5
6
7
# 启动 Spark Shell(启用 Hive 支持)  
$SPARK_HOME/bin/spark-shell --master yarn --deploy-mode client

# 在 Shell 中执行 Hive SQL
scala> spark.sql("show databases").show() // 查看 Hive 数据库
scala> spark.sql("use default").show() // 切换数据库
scala> spark.sql("select * from user").show() // 查询 Hive 表
Python 交互式访问(PySpark)
1
2
3
4
5
6
# 启动 PySpark  
$SPARK_HOME/bin/pyspark --master yarn

# 执行 Hive SQL
>>> spark.sql("show tables").show()
>>> spark.sql("select count(*) from user").show()

使用 Spark SQL 命令行工具

Spark 提供了 spark-sql 命令行工具,语法与 Hive CLI 兼容,可直接执行 SQL 语句:

1
2
3
4
5
6
7
# 启动 spark-sql 客户端  
$SPARK_HOME/bin/spark-sql --master yarn

# 执行 Hive SQL 命令
spark-sql> show databases;
spark-sql> use default;
spark-sql> select name, age from user where age > 18;

spark-sql 支持大多数 HiveQL 语法,且执行效率高于 Hive 自带的 MapReduce 引擎。

使用 Spark Thrift Server + Beeline

Spark Thrift Server 兼容 HiveServer2 协议,允许通过 JDBC/ODBC 工具(如 Beeline)访问 Spark SQL,适合 BI 工具集成。

启动 Spark Thrift Server
1
2
3
4
5
# 后台启动 Thrift Server(默认端口 10000)  
nohup $SPARK_HOME/sbin/start-thriftserver.sh --master yarn &

# 验证服务是否启动(默认端口 10000)
netstat -tlnp | grep 10000
使用 Beeline 连接 Thrift Server
1
2
3
4
5
6
# 启动 Beeline 客户端并连接 Thrift Server  
$SPARK_HOME/bin/beeline -u jdbc:hive2://localhost:10000 -n hadoop

# 执行 SQL 命令
0: jdbc:hive2://localhost:10000> show tables;
0: jdbc:hive2://localhost:10000> select avg(age) from user;

通过 Spark 应用程序访问 Hive

在 Spark 批处理应用中,可通过 SparkSession 编程访问 Hive 表数据。

Scala 应用示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import org.apache.spark.sql.SparkSession  

object SparkHiveExample {
def main(args: Array[String]): Unit = {
// 初始化 SparkSession(启用 Hive 支持)
val spark = SparkSession.builder()
.appName("SparkHiveExample")
.enableHiveSupport() // 关键:启用 Hive 支持
.getOrCreate()

// 访问 Hive 表数据
val df = spark.sql("select name, age from default.user where age > 18")
df.show()

// 处理数据并写入 Hive 表
df.write.mode("append").saveAsTable("default.adult_users")

spark.stop()
}
}
提交应用程序
1
2
3
4
5
6
# 打包应用并提交到 YARN  
$SPARK_HOME/bin/spark-submit \
--class SparkHiveExample \
--master yarn \
--deploy-mode cluster \
/path/to/your/jar/spark-hive-example.jar

通过第三方 BI 工具访问

Spark Thrift Server 兼容 JDBC 协议,可与 Tableau、Power BI 等 BI 工具集成:

  1. 在 BI 工具中配置 JDBC 连接:
    • 驱动:Spark JDBC 驱动(spark-sql_2.12-${version}.jar);
    • URL:jdbc:hive2://<spark-thrift-server-ip>:10000/default
    • 用户名:Hadoop 用户名(如 hadoop)。
  2. 直接在 BI 工具中拖拽 Hive 表字段,生成可视化报表。

常见问题与解决方案

1. 元数据访问失败(ClassNotFoundException)

  • 问题hive-site.xml 未正确配置,或 MySQL 驱动缺失。
  • 解决
    • 确认 hive-site.xml 已复制到 Spark conf 目录;
    • 检查 Spark jars 目录是否包含 MySQL 驱动。

2. 权限问题(Permission denied)

  • 问题:Spark 运行用户无 HDFS 数据文件访问权限。

  • 解决

    • 确保 Spark 启动用户与 Hive 表数据所有者权限一致;

    • 在 Hadoopcore-site.xml中配置代理用户:

      1
      2
      3
      4
      5
      6
      7
      8
      <property>  
      <name>hadoop.proxyuser.spark.hosts</name>
      <value>*</value>
      </property>
      <property>
      <name>hadoop.proxyuser.spark.groups</name>
      <value>*</value>
      </property>

3. Thrift Server 连接失败(Connection refused)

  • 问题:Thrift Server 未启动,或端口被占用。
  • 解决
    • 检查 Thrift Server 进程是否存活:jps | grep ThriftServer
    • 更换端口启动:start-thriftserver.sh --hiveconf hive.server2.thrift.port=10001

4. 表数据读取为空(No such file or directory)

  • 问题:Spark 无法访问 HDFS 上的 Hive 表数据文件。
  • 解决
    • 确认 HDFS 服务正常:hdfs dfsadmin -report
    • 检查 Hive 表数据路径是否存在:hdfs dfs -ls /user/hive/warehouse/user

5. Spark Thrift Server 性能瓶颈

  • 问题:并发查询过多导致 Thrift Server 响应缓慢。
  • 解决
    • 调整 Thrift Server 资源:--executor-memory 4g --num-executors 10
    • 启用结果缓存:spark.sql.resultCache.size=1g

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10