Spark-RDD介绍与创建RDD

spark Steaming、spark ml等命令,最终都会转换成spark-core的组件命令来执行

spark RDD是 spark-core组件的数据结构、或叫数据模型、数据抽象

Resilient Distributed Dataset

  • 基本概念
    • 弹性分布式数据集
    • 是spark的数据抽象
    • 是一个不可变、可分区、里面元素可并行计算的合集
    • 可以看做是对一堆数据的打包,就是一个RDD,也可以说,这个对象就的RDD
  • Dataset:RDD是一个数据集合,打包在一起
    • 所有spark对数据的操作,都会转换成对RDD的操作
    • 包括:spark sql、spark streaming、spark ml、spark mllib等
  • Distributed:分布式的
  • Resilient :弹性的
    • 数据可以保存在磁盘上、也可以保存在内存里
    • 数据分布式是弹性的
      • 注:这个弹性不是说数据可动态扩展,而是说数据由容错性,有副本
      • RDD会在多个节点上存储,和HDFS一样
      • HDFS文件分为多个block存储在不同节点
      • RDD文件分为多个partition(分区),不同分区可能存储在不同节点
    • spark读取HDFS场景下,会把hdfs的block读到内存,然后抽象为spark的partition来进行操作
    • spark计算结束,一般会把数据持久化到hive、hbase、hdfs等
      • 存储举例:每个rdd的partion会先转换为hdfs的block,如果partition小于128M,那么会一一对应,如果大于128M,那么一个partition会拆成多个block再存

  • 不可变
    • 代码的变量 a = 1, 然后 a = a + 1 此时变量a是可变的
    • spark数据:rdd1 进行更新, 会创建一个rdd2, 原来的rdd1依然存在(该占内存还是占内存,不能直接对rdd1这块数据进行更新,需要用副本rdd2来处理)
    • 由父rdd来生成一个子rdd,父rdd的状态不会变化
    • 为什么这样做?
      • 容错,主要思路:通过新增版本来实现数据的改变,但保留了历史快照,用于容错
      • 具体为:分布式节点计算时,可能某个机器计算失败了,如果没有历史快照,很可能需要重新计算,太亏了。
      • 这是基于海量数据的。如果出错了,可以基于上一个历史版本,继续往下计算
  • 可分区
  • 并行计算

spark RDD 创建:方式1 通过内存中的数据,来创建,使用parallelize方法

前提

需要有spark context, pyspark启动时,会自动生成sc

基本概念

使用sc的parallelize方法,把内存中的数据直接转换为RDD

# 内存中有一个data变量,直接扔给parallelize

data = [1,2,3,4,5]

rdd1= sc.parallelize(data)

>>> data = [1,2,3,4,5]

>>> rdd1= sc.parallelize(data)

>>>

>>>

>>> data

[1, 2, 3, 4, 5]

>>> rdd1

ParallelCollectionRDD[7] at readRDDFromFile at PythonRDD.scala:274

使用这个RDD,做一个reduce

rdd1.reduce(lambda x,y: x+y)

观察spark的job

他使用了2个任务来完成这个操作rdd1.reduce(lambda x,y: x+y)

指定partition分区数量

进而指定任务数量

通过parallelize参数,可以指定分区数量

data = [1,2,3,4,5]

rdd1= sc.parallelize(data, 5)

此时,把data分成5个分区,转换成rdd。

然后进行reduce操作:

rdd1.reduce(lambda x,y: x+y)

reduce命令采用5个任务来执行(一个分区,对于一个任务Task)

分区设置说明

spark为每个分区运行一个task,那一个数据应该指定多少分区呢?

举例:

可以根据CPU核心数量来定

通常:1个CPU核,可以指定2-4个分区。

一个设备假如是4核CPU,那么我们可以指定2*4 = 8个分区, 此时每个设备接受到spark任务时,会创建8个任务来执行。

如果不指定,spark会自动设置(有几个CPU,就会创建几个任务)

这里,我的虚拟机是2核的,所以上面未指定分区时,spark使用了两个任务来处理

spark RDD 创建:方式2 通过外部数据、文件创建,使用textFile方式

概念

可以从本地磁盘、Mysql、HDFS、HBase、S3(亚马逊S3)等数据源获取数据

例子

参见上一小节

rdd = sc.textFile('file:///usr/data2/program/spark/testData/sparkWordCount.txt')

rdd.collect()

说明:collect()是收集行数的。 因为sparkWordCount.txt有3行,这样就得到一个数组,元素有3个

[

'Apache Spark is a fa...第一行.',

 '', 第二行是一个空行,所以这里是''

 'A...第三行.']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值