1.16总结

寒假记录第三天

 

今天正式开始学习spark

原来对于spark有一定的基础了解学习

今天开始学习SparkCore。

 

RDD定义 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变、可分区、里面的元素可并行计算的集合

  • Dataset:一个数据集合,用于存放数据的。
  • Distributed:RDD中的数据是分布式存储的,可用于分布式计算。
  • Resilient:RDD中的数据可以存储在内存中或者磁盘中

 

 

RDD的五大特性

  1. RDD是有分区的
  2. 计算方法都会作用到每一个分片(分区)之上
  3. RDD之间是有相互依赖的关系的
  4. KV型RDD可以有分区器--可能
  5. 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())

 

posted @ 2024-01-16 22:45  花伤错零  阅读(6)  评论(0)    收藏  举报