文章目录
pyspark初始化
SparkContext
Spark中的主要接口,代表与Spark集群的连接。
在早期版本的Spark中,需要通过SparkContext对象来初始化Spark应用程序。在Spark 2.0之后,推荐使用SparkSession来替代。
-
创建RDD(弹性分布式数据集)。
-
控制应用程序的配置参数。
-
访问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应用程序的开发。
- 提供了一个统一的入口点来使用Spark功能,包括DataFrame和SQL操作。
- 简化了Spark应用程序的开发,提供了更高级别的API。
- 可以轻松地访问各种数据源(HIVE...)、执行结构化数据处理和SQL查询。
- 能够优化执行计划,并在后台自动管理连接,使得操作更加灵活和高效。
- 在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。这样就实现了通过命令行动态调整应用程序配置参数的效果。