{SparkConf,SparkContext,HiveContext}和{SparkSession}的爱恨情仇详解

场 景

  手写Spark的时候,每个程序的主入口都会用到SparkConf,SparkContext,HiveContext或者SparkSession,那么这三者之间有什么联系呢?
  首先,带Context (SparkContext,HiveContext等,后续简称Context)关键字和SparkSession是Spark程序的主入口,SparkConf是加载环境配置信息,举个不恰当的比喻,SparkConf有点像画板,给你一开始的整个平面布局,长宽高设置,ContextSparkSession有点像画笔,你产生的各种请求及操作,但是前提不能脱离画板,总之{SparkConf,SparkContext,HiveContext}是一组,SparkSession是一组,SparkSession是spark 2.0以上版本的新产物。

Context和SparkSession的爱恨情仇

  Spark早期的版本,主要还是Spark Core,估计当时也没想太多,就给了最霸气的SparkContext,其实按照这个架构思想,叫CoreContext比较合适,所以早期版本也就基本用的SparkConf,SparkContext,后来Hive来了,那本着面向对象思想,Hive又要有自己的特性,所以基于SparkContext派生出HiveContext,后来Spark Stream来了,于是……
  这就有点无底洞了对吧,弊端就显示出来了,于是在spark 2.X版本就改进了这个架构,我不管你服务于什么对象的Context,你都给统一叫SparkSession,当然,也保证了SparkSession对之前各种Context的兼容性,如果你发现你身边的小伙伴用的是spark 2.X,但是却还在用SparkConf,SparkContext,那你要仔细研读下他的代码,不出意外的话80%是在走歪路,当然,代码不一定报错,因为SparkSession兼容Context,但是你可以大声的跟他说,大哥你out了,比如下面这段代码:

from pyspark.sql import HiveContext,SparkSession
        #初始化,如果要执行hive sql,需要在初始化中加入enableHiveSupport()
        spark = SparkSession.builder.master("yarn").appName("DistributeData").enableHiveSupport().getOrCreate()
        hive_context = HiveContext(spark)
        spark_df = spark.sql(hivesql)

  以上代码就是三者之间混用,虽然不报错,但是总有些瑕疵,其实改成下面这样的比较合理:

from pyspark.sql import SparkSession
        #初始化,如果要执行hive sql,需要在初始化中加入enableHiveSupport()
        spark = SparkSession.builder.master("yarn").appName("DistributeData").enableHiveSupport().getOrCreate()
        spark_df = spark.sql(hivesql)
        return spark_df

Context和SparkSession实战举列(pysaprk为例子)

  如果你用老版本的{SparkConf,SparkContext,HiveContext}组合,基本初始化代码如下,setAppName是设置程序跑的名字,方便在Yarn上监控起来方便,setMaster是选择程序跑的模式,一般生产都选择在资源管理器yarn模式下运行。

from pyspark import HiveContext,SparkContext,SparkConf

conf = SparkConf().setMaster("yarn").setAppName("HiveContext")
sc = SparkContext(conf=conf)
hc = HiveContext(conf)
hc.sql("select * from dw.ods_rs_assemble_tbd_device_style where event_day='20200420'").show()

  新版本,我们也不能太out对吧,新版本SparkSession你就用以下这种初始化的代码,setMaster变成了mastersetAppName变成了appName,删繁就简,功力不减反而更强。

from pyspark.sql import SparkSession

spark = SparkSession.builder.master("yarn").appName("DistributeData").enableHiveSupport().getOrCreate()
spark_df = spark.sql("select * from dw.ods_rs_assemble_tbd_device_style where event_day='20200420'").show()

spark-shell环境下的有趣发现

  现在,再想想,当你启动spark-shell后,如下场景。

(base) [hadoop@shucang-10 ~]$ spark-shell --master yarn --deploy-mode client --executor-memory 2G --executor-cores 1 --num-executors 4 --queue etl
2020-04-26 19:47:35 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
2020-04-26 19:47:42 WARN  Utils:66 - Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
Spark context Web UI available at http://shucang-10.szanba.ren:4041
Spark context available as 'sc' (master = yarn, app id = application_1587046987432_6527).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.3.3
      /_/

Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_141)
Type in expressions to have them evaluated.
Type :help for more information.

scala>

  你得细细的品以下关键字:

  • Spark context available as 'sc' (master = yarn, app id = application_1587046987432_6527).

  • Spark session available as 'spark'.
      其实这里就是在做我们实战代码的事情,spark-shell环境下是帮你初始化了两个对象sc和spark,才能让你很开心的直接在spark-shell里面写以下语句:

spark.sql("select * from dw.ods_rs_assemble_tbd_device_style where event_day='20200420'").show()

  看望这篇文章,是不是对SparkConf,SparkContext,HiveContextSparkSession有了深刻的印象了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

╭⌒若隐_RowYet——大数据

谢谢小哥哥,小姐姐的巨款

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值