spark-hive连接操作流程、踩坑及解决方法

本文详细指导了如何匹配Hadoop、Hive、Spark、Scala和MySQL版本,编译Spark源码,配置Hive安装与MySQLmetastore,以及Spark与Hive的连接和编程。包括了版本选择、Maven源切换、环境变量设置、编译流程和数据库连接配置等内容。
摘要由CSDN通过智能技术生成

1 简介

本篇将会解决以下5个问题

  1. hadoop-hive-spark-scala-java-mysql版本匹配
  2. hive-spark源码编译
  3. hive 安装并配置mysql作为metastore外存数据库
  4. spark连接hive外部包导入
  5. spark读写hive表程序

2 版本匹配

点击相应链接跳转至相应archive仓库

hadoop-2.7.1
hive 1.2.2
spark 2.1.0
scala 2.11.8
mysql 5.7.23 - jdbc-connector-5.1.40

3 spark hive支持版本源码编译

完整版教程在这里

3.1 spark-src下载

spark源码在此下载

3.2 maven换源

由于使用spark内置maven编译,需要添加国内镜像进行换源处理,能够加快速度;寻找该文件夹

>${SPARK_HOME}/build/apache-maven-3.3.9/conf/settings.xml

在镜像mirrors标签下添加

  <mirror>
	<id>alimaven</id>
	<name>aliyun maven</name>
	<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
	<mirrorOf>central</mirrorOf>
  </mirror>

换源到alimaven

3.3 spark编译

接下来,编辑/etc/profile文件,输出HADOOP_HOME系统环境变量,这个环境变量在build过程中需要系统能够访问

> vim /etc/profile
-----------
#HADOOP_HOME
export HADOOP_HOME=/Users/collinsliu/hadoop-2.7.1/
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
------------
> source /etc/profile
> hadoop version

最后,在终端中输入

./dev/make-distribution.sh --tgz --name h27hive -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.1 -Phive -Phive-thriftserver -DskipTests

进行spark-hive build操作

4 hive 安装与mysql-metastore配置

hive安装需要进行以下5个步骤

  1. MySQL5.1.27 DMG版本下载并安装, jdbc-connector5.1.40下载
  2. hive编写hive-site.xml|hive-env.sh, jdbc-connector复制到hive/lib文件夹下
  3. mysql建立metastore表格,hive初始化并成功连接mysql-metastore
  4. spark编写spark-env.sh包含hadoop|hive|scala路径
  5. hive-site.xml|core-site.xml|hdfs-site.xml 复制到spark/conf文件夹下

具体步骤参见这里

注: 教程中使用hive-1.2.1,由于apache-hive官方访问源更新,因此我们使用hive-1.2.2仍旧能够兼容

4.1 mysql下载安装

在mac电脑上,我们需要选择mysql 5.7.23 DAG版本,然后直接以app形式进行安装即可

需要注意的是,此种方式下mysql会以服务的方式安装在电脑中,因此我们需要卸载掉之前可能安装着的mysql版本。

4.1.1 为mysql设置系统环境变量

如果mysql指令未被系统识别,我们需要手动添加系统环境变量

> vim /etc/profile
----------
#MYSQL_HOME
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin
----------
> source /etc/profile

然后,我们便可以使用

> mysql -uroot -p

进行初次登陆

4.1.2 初次登陆更改root身份密码

在安装最后,系统会自动生成root管理员角色的密码

在这里插入图片描述

我们如果记录下来,安装后首次登陆后可以采用如下指令:

ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

在登陆入mysql后更改密码

4.1.3 安装后直接更改密码

在安装后,如果我们没有记录系统生成的初始密码,可以采用如下方式

> mysqladmin -u root passwrod 新密码

暴力修改密码

4.2 hive初始化

4.2.1 编写hive-site.xml文件

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>

<!-- jdbc 连接的 URL -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
</property>

<!-- jdbc 连接的 Driver-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>

<!-- jdbc 连接的 username-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>

<!-- jdbc 连接的 password -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
</property>

<!-- Hive 元数据存储版本的验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>

<!--元数据存储授权-->

<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>

<property>
<name>hive.exec.scratchdir</name>
<value>hdfs://localhost:9000/hive/opt</value>
</property>

<!-- Hive 默认在 HDFS 的工作目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>

<!-- 指定 hiveserver2 连接的 host -->
<property>
<name>hive.server2.thrift.bind.host</name>4
<value>localhost</value>
</property>

<!-- 指定 hiveserver2 连接的端口号 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>

<!-- 指定本地模式执行任务,提高性能 -->
<property>
<name>hive.exec.mode.local.auto</name>
<value>true</value>
</property>
</configuration>

4.2.2 编写hive-env.sh

# Set HADOOP_HOME to point to a specific hadoop install directory
export HADOOP_HOME=/Users/collinsliu/hadoop-2.7.1/

# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/Users/collinsliu/hive-1.2.2/conf

4.2.3 初始化hive-metastore

> cd ${hive_home}/bin
> ./schematool -dbType mysql -initSchema

4.2.4 复制jdbc-connector依赖包

jdbc-connector复制到 ${hive_home}/lib文件夹下

4.3 编写spark-env.sh

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home
export SCALA_HOME=/Users/collinsliu/scala-2.11.8
export HIVE_CONF_DIR=/Users/collinsliu/hive-1.2.2/conf
export HADOOP_CONF_DIR=/Users/collinsliu/hadoop-2.7.1/etc/hadoop
export SPARK_DIST_CLASSPATH=$(/Users/collinsliu/hadoop-2.7.1/bin/hadoop classpath)
export CLASSPATH=$CLASSPATH:/Users/collinsliu/hive-1.2.2/lib
export SPARK_CLASSPATH=$SPARK_CLASSPATH:/Users/collinsliu/hive-1.2.2/lib/mysql-connector-java-5.1.40.jar

4.4 完善配置

hive-site.xml|core-site.xml|hdfs-site.xml 复制到${spark_home}/conf文件夹下

5 hive-spark连接与编程

相关项目以及pom文件配置可以参见我的这个代码仓库

配置项目时如果出现包导入错误,可以参见我的这篇文章

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 问题描述: 在使用Spark SQL操作Hive时,出现了报错,如下所示: ``` Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.exec.Utilities.clearWorkMap()V at org.apache.spark.sql.hive.client.ClientWrapper.<init>(ClientWrapper.scala:204) at org.apache.spark.sql.hive.client.IsolatedClientLoader.createClient(IsolatedClientLoader.scala:271) at org.apache.spark.sql.hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:362) at org.apache.spark.sql.hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:266) at org.apache.spark.sql.hive.HiveSharedState.metadataHive$lzycompute(HiveSharedState.scala:39) at org.apache.spark.sql.hive.HiveSharedState.metadataHive(HiveSharedState.scala:38) at org.apache.spark.sql.hive.HiveSharedState.externalCatalog$lzycompute(HiveSharedState.scala:46) at org.apache.spark.sql.hive.HiveSharedState.externalCatalog(HiveSharedState.scala:45) at org.apache.spark.sql.hive.HiveSessionState.catalog$lzycompute(HiveSessionState.scala:50) at org.apache.spark.sql.hive.HiveSessionState.catalog(HiveSessionState.scala:48) at org.apache.spark.sql.hive.HiveSessionState$$anon$1.<init>(HiveSessionState.scala:63) at org.apache.spark.sql.hive.HiveSessionState.analyzer$lzycompute(HiveSessionState.scala:63) at org.apache.spark.sql.hive.HiveSessionState.analyzer(HiveSessionState.scala:62) at org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:49) at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:64) at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:582) ``` 解决方法: 该问题是由于Hive版本与Spark版本不兼容导致的。解决方法如下: 1. 确认Hive版本与Spark版本是否兼容,可以在Spark官网查看版本兼容性。 2. 如果版本不兼容,可以升级或降级Hive版本,或者升级或降级Spark版本。 3. 如果版本兼容,可以尝试重新启动SparkHive服务,或者重新编译SparkHive。 4. 如果以上方法都无法解决问题,可以尝试使用其他的SQL操作Hive的工具,如Beeline等。 总之,要保证SparkHive版本兼容,并且正确配置SparkHive的环境,才能避免出现该问题。 ### 回答2: 在使用Spark-SQL操作Hive时,常常会遇到一些错误。其中一些常见的错误可能包括: 1. ClassNotFoundException: org.apache.hadoop.hive.ql.metadata.HiveException 这个错误通常表示你的 Spark 集群无法找到 Hive 函数库。可能的解决方案是确认你是否正确安装 Hive 或者使用了正确配置的 Spark 路径: - 如果你没有安装 Hive,你需要从 Hive 下载页面下载Hive 安装。成功安装后,需要将 $HIVE_HOME/lib/hive-exec.jar 添加到 Spark 的 classpath 中(例如通过 spark.driver.extraClassPath 和 spark.executor.extraClassPath 参数来添加)。 - 如果你安装了 Hive,但是仍然出现此错误,你需要检查你的 Spark 是否在使用正确的类路径。可能需要设置 PATH 或者 SPARK_DIST_CLASSPATH 等环境变量。 2. org.apache.spark.SparkException: Exception thrown in awaitResult 如果出现这个错误,通常说明 Spark-SQL 查询需要更多的内存或者计算能力。可能需要调整 Spark-SQL 相关的配置: - 设置 Spark 的执行器内存和执行器核心(例如通过 spark.executor.memory 和 spark.executor.cores 这两个参数),以确保足够的计算资源; - 增加 Spark-SQL 相关的内存限制(例如通过设置 spark.sql.shuffle.partitions、spark.sql.autoBroadcastJoinThreshold、spark.driver.memory 等参数); - 减小查询数据量等其他引起内存不足的原因。 3. Command failed: java.io.IOException: Cannot run program "hadoop" 如果出现这个错误,可能是由于缺少 Hadoop CLI 或者 Hadoop 开发包(Hadoop SDK)。 - 确认你已经安装了 Hadoop CLI 和 Hadoop SDK - 确认 Spark 的 Hadoop 配置和你的集群匹配。具体来说,你需要确保环境变量 HADOOP_HOME 或者 HADOOP_CONF_DIR 指向正确的路径,或者在 Spark 集群初始化时正确设置好 Hadoop 配置。 总之,遇到 Spark-SQL 操作 Hive 中的错误时,首先需要明确错误的原因,然后根据具体情况采用相应的解决方案。常见的解决方案包括: - 确认 Hive 安装及环境变量设置是否正确; - 调整 Spark-SQL 相关参数以适应查询需求; - 确保 Hadoop CLI 及 Hadoop SDK 是否已正确安装。 ### 回答3: 在使用Spark-SQL操作Hive时,可能会遇到一些常见的报错,以下是其中一些问题和可能的解决方案。 1. hive文件丢失或权限不足 有时候,您在使用Spark-SQL操作Hive时,可能会遇到hive文件丢失或无法访问的权限问题。这可能是由于文件系统权限或文件本身的原因导致的。为了解决这个问题,您应该确保获取足够的权限来访问hive文件,并且检查您的文件系统是否正确。 2. classnotfoundexception:HiveCli 当您使用Spark-SQL操作Hive时,您可能会遇到一个类找不到的错误-"classnotfoundexception:HiveCli"。 这是因为hive-jdbc驱动程序文件缺失或未正确设置驱动程序路径所导致的。Solution是安装hive-jdbc驱动程序,并将其正确设置为Spark应用程序的驱动程序路径。 3. NoClassDefFoundError: org/apache/hive/service/cli/thrift/ThriftCLIService 这个错误的原因是由于您的Spark版本与Hive版本不适配,具体来说是Spark版本过高,导致Hive使用的jar包不兼容。解决方法是降低Spark版本或使用Spark程序库的API时使用其兼容的Hive版本。 4. MetaException(message: NoSuchObjectException:database not found) 如果您正在尝试使用Spark-SQL查询Hive数据库,并且收到此错误消息,则表示您正在尝试访问不存在的数据库。 解决方法是创建一个名为该数据库的数据库或检查查询中是否存在语法错误。 5. Spark-SQL执行查询失败 Spark-SQL执行查询失败往往是由于应用程序逻辑或数据源的不足所致。解决方法包括检查您的查询语句是否正确设置,处理空值和异常情况,以及监视应用程序和集群资源以提高性能。 为了避免上述报错,您应该确保在使用Spark-SQL操作Hive之前做好准备工作,包括检查应用程序和数据源的兼容性,设置正确的驱动程序路径,并提供足够的资源来处理您的查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值