- 搭建spark开发环境
安装Java配置环境 + 下载spark
- 运行pyspark
- 通过spark—submit提交spark任务到集群运行
- Python安装findspark 和 pyspark库
- spark是大数据计算框架MapReduce的继任者,不同于MapReduce将计算中间结果放入磁盘中,spark采用的是将中间结果放入内存中,同时采用并行计算DAG图的优化,减少了不同任务之间的依赖
4、DAG:是Directed Acyclic Graph(有向无环图)的简称,反映RDD之间的依赖关系。
Driver Program:控制程序,负责为Application构建DAG图。
Cluster Manager:集群资源管理中心,负责分配计算资源。
Worker Node:工作节点,负责完成具体计算。
Executor:是运行在工作节点(Worker Node)上的一个进程,负责运行Task,并为应用程序存储数据。
Application > job > stage > task
Saprk架构:
spark部署:
/* Spark基本数据结构RDD:
通过读取文件生成RDD:
Rdd = sc.textFile(“hdfs文件地址”)
(保存rdd:saveAsTextFile)
通过将内存中的对象并行化生成对应的RDD
Arr= [2,3,4,5,6]
Rdd = sc.parallelize(arr)
/* RDD操作类型:transform、action
操作确定了RDD之间的依赖关系:
宽依赖(一对多或多对多)和窄依赖(一对一或多对一)
宽依赖一般具有shuffle过程,也即由父RDD分发到不同的子RDD分区
依赖关系确定了DAG(有向无环图)切分stage的方式:切割规则为 > 从后往前,遇到宽依赖就切割stage
RDD常用操作:
/* 常用Action操作:
- collect:将数据汇集到Driver
- take:将前*个数据汇集给Driver
- TakeSample:随机抽取若干个到Driver,第一个参数设置是否放回抽样
- countByKey:对pair RDD按key统计数量
- textFile:读取文件作为RDD
- SaveAsTextFile:保存RDD为文件
/* 常用transformation操作:
- map:对rdd内的每一个元素都进行一个映射转换rdd.map(lambda x: x ** 2)
- filter:应用过滤条件 rdd.filter(lambda x: x>5)
- flatMap:与map操作相似,但flatmap操作是将每个元素都进行映射后压成一个array之后输出
- Sample:第一个参数为确认是否重复抽样,也即是否放回抽样
- distinct:去重操作
- subtract:a.subtract(b)返回的是属于a不属于b的元素
- union:a.union(b) 合并a与b的数据
- Intersection:a.intersection(b) a与b的交集
- cartesian:a.cartesian(b) a 与 b的笛卡尔积
- sortBy:应用lambda进行排序,默认升序
- zip:a.zip(b) a与b组成pair对
- zipWithIndex: a.zipWithIndex() 将a与他的index进行配对,从0开始配对
/* 常用pairRDD操作:
- reduceByKey:rdd.reduceByKey(lambda x,y: x+y)对相同key的value应用二元归并操作(reduce涉及到的一般都是二元归并操作)
- join 和 leftOuterJoin/rightOuterJoin:rdd.join(rdd) 两个rdd进行内连接,与表的内连接相似
/* 缓存操作:
cache(MEMORY_ONLY)缓存到内存中,当内存满时不再缓存当需要计算时重新计算
persist(MEMORY_AND_DISK) 缓存到内存或磁盘中,当内存存满时,存到磁盘中
unpersist:立即释放缓存
/* 共享变量:
当spark集群在多个workNode上运行一个函数时,此时默认情况下会在每个节点上都复制一份这个函数的副本。有时需要在不同节点或者节点与Driver之间共享数据
> 广播变量:sc.broadcast()
当需要在不同的节点之间或者不同的任务之间共享数据时,需要用到广播变量,广播变量为不可变变量,在每个机器上缓存一个只读的变量,而不是为每一个task缓存一个副本
> 累加器:sc.accumulator()
用于不同的节点以及Driver上的共享变量,只能实现技术或者累加功能,在Driver上可见但在节点上不可见
/* 分区操作
$$$ DataFrame与SQL的交互:
> SparkSession.createOrReplaceTempView()将DataFrame注册为临时表视图,也即将它建立为一张临时表,生命周期与spark session相连。
> SparkSession.createOrReplaceGlobalTempView()将DataFrame注册为全局表视图,生命周期和整个spark application 相关,可在新的session中访问
>>> 对hive表进行增删改操作
首先建立hive分区表:
query = “””
CREATE EXTERNAL TABLE IF NOT EXISTS {tablename}
(
App_id STRING COMMENT 别名,
******
)
PARTITION BY (***) (分区)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘ \t ’ (分割 ‘\t’)
STORED AS TEXTFILE (以文本形式存储)
LOCATION ‘{path}’ (外部表的存储地址 :hdfs路径)
Spark性能调优:
https://blog.csdn.net/levy_cui/article/details/51306709?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162702931516780274144041%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162702931516780274144041&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-51306709.pc_search_result_control_group&utm_term=spark.default.parallelism&spm=1018.2226.3001.4187