大数据应用之 --- SparkSQL和 Hive的集成

大数据应用之 — SparkSQL和 Hive的集成

创建软链接

ln -s /opt/hive-3.1.3/conf/hive-site.xml /opt/spark-3.2.1/conf/hive-site.xml

复制mysql连接jar包

cp /opt/hive-3.1.3/lib/mysql-connector-java-5.1.48.jar /opt/spark-3.2.1/jars/

修改配置spark-defaults.conf

vi /opt/spark-3.2.1/conf/spark-defaults.conf

#增加如下内容
spark.serializer                 org.apache.spark.serializer.KryoSerializer
spark.driver.memory              512m
spark.executor.extraJavaOptions  -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"

vi /opt/spark-3.2.1/conf/hive-site.xml
#增加如下内容
	<property>  
		<name>hive.metastore.uris</name>  
		<value>thrift://hadoop-node1:9083</value>  
	</property> 

启动spark-sql测试

spark-sql --master yarn
#进入客户端,进行sql语句操作
spark-sql (default)> show databases;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cyJJjqOc-1657903530540)(C:\Users\yuanf\AppData\Roaming\Typora\typora-user-images!在这里插入图片描述
)]

yarn日志:

发现只有一个job:

在这里插入图片描述

点进去能看到每一次执行sql语句:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJQH3IxG-1657903530547)(C:\Users\yuanf\AppData\Roaming\Typora\typora-user-images在这里插入图片描述

解决问题

1.  WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
2.  WARN HiveConf: HiveConf of name hive.metastore.event.db.notification.api.auth does not exist
3.  WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

其中问题2很奇怪,实际上hive-site.xml里是有这个参数的,不知道为啥不认

估计是弃用了,干脆注释掉,问题解决

问题3:

【原因】spark预先编译的hadoop版本为32位的,放在64位的机器上执行会报这个错误

【解决】在spark的conf目录下,在spark-env.sh文件中加入LD_LIBRARY_PATH环境变量

​ LD_LIBRARY_PATH=$HADOOP_HOME/lib/native

vi /opt/spark-3.2.1/conf/spark-env.sh
#添加以下内容:
LD_LIBRARY_PATH=$HADOOP_HOME/lib/native 

问题1:

【原因】是因为Spark提交任务到yarn集群,需要上传相关spark的jar包到HDFS。
【解决】 提前上传到HDFS集群,并且在Spark配置文件指定文件路径,就可以避免每次提交任务到Yarn都需要重复上传文件。下面是解决的具体操作步骤:

### 打包jars,jar相关的参数说明
#-c  创建一个jar包
# -t 显示jar中的内容列表
#-x 解压jar包
#-u 添加文件到jar包中
#-f 指定jar包的文件名
#-v  生成详细的报造,并输出至标准设备
#-m 指定manifest.mf文件.(manifest.mf文件中可以对jar包及其中的内容作一些一设置)
#-0 产生jar包时不对其中的内容进行压缩处理
#-M 不产生所有文件的清单文件(Manifest.mf)。这个参数与忽略掉-m参数的设置
#-i    为指定的jar文件创建索引文件
#-C 表示转到相应的目录下执行jar命令,相当于cd到那个目录,然后不带-C执行jar命令

cd /opt/spark-3.2.1
jar cv0f spark-libs.jar -C ./jars/ .

### 在hdfs上创建存放jar包目录
hadoop fs -mkdir -p /spark/jars
## 上传jars到HDFS
hadoop fs -put spark-libs.jar /spark/jars/

## 增加配置spark-defaults.conf 
vi spark-defaults.conf 
#增加以下内容
spark.yarn.archive=hdfs://lsyk01:9000/spark/jars/spark-libs.jar

验证:

spark-sql --master yarn

在这里插入图片描述

spar-sql客户端

  1. sql语句

    spark-sql --master yarn
    #输入sql语句即可
    

    在这里插入图片描述

    yarn里只有一个纵队appid

  2. 执行sql文件

    编写sql 文件 /works/sparksql.sql:

    use lsyk;
    select count(1) from lsyk.ls;
    -- select * from ls,yk;
    desc ls;
    show create table pqt;
    /*
    select * from pqt
    order by score;
    */
    select ls.name
    ,row_number() over(partition by ls.name --- 这是注释
                       order by ls.age) as rn  /* 这是注释2 */
                    from ls,yk ;
                       
    

insert into table pqt partition (ds=‘p1’)
select ls.name,ls.age
from ls,
yk
;

执行:

```shell
 spark-sql --master yarn -f /works/sparksql.sql

执行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFwFIPLE-1657903530552)(C:\Users\yuanf\AppData\Roaming\Typora\typora-user-images\image-20220616000837453.png)]

由此可见,支持换行,注释,中文等各格式,完全可以直接这样写个shell,传参,传sql文件,替换参数,写入新sql文件,作为spark-sql的-f文件执行

但是,yarn的name无法定义

在这里插入图片描述

spark-submit提交

spark-submit \
  --master yarn \
  --class org.apache.demo \
  --jar XX \ 
  --num-executors 100 \
  --executor-memory 6G \
  --executor-cores 4 \
  --driver-memory 1G \
  --conf spark.default.parallelism=1000 \
  --conf spark.storage.memoryFraction=0.5 \
  --conf spark.shuffle.memoryFraction=0.3 \


### Spark SQLHive SQL 的主要区别及适用场景 #### 主要区别 1. **执行引擎** Hive SQL 基于 MapReduce 或 Tez 执行引擎运行,而 Spark SQL 使用的是 Apache Spark 的分布式计算框架作为其底层执行引擎。由于 Spark 支持内存计算更高效的 DAG(有向无环图)调度机制,因此在大多数情况下,Spark SQL 的性能优于传统 Hive SQL[^1]。 2. **查询优化器** Hive SQL 使用自己的查询优化器来解析转换 HQL (Hive Query Language),并将其编译成 MapReduce/Tez 作业。相比之下,Spark SQL 配备了 Catalyst 查询优化器,能够动态调整查询计划以适应不同的数据分布情况,从而显著提升查询效率[^4]。 3. **API 编程模型** Spark SQL 不仅支持标准的 SQL 接口,还引入了 DataFrame Dataset API,允许开发者通过 Scala、Python 或 Java 编程语言编写复杂的 ETL 流程。这种灵活性使得 Spark SQL 更适合需要复杂逻辑的数据处理任务。然而,Hive SQL 更专注于提供类 SQL 的接口,通常被用来完成简单的批处理工作负载[^2]。 4. **实时性交互性** Spark SQL 可以很好地融入 Spark Streaming 中实现流式数据分析,具备低延迟特性,非常适合构建交互式的 BI 应用程序或者近线分析平台。相反,尽管现代版本的 Hive 已经有所改进,但它仍然主要是针对大规模批量运算设计的工具,对于亚秒级响应的需求可能无法满足[^3]。 5. **生态系统集成度** 虽然两者都可以连接外部存储系统如 HDFS, Amazon S3 等,并且都能够访问多种文件格式比如 Parquet, ORC 文件等等;但是 Spark 生态圈更加广泛一些,它可以直接对接 Kafka, Cassandra, Elasticsearch 等流行的大数据技术栈成员,进一步增强了跨领域协作的可能性[^5]。 #### 适用场景 - 如果项目需求涉及到频繁的小规模随机读写操作或者是毫秒级别反馈速度的要求,则推荐采用 Spark SQL- 对于那些只需要周期性的大数据量离线统计汇总业务而言,继续沿用成熟的 Hive 解决方案可能是更为稳妥的选择。 ```python from pyspark.sql import SparkSession # 创建 SparkSession 实例 spark = SparkSession.builder \ .appName("Example") \ .enableHiveSupport() \ .getOrCreate() # 加载 Hive 表中的数据 df_hive = spark.sql("SELECT * FROM my_table") # 展示前几条记录 df_hive.show() ``` 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值