SparkContext与SparkSession区别

文章目录

pyspark初始化

SparkContext

Spark中的主要接口,代表与Spark集群的连接。

在早期版本的Spark中,需要通过SparkContext对象来初始化Spark应用程序。在Spark 2.0之后,推荐使用SparkSession来替代。

  1. 创建RDD(弹性分布式数据集)。

  2. 控制应用程序的配置参数。

  3. 访问Spark执行环境中的各种服务。

    from pyspark import SparkConf, SparkContext
    from pyspark import SparkConf, SparkContext

    创建 SparkConf 对象并设置应用程序名称

    conf = SparkConf().setAppName("SparkContextExample").setMaster("local[*]")

    初始化 SparkContext

    sc = SparkContext(conf=conf)

    创建一个包含 1 到 10 的整数的 RDD

    data = range(1, 11)
    rdd = sc.parallelize(data)

    执行一些基本操作

    计算RDD中元素的平方和

    sum_of_squares = rdd.map(lambda x: x*x).reduce(lambda x, y: x + y)

    输出结果

    print("Sum of squares from 1 to 10 is:", sum_of_squares)

    停止 SparkContext

    sc.stop()

SparkSession

从Spark 2.0开始引入的新接口,可以看作是SparkContext和SQLContext的组合,简化了Spark应用程序的开发。

  1. 提供了一个统一的入口点来使用Spark功能,包括DataFrame和SQL操作。
  2. 简化了Spark应用程序的开发,提供了更高级别的API。
  3. 可以轻松地访问各种数据源(HIVE...)、执行结构化数据处理和SQL查询。
  4. 能够优化执行计划,并在后台自动管理连接,使得操作更加灵活和高效。
  5. 在Spark中,SparkSession是建议使用的主要入口点,可以进行数据处理、SQL查询等各种操作,提供了简单而强大的功能。

SparkContext用于底层的RDD编程和管理资源,而SparkSession是更高级别的API,支持结构化数据处理和SQL查询。

在Spark 2.0及以后版本,建议优先使用SparkSession,因为它整合了SparkContext和SQLContext,更方便和强大。

from pyspark.sql import SparkSession

# 创建一个Spark会话
spark = SparkSession.builder \
    .appName("MyApp") \
    .config("spark.driver.extraJavaOptions", "-Dfile.encoding=UTF-8") \
    .config("spark.executor.extraJavaOptions", "-Dfile.encoding=UTF-8") \
    .getOrCreate()
    

# 获取Spark上下文对象
sc = spark.sparkContext

# 通过并行化集合来创建一个RDD
data = [1, 2, 3, 4, 5]
rdd = sc.parallelize(data)

# 打印RDD中的元素
for num in rdd.collect():
    print(num)

# 停止Spark会话
spark.stop()

SparkConf

# 创建 SparkConf 对象并设置配置选项
conf = SparkConf()
conf.set("spark.app.name", "MySparkApp")
conf.set("spark.master", "local[*]")
conf.set("spark.some.config.option", "some-value")

# 创建的另一种方式
conf = SparkConf().setAppName("SparkConfExample").set("spark.some.config.option", "some-value")


#初始化 sparksession
spark = SparkSession.builder \
    .config(conf=conf) \
    .getOrCreate()
    
#不使用conf初始化 sparksession
spark = SparkSession.builder \
    .appName("MyApp") \
    .config("spark.driver.extraJavaOptions", "-Dfile.encoding=UTF-8") \
    .config("spark.executor.extraJavaOptions", "-Dfile.encoding=UTF-8") \
    .getOrCreate()

# 初始化 SparkContext
sc = SparkContext(conf=conf) 


#常见参数名
spark.app.name: 设置应用程序名称。
spark.master: 设置 master URL。可以local[*],也可以远程 "spark://192.168.0.76:7077" (但是远程一般会有python环境问题,除非环境一模一样)
spark.driver.memory: 设置 driver 内存大小。
spark.executor.instances: 设置 Executor 数量。
spark.executor.memory: 设置每个 Executor 的内存大小。
spark.executor.cores: 设置每个 Executor 的核心数
"hive.metastore.uris", "thrift://<metastore_host>:9083" hive链接
"spark.hadoop.fs.defaultFS", "hdfs://namenode:8020"     hdfs链接
#driver 和 executor 的 Java 选项,其中 -Dfile.encoding=UTF-8 指定了编码为 UTF-8。
"spark.driver.extraJavaOptions", "-Dfile.encoding=UTF-8"
"spark.executor.extraJavaOptions", "-Dfile.encoding=UTF-8"

spark-submit

当使用 spark-submit 提交应用程序时,Spark 会话会根据集群环境中的配置信息自动连接到远程的 HDFS 和 Hive,前提是集群中已经正确配置了相关的连接信息。在集群环境下,可以直接使用 spark-submit 来提交应用程序,而无需手动配置所有连接参数,即可顺利连接到远程的 Hive 和 HDFS。

常用参数
spark-submit 命令非常灵活,可以接受很多参数来配置和提交 Spark 应用程序。一些常见的 spark-submit 参数包括:
--class: 指定应用程序的入口类。
--master: 指定 Spark 应用程序运行的模式,比如 local、yarn、mesos 等。
--deploy-mode: 指定应用程序的部署模式,可以是 client 或 cluster。
--conf: 设置 Spark 配置属性。
--files 和 --jars: 指定额外上传到集群的文件和依赖 JAR 包。
--driver-memory 和 --executor-memory: 设置 Driver 和 Executor 的内存大小。
--num-executors: 指定 Executor 的数量。
--queue: 指定提交作业的队列。

优先级
spark-submit 命令中指定的参数通常会覆盖应用程序代码内部配置的参数。当使用 spark-submit 提交应用程序时,命令行参数会覆盖应用程序中硬编码的参数配置,以确保在不同环境下能够动态地调整应用程序的行为。
如果在应用程序代码中已经针对某些参数进行了固定设置,而在 spark-submit 中再次指定了相同参数,那么 spark-submit 中指定的参数值将优先生效。
这种机制使得在部署和运行应用程序时更加灵活,可以根据需要在不同环境下动态地调整参数配置,而无需修改应用程序代码

spark.conf.set("spark.executor.memory", "4g")
使用 spark-submit 提交应用程序时,通过命令行参数来覆盖这个设置,比如:

spark-submit --conf spark.executor.memory=6g your_app.py

在这种情况下,spark-submit 中指定的 spark.executor.memory=6g 参数值会覆盖应用程序代码中设置的 spark.executor.memory=4g,使得 Executor 的内存大小最终为 6GB 而不是 4GB。这样就实现了通过命令行动态调整应用程序配置参数的效果。
相关推荐
湫ccc4 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe5 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin5 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
哭泣的眼泪4085 小时前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
湫ccc6 小时前
《Python基础》之基本数据类型
开发语言·python
Natural_yz6 小时前
大数据学习17之Spark-Core
大数据·学习·spark
drebander7 小时前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
威威猫的栗子7 小时前
Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画
开发语言·python
墨染风华不染尘8 小时前
python之开发笔记
开发语言·笔记·python
Dxy12393102168 小时前
python bmp图片转jpg
python