1.16总结
寒假记录第三天
今天正式开始学习spark
原来对于spark有一定的基础了解学习
今天开始学习SparkCore。
RDD定义 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变、可分区、里面的元素可并行计算的集合。
- Dataset:一个数据集合,用于存放数据的。
- Distributed:RDD中的数据是分布式存储的,可用于分布式计算。
- Resilient:RDD中的数据可以存储在内存中或者磁盘中
RDD的五大特性
- RDD是有分区的
- 计算方法都会作用到每一个分片(分区)之上
- RDD之间是有相互依赖的关系的
- KV型RDD可以有分区器--可能
- RDD分区数的读取会尽量靠近分区所在地(移动数据不如移动计算)--可能
分区是RDD存储的最小单位
一份RDD的数据,本质上是分割成了多个分区
特性一:
进行的分区实验如下:(开启spark需要启动hdfs,可以只开一个虚拟机)
[hadoop@node1 ~]$ cd /export/server/spark [hadoop@node1 spark]$ bin/pyspark Python 3.8.17 (default, Jul 5 2023, 21:04:15) [GCC 11.2.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. 24/02/16 17:37:59 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /__ / .__/\_,_/_/ /_/\_\ version 3.2.0 /_/ Using Python version 3.8.17 (default, Jul 5 2023 21:04:15) Spark context Web UI available at http://node1:4040 Spark context available as 'sc' (master = local[*], app id = local-1708076283342). SparkSession available as 'spark'. >>> rdd = sc.parallelize([1,2,3,4,5,6,7,8,9],3) 九个数字分成3个区 >>> rdd.glom().collect() [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> sc.parallelize([1,2,3,4,5,6,7,8,9],6).glom().collect() [[1], [2, 3], [4], [5, 6], [7], [8, 9]] >>>
特性二:
实验如下
>>> sc.parallelize([1,2,3,4,5,6,7,8,9],3).glom().collect() [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> sc.parallelize([1,2,3,4,5,6,7,8,9],3).map(lambda x: x*10).glom().collect() [[10, 20, 30], [40, 50, 60], [70, 80, 90]] >>>
特性三:
rdd1 = sc.textFile("../t.txt") rdd2 = rdd1.flatMap(lambda x:x.split(' ')) rdd3 = rdd2.map(lambda x: (x ,1)) rdd4 = rdd3.reduceByKey(lambda a,b: a + b) print(rdd4.collect())
依赖关系:
textFile => rdd1 => rdd2 => rdd3 => rdd4
特性四:
默认分区器:Hash分区规则,可以手动设置一个分区器(rdd.partitionBy的方法来设置)
这个特性是可能的,因为不是所有RDD都是Key-Value型。
Key-Value型RDD:RDD中存储的是二元元组,这就是Key-Value型RDD.
二元元组:只有两个元素的元组,例如("hadoop",5)
特性五:
这样可以走本地读取,避免网络读取
Spark会在确保并行计算能力的前提下,尽量确保本地读取,但不是100%确保。所以这个特性是可能的。
今日对于RDD的实验
# coding:utf8 # 导入Spark的相关包 from pyspark import SparkConf, SparkContext if __name__ == '__main__': # 0. 初始化执行环境 构建SparkContext对象 conf = SparkConf().setAppName("text").setMaster("local[*]") sc = SparkContext(conf=conf) # 演示并通过并行化集合的方式去创建RDD rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9]) # parallelize 方法,默认分区数是核心CPU来确定 print("默认分区数", rdd.getNumPartitions()) rdd = sc.parallelize([1,2,3],3) print("分区数",rdd.getNumPartitions()) # collect方法,是将RDD(分布式对象)中的每个分区的数据,都发送到Driver中,形成一个Python List对象 # collect:分布式 转 -> 本地集合 print("rdd的内容是",rdd.collect())
# coding:utf8 from pyspark import SparkConf, SparkContext if __name__ == '__main__': # 构建SparkContext对象 conf = SparkConf().setAppName("text").setMaster("local[*]") sc = SparkContext(conf=conf) # 通过textFile API读取数据 # 读取本地数据 file_rdd1 = sc.textFile("../data/1.txt") print("默认读取分区数", file_rdd1.getNumPartitions()) print("file_rdd1 内容", file_rdd1.collect()) # 加上最小分区读取 file_rdd2 = sc.textFile("../data/1.txt", 3) # 最小分区数是参考值,Spark有自己的判断,给的太大会不理会 print("file_rdd2 内容", file_rdd2.collect()) #读取HDFS文件数据测试 hdfs_rdd = sc.textFile("hdfs://node1:8020/input/test1/A.txt") print("hdfs_rdd 内容", hdfs_rdd.collect())

浙公网安备 33010602011771号