spark中连接hive

Spark 连接 Hive:Spark 读 Hive 的元数据,用自己的引擎跑 SQL

Spark 连接 Hive,本质就一句话:Spark 用 Hive 的元数据(表结构、分区、位置),然后用 Spark 的引擎跑 SQL,替代 Hive 的 MapReduce。

  • Hive 管”表在哪儿、长什么样”(元数据存在 MySQL 里)
  • Spark 管”怎么算”(用 Spark 引擎执行 SQL)
  • 数据还在 HDFS 上,没动过

结果:同样的 SQL,Spark 跑得比 Hive 快几倍

配置:三步让 Spark 认识 Hive

Step 1:把 Hive 的配置文件给 Spark 用

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 元数据存在哪个 MySQL 里,Spark 读了就知道去哪找表结构。

Step 2:放 MySQL 驱动

如果 Hive 元数据存在 MySQL 里,Spark 需要 MySQL 驱动才能连。

cp mysql-connector-java-8.0.28.jar $SPARK_HOME/jars/

Step 3:启动 Hive Metastore 服务

nohup $HIVE_HOME/bin/hive --service metastore &

Spark 通过 Metastore 服务(端口 9083)读元数据,不是直接连 MySQL。

验证:

netstat -tlnp | grep 9083   # 看 Metastore 有没有起来

配置完怎么验证?

启动 Spark Shell,试试能不能查 Hive 表:

spark-shell --master local[*]
spark.sql("SHOW DATABASES").show()
spark.sql("USE default")
spark.sql("SELECT * FROM user LIMIT 10").show()

能查到数据,说明配置成功了。

四种访问方式:根据场景选

方式 适合谁 特点
Spark Shell 开发调试 交互式,写 Scala/Python
spark-sql 命令行查数 类似 Hive CLI,直接写 SQL
Thrift Server + Beeline BI 工具、多用户 JDBC 服务,可被 Tableau 等工具连
Spark 应用程序 生产任务 写 Jar 包提交,跑批处理

方式1:Spark Shell(交互式开发)

spark-shell --master yarn
spark.sql("SELECT * FROM hive_table").show()
spark.sql("INSERT INTO hive_table SELECT ...").show()

适合: 写代码调试、验证 SQL。

方式2:spark-sql(命令行 SQL)

spark-sql --master yarn
spark-sql> SHOW TABLES;
spark-sql> SELECT COUNT(*) FROM user;

适合: 习惯 Hive CLI 的人,直接在终端写 SQL。

方式3:Thrift Server + Beeline(JDBC 服务)

启动 Thrift Server:

$SPARK_HOME/sbin/start-thriftserver.sh --master yarn

用 Beeline 连:

beeline -u jdbc:hive2://localhost:10000 -n hadoop

适合: Tableau、Power BI 等 BI 工具连 Spark,或者多个用户共用。

Thrift Server 的资源参数:

start-thriftserver.sh \
  --master yarn \
  --executor-memory 4g \
  --num-executors 10

方式4:Spark 应用程序(生产批处理)

import org.apache.spark.sql.SparkSession

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

    spark.sql("SELECT * FROM default.user").show()

    // 结果写回 Hive
    spark.sql("INSERT OVERWRITE TABLE default.result SELECT ...")

    spark.stop()
  }
}

提交:

spark-submit \
  --class HiveApp \
  --master yarn \
  --deploy-mode cluster \
  my-app.jar

适合: 定时任务、ETL 作业。

常见问题

1. 报错:Table not found

Spark 没读到 Hive 元数据。检查 hive-site.xml 有没有在 $SPARK_HOME/conf/ 下,Metastore 有没有启动。

2. 报错:ClassNotFoundException: com.mysql.jdbc.Driver

MySQL 驱动没放对。确认 mysql-connector-java-*.jar 在 $SPARK_HOME/jars/ 下。

3. 报错:Permission denied

Spark 用户没有 HDFS 数据的读权限。检查 Hive 表数据目录的权限,或者用有权限的用户启动 Spark。

4. 报错:Connection refused

Thrift Server 没起来,或者端口被占。确认进程在:

jps | grep ThriftServer