Spark-SQL之Hive交互|使用内嵌Hive|外部Hive应用|运行Spark SQL CLI|代码中操作Hive

Hive交互

Apache Hive 是 Hadoop 上的 SQL 引擎,Spark SQL编译时可以包含 Hive 支持,也可以不包含。
包含 Hive 支持的 Spark SQL 可以支持 Hive 表访问、UDF (用户自定义函数)以及 Hive 查询语言(HiveQL/HQL)等。需要强调的一点是,如果要在 Spark SQL 中包含Hive 的库,并不需要事先安装 Hive。一般来说,最好还是在编译Spark SQL时引入Hive支持,这样就可以使用这些特性了。如果你下载的是二进制版本的 Spark,它应该已经在编译时添加了 Hive 支持。
若要把 Spark SQL 连接到一个部署好的 Hive 上,你必须把 hive-site.xml 复制到 Spark的配置文件目录中($SPARK_HOME/conf)。即使没有部署好 Hive,Spark SQL 也可以运行,需要注意的是,如果你没有部署好Hive,Spark SQL 会在当前的工作目录中创建出自己的 Hive 元数据仓库,叫作 metastore_db。此外,对于使用部署好的Hive,如果你尝试使用 HiveQL 中的 CREATE TABLE (并非 CREATE EXTERNAL TABLE)语句来创建表,这些表会被放在你默认的文件系统中的 /user/hive/warehouse 目录中(如果你的 classpath 中有配好的 hdfs-site.xml,默认的文件系统就是 HDFS,否则就是本地文件系统)。
spark-shell默认是Hive支持的;代码中是默认不支持的,需要手动指定(加一个参数即可)

使用内嵌Hive

  1. Hive 的元数据存储在 derby 中, 仓库地址:$SPARK_HOME/spark-warehouse

在这里插入图片描述

  1. 如果使用 Spark 内嵌的 Hive, 则什么都不用做, 直接使用即可.

在这里插入图片描述

外部Hive应用

如果Spark要接管Hive外部已经部署好的Hive,需要通过以下几个步骤。
 确定原有Hive是正常工作的
 需要把hive-site.xml拷贝到spark的conf/目录下
如果以前hive-site.xml文件中,配置过Tez相关信息,注释掉
 把Mysql的驱动copy到Spark的jars/目录下
 如果访问不到hdfs,则需要把core-site.xml和hdfs-site.xml拷贝到conf/目录下

cp /opt/module/hive/conf/hive-site.xml ./

   
   
  • 1

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

运行Spark SQL CLI

Spark SQLCLI可以很方便的在本地运行Hive元数据服务以及从命令行执行查询任务。在Spark目录下执行如下命令启动Spark SQ LCLI,直接执行SQL语句,类似Hive窗口。

在这里插入图片描述

代码中操作Hive

  1. 添加依赖
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-hive_2.11</artifactId>
    <version>2.1.1</version>
</dependency>
<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
    <version>1.2.1</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

代码实现

def main(args: Array[String]): Unit = {
    //创建上下文环境配置对象
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("SparkSQL_Demo")
val spark<span class="token operator">:</span> SparkSession <span class="token operator">=</span> SparkSession
  <span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
  <span class="token punctuation">.</span><span class="token function">enableHiveSupport</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
  <span class="token punctuation">.</span><span class="token function">master</span><span class="token punctuation">(</span><span class="token string">"local[*]"</span><span class="token punctuation">)</span>
  <span class="token punctuation">.</span><span class="token function">appName</span><span class="token punctuation">(</span><span class="token string">"SQLTest"</span><span class="token punctuation">)</span>
  <span class="token punctuation">.</span><span class="token function">getOrCreate</span><span class="token punctuation">(</span><span class="token punctuation">)</span>


spark<span class="token punctuation">.</span><span class="token function">sql</span><span class="token punctuation">(</span><span class="token string">"show tables"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">show</span><span class="token punctuation">(</span><span class="token punctuation">)</span>


<span class="token comment">//释放资源</span>
spark<span class="token punctuation">.</span><span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这里插入图片描述

### 回答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、付费专栏及课程。

余额充值