直接用pyspark 的配置
1 | 1.vim ~/.bashrc |
运行代码
1 | spark-submit new.py |
基本须知
1 | 1.spark程序必须做的第一件事就是创建一个sparkcontext对象(Spark如何访问集群) |
RDD操作
1 | 转换: |
自带案例1
1 | textFile = spark.read.text("README.md") |
查找包含最多单词的行
1 | from pyspark.sql.functions import * |
spark操作mysql
1 | ####注意对应版本的jar包要放在jars文件夹下https://mvnrepository.com/artifact/mysql/mysql-connector-java |
spark操作clickhouse
1 | companys = spark.read.format("jdbc"). \ |
spark存成不同格式(csv,json,text,parquet)
1 | jdbcDF.select("names").write.text("/root/mimo/people_text") |
Spark包
1 | pyspark.SparkContext: |
pyspark.sql
统计成绩案例
1 | #studentExample 例子 练习 |
saprk sql和dataframe
1 | df.show() #展示数据 |
createDataFrame
1 | DataFrame从RDD,列表或创建一个pandas.DataFrame。 |
#####DataFrame操作
1 | #按照一列进行排序 |
SparkConf====>资源控制,配置spark
1 | sc_conf = SparkConf() |
SparkContext
1 | SparkContext每个JVM仅应激活一个。在创建新 的活动目录之前,必须先停止活动目录 |
#####其他方法
1 | parallelize([1,2,3],3) 分发本地Python集合以形成RDD |
aggregate
1 | 1、>>> seqOp = ( lambda x, y: (x[ 0 ] + y, x[ 1 ] + 1 )) |
1 | Application来说,资源是Executor。对于Executor来说资源是内存、core |
提交代码优化
1 | https://www.cnblogs.com/hd-zg/p/6089207.html 原文 |
资源参数调优
1 | https://www.cnblogs.com/hd-zg/p/6089207.html |
开发调优
1 | https://blog.csdn.net/u012102306/article/details/51322209 |
数据倾斜调优
1 | 整个Spark作业的运行进度是由运行时间最长的那个task决定的。数据倾斜只会发生在shuffle过程中 |
shuffle调优====>相比其他三个较为次要
1 | 大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。 |
1 | >>> from pyspark.sql.functions import pandas_udf, PandasUDFType |
下面是使用RDD的场景和常见案例:
- 你希望可以对你的数据集进行最基本的转换、处理和控制;
- 你的数据是非结构化的,比如流媒体或者字符流;
- 你不希望像进行列式处理一样定义一个模式,通过名字或字段来处理或访问数据属性;
- 你并不在意通过DataFrame和Dataset进行结构化和半结构化数据处理所能获得的一些优化和性能上的好处;
该什么时候使用DataFrame或Dataset呢?
如果你需要丰富的语义、高级抽象和特定领域专用的API,那就使用DataFrame或Dataset;
如果你的处理需要对半结构化数据进行高级处理,如filter、map、aggregation、average、sum、SQL查询、列式访问或使用lambda函数,那就使用DataFrame或Dataset;
如果你想在编译时就有高度的类型安全,想要有类型的JVM对象,用上Catalyst优化,并得益于Tungsten生成的高效代码,那就使用Dataset;
如果你想在不同的Spark库之间使用一致和简化的API,那就使用DataFrame或Dataset;
如果你是R语言使用者,就用DataFrame;
如果你是Python语言使用者,就用DataFrame,在需要更细致的控制时就退回去使用RDD;
DataFrame与RDD相同之处,都是不可变分布式弹性数据集。不同之处在于,DataFrame的数据集都是按指定列存储,即结构化数据。相似于传统数据库中的表。DataFrame的设计是为了让大数据解决起来更容易。
RDD适合需要low-level函数式编程和操作数据集的情况;DataFrame和Dataset适合结构化数据集,用high-level和特定领域语言(DSL)编程,空间效率高和速度快。
在正常情况下都不推荐使用 RDD 算子
- 在某种抽象层面来说,使用 RDD 算子编程相当于直接使用最底层的 Java API 进行编程
- RDD 算子与 SQL、DataFrame API 和 DataSet API 相比,更偏向于如何做,而非做什么,这样优化的空间很少
- RDD 语言不如 SQL 语言友好
仅在一些特殊情况下可以使用 RDD
- 你希望可以对你的数据集进行最基本的转换、处理和控制;
- 你的数据是非结构化的,比如流媒体或者字符流;
- 你想通过函数式编程而不是特定领域内的表达来处理你的数据;
- 你不希望像进行列式处理一样定义一个模式,通过名字或字段来处理或访问数据属性(更高层次抽象);
- 你并不在意通过 DataFrame 和 Dataset 进行结构化和半结构化数据处理所能获得的一些优化和性能上的好处;
DataFrame
与 RDD 相似,DataFrame 也是数据的一个不可变分布式集合。但与 RDD 不同的是,数据都被组织到有名字的列中,就像关系型数据库中的表一样。设计 DataFrame 的目的就是要让对大型数据集的处理变得更简单,它让开发者可以为分布式的数据集指定一个模式,进行更高层次的抽象。它提供了特定领域内专用的 API 来处理你的分布式数据,并让更多的人可以更方便地使用 Spark,而不仅限于专业的数据工程师。
Spark 2.0 中,DataFrame 和 Dataset 的 API 融合到一起,完成跨函数库的数据处理能力的整合。在整合完成之后,开发者们就不必再去学习或者记忆那么多的概念了,可以通过一套名为 Dataset 的高级并且类型安全的 API 完成工作。
补充
1 | driver主要负责向excetuor分发task和代码,负责计算的调度,cluster manager负责资源的调度(可以是standalone,yarn,mesos),driver会向cluster申请资源 |