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