Spark 基础知识-05

目录

一、Spark on Hive的客户端工具

1、原理

2、配置

3、在pycharm中连接spark的Thriftserver:10000

二、Spark综合案例

1、需求

2、数据准备

3、开发

三、Spark 3.0新特性

1、Adaptive Query Execution 自适应查询(SparkSQL)

2、Dynamic Partition Pruning 动态分区裁剪(SparkSQL)

3、增强的python API:Koalas


一、Spark on Hive的客户端工具

        1、原理

        回顾:Hive的执行有两种方式一种是原始的bin/hive(这种方式对中文不太支持,且操作不方便),另一种是hive开启Thriftserver服务即hiveserver2:10000,相当于打开了一个通道,可以供其他客户端工具连接hive,然后在其他工具上操作hive(DataGrip,DBeaver,Navicat)。

        Spark on Hive也一样有两种执行方式,一种是像bin/pyspark,bin/spark-sql,DataFrame API代码(pycharm代码)一样需要开发人员有一定的Spark RDD基础的命令行模式。另一种是Spark开启Thriftserver:10000服务,同hive一样可以供其他客户端工具连接spark,直接写SQL即可操作spark,只需要开发人员会写sql即可。此外,bin/pyspark,bin/spark-sql,DataFrame API代码(pycharm代码)执行方式都是临时的,关闭程序后或执行完代码后spark就不对外提供服务了,而Thriftserver执行方式提供了一个持续性的Spark on Hive集群模式,它提供10000端口持续对外提供服务。

        2、配置

        首先确保Spark on Hive已经配置完成,然后在hadoop用户下启动Thriftserver即可:

        点击完成即可实现与Saprk on Hive的连接:(如果出现驱动错误的问题,点击窗口-->首选项-->连接-->驱动-->maven-->添加:https://maven.aliyun.com/nexus/content/groups/public 然后重新下载驱动即可)

如果出现错误:Unexpected driver error occurred while connecting to the database
org/apache/hadoop/conf/Configuration
org/apache/hadoop/conf/Configuration
org.apache.hadoop.conf.Configuration
org.apache.hadoop.conf.Configuration

需要添加hadoop-core-1.2.1.jar包:

        3、在pycharm中连接spark的Thriftserver:10000

        首先需要安装pyhive包(可以实现连接spark的Thriftserver),安装pyhive包之前需要安装pyhive包所需的依赖,由于我们使用的是远程python,因此将所有东西安装在linux系统下:

        yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make gcc-c++ python-devel cyrus-sasl-devel cyrus-sasl-plain cyrus-sasl-gssapi -y

        pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyhive pymysql sasl thrift thrift_sasl 

二、Spark综合案例

        1、需求

        某公司是做零售业务的,出售各类商品,目前想要按省份维度统计各类商品的销售情况。

        需求一:统计各个省份的销售额

        需求二:TOP3销售省份中,有多少家店铺日均销售额1000+

        需求三:TOP3销售省份中,各个省份的平均单单价

        需求四:TOP3销售省份中,各个省份的支付类型比例

        将统计结果输出到mysql,以及Spark on Hive中

        2、数据准备mini.json

        3、开发

        报错:storeProvince列有歧义:

        由于top3_province_df_joined是由两个df对象join而来的,join以后会多出一个storeProvince列,因此后续操作过程中系统不知道到底在对那个storeProvince列进行操作。解决方法把其中一个storeProvince列改名:

三、Spark 3.0新特性

        1、Adaptive Query Execution 自适应查询(SparkSQL)

        由于缺乏或者不准确的数据统计信息(导致元数据标记的不理想)和对成本/网络IO的错误估算(执行计划调度)导致生成的初始物理执行计划不理想。Spark 3.0通过引入AQE技术可以实现在“运行时”对查询执行计划进行优化,从而提升性能。AQE主要提供三个自适应优化方向分别是动态合并Shuffle Partitions,动态调整join策略和动态优化倾斜join(Skew joins)。

        开启AQE:set spark.sql.adaptive.enabled = true;

        (1) 动态合并Shuffle Partitions

        用户在开始运行代码时,设置相对较多的shuffle分区数,AQE会在运行时将相邻的小分区合并为较大的分区。

         (2) 动态调整join策略

        与hive中的map join类似,例如当前有一条sql:“select * from a join b on a.key = b.key where b.value like '%xyz%';”,其中一张大表a,一张小表b。如果开启动态调整join策略,sql在运行过程中会检测到b表很小,此时join的策略会由sort merge join转换为broadcast hash join,将b表广播给每一个读取大表的分区内(内存中),使join操作提前完成。

        (3)动态优化倾斜join

        join时的数据倾斜可能导致负载的极端不平衡,并严重降低性能。当AQE检测到数据倾斜时,它可以将倾斜的分区分割成更小的分区,并将它们与另一侧的相应分区连接起来。

        触发条件:

        A:分区大小 > spark.sql.adaptive.skewJoin.skewedPartitionFactor (default=10) * "median partition size(中位数分区大小)"
        B:分区大小 > spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes (default = 256MB)
        2、Dynamic Partition Pruning 动态分区裁剪(SparkSQL)

        DPP是谓词下推的进一步优化方法,其目的是进一步减少从数据源读取数据的量,减少后续shuffle的数据,从而提高查询性能。DPP在星型模型中很常见,星型模型由多张维度表和一个事实表组成,DPP可以在运行时通过识别维度表过滤之后的分区来裁剪从事实表中读取的分区。如下图所示:

        例如:当前有一张事实表订单表,和一个维度表用户表:

        假设有select * from 订单表 join 用户表 on 订单表.购买用户id = 用户表.id and 用户表.age<30;

        如果没有谓词下推和DPP那么该sql在执行join时需要先将3行的维度表和10行的事实表join,进行了30次连接。如果有谓词下推没有DPP那么该sql在执行时会先将维度表进行过滤得到age<30的数据,此时join的双方是有一行数据的维度表和10行数据的事实表,进行了10次连接。优化后的sql:select * from 订单表 join (select * from 用户表 where age < 30)) on 订单表.购买用户id = 用户表.id;

如果谓词下推和DPP都有,那么在执行该sql时会在谓词下推的基础上,对事实表也进行一次filter操作,系统发现当前的join是内连接(订单表.购买用户id = 用户表.id),即在事实表中购买用户id不等于3的用户最终是没用的,可以将其过滤掉。此时join的双方是有一行数据的维度表和有3行数据的事实表,进行了3次连接。优化后的sql:select * from (select * from 订单表 where 订单表.购买用户id  IN (select id from 用户表 where age < 30)) join (select * from 用户表 where age < 30)) on 订单表.购买用户id = 用户表.id;

        开启动态分区裁剪(同AQE一样只要开启满足相应的条件会自动优化):

        set spark.sql.optimizer.dynamicPartitionPruning.enabled = true;

        3、增强的python API:Koalas

        在数据分析领域pandas API十分受欢迎,但仅限于单节点处理(底层运行不是分布式的,如果数据量比较大的情况下运行速度慢)。因此Koalas被开发出来了,它能够让Spark实现pandans API的功能,即使用pandas API来处理数据,但其底层走的是分布式的Spark程序,这样在面对海量分析数据时速度会很快。Koalas可以理解为pandas API的分布式版本。到目前为止,我们分别可以使用pyspark和koalas进行处理数据,其底层走的都是spark程序。

        安装Koalas:

        (1)Koalas DataFrame构建 

        # 将spark中的DataFrame对象转化为Koalas的DataFrame对象

        pandas的DataFrame对象不是分布式的,koalas的DataFrame对象是分布式的(与Spark中的DataFrame一样都是分布式的)

        # 直接构建

        (2)Koalas的常见方法

        由于koalas的本质就是pandas API的分布式版本,因此大部分的pandas方法koalas都可以直接调用,koalas和pandas的唯一区别就是一个是分布式运行,一个是本地运行。

        构建一个具有缺失值的数据:

        利用koalas的方法处理缺失值:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值