spark 读取多个路径_spark

本文介绍了Spark系统的优势,对比了MapReduce的不足,并详细阐述了Spark中的核心概念RDD,包括RDD的特性、生成方式、转换操作、持久化、分区和依赖关系。还通过示例演示了如何使用Spark Context创建和操作RDD,以及RDD在容错和性能优化方面的作用。
摘要由CSDN通过智能技术生成

Spark系统的概述

mapredcue

是一个简单通用和自动容错的批处理计算模型

劣势:

交互式和流式计算

使用Storm,Impala结合hadoop的不足:

•重复工作

•组合问题

•使用范围的局限性

•资源分配

•管理问题

为什么有了MapReduce还需要Spark?

因为MapReduce中缺乏一种特性,即在并行计算的各个阶段进行有效的数据共享,这就是RDD的本质。

Mapreduce是将计算构建成为一个有向无环图的任务集,只允许他们有效的重新计算部分DAG,在单独的计算之间,只有复制文件,没有提供其他的存储对象,RDD可以适应当前大部分的数据并行算法和编程模型。

RDD表达能力

模型中,RDD能够取得和专有系统同样的性能,还能提供包括容错处理和滞后节点处理等这些转悠系统缺乏的特性

模型:

•迭代算法;适用于图处理和机器学习

•关系型查询:实现许多通用的数据库引擎特性

•MapReduce批处理:RDD提供的接口是MapReduce的超集

•流式处理:D-Stream可以将流式计算当作一系列的短小而确定的批处理操作,解决了目前流式系统只能提供有限的容错处理,销毁非常大的拷贝代价和非常长的容错时间。

Spark子系统

大数据的场景划分如下;

•复杂的批量数据处理,通常时间跨度是数十分制到数小时

•基于历史数据的交互式查询,通常时间跨度为数十秒到数分钟

•基于实时数据流的数据处理,通常时间跨度为数百毫秒到数秒

46fedabb4fc7f2465d7e659d451d24fa.png

•spark core:基于RDD提供丰富的操作接口,利用DAG进行统一的任务规划

•Shark/Spark SQL;兼容Hive的接口HQL,提供比Hive高10-100倍的查询速度分布式SQL引擎

•Spark Streaming:将流式计算分解成一系列的短小的批处理作业

–利用Spark的轻量级和低延迟的调度框架

–数据源:

•kafka,flume,twitter,TCP sockets

•GraphX:基于saprk的图计算框架,兼容Pregel和GraphLab接口,增强了图构建以及图转换功能

•MLlib:Spark Core适合迭代式运算,目前常用:分类,聚类,推荐等。

Spark生态系统的目标就是将批处理和交互式处理,流式处理融合一起,最终特性如下;

•saprk兼容hadoop(HDFS和YARN)

2c71b336fe7e4f55cd478fddf64a377e.png

•spark生态学习成本低

•saprk 目前有强大的社区支持

•saprk性能优异

–在多任务计算以及迭代计算中能够大量减少磁盘I/O的时间,针对每个任务启动的式线程,不是进程

Spark RDD及编程接口

开发者可以利用Spark接口非常容易的编写出复杂的数据处理流水线

Demo

java实现;

推荐scala实现:

2c25746be491fc168c12c1f1fcc607aa.png

•为什么需要先建立上下文?

–程序需要向集群申请资源以及构建相应的运行环境

–创建saprk Context对象需传入四个变量

•集群地址(saprk://localhost:7077/假设集群在本地启动监听的式7077端口)

•程序标识

•spark的安装路径

•传入spark程序的jar包路径

•通过textfile接口从HDFS文件系统中读入log文件

•传入转换算子,生成一个新的变量

•若是需要多次使用这个算子,可以进行cache,以便后续可以继续使用这个变量,减少重复计算过程

•用count触发算子触发运行,返还给Drive端

Demo出现的概念:

•弹性分布式数据集RDD

•创建操作:spark Context

•转换操作:

•持久化操作:

•触发操作:

fe976ddd493848e1e927343323a30008.png

RDD

•一个RDD代表一个倍分区的只读数据集

•RDD的生成途径:

–内存集合和外部存储系统

–转换操作:其他RDD:map,Fliter,join等等

•RDD接口只支持粗粒度的操作,记录RDD之间的关系,构建RDD的相互的继承关系,有效容错,丢失或操作失败可以重建

•控制操作;

–持久化

•开发者可以指明他们需要重用哪些RDD,选择存储策略

–分区

•可以让RDD根据记录中的键值在集群的机器之间重新分区

•抽象RDD的五个接口

– 909e2e76e45be0f7d8c8576f51b2b3dd.png

•RDD分区

–对于RDD而言分区的多少涉及到并行计算的粒度

–用户可以指定分区,若没有指定,可以使用默认值,利用RDD的成员变量partitions所返回的partition数组的大小查询RDD被划分的分区数

•指定分区数

51404fb27242f1180a39e8226fc9c407.png

•1-100数组分区数为2

df85a577a19bdddd9594502213e6f405.png

•默认分区数是这个程序所分配到的资源的CPU核的个数

•RDD优先位置

–计算向数据移动,在sparp进行任务调度的时候,尽可能讲任务分配到其它数据块所存储的位置

–通过SparkContext的textFile函数读取一个17G的文件bigfile,生成一个类型为MappedRDD的rdd,然后通过依赖关系找到原始的hadoopRDD,hadoopRDD的partition的个数是254个,对于第一个partition而言,其preferredLocations返回了三个机器地址,以便后续调度的程序根据这个地址更加有效分配任务

•RDD依赖关系

–窄依赖;每一个父RDD的分区最多只被子RDD的一个分区所使用

–宽依赖:多个子RDD分区会依赖于一个父RDD的分区

–明确两个依赖的关系的原因:

•窄依赖可以在集群的一个节点上若流水线一般执行,计算所有父RDD的分区,相反,宽依赖需要取得父RDD的所有分区,上的数据进行计算,类似mapReduce一样的Shuffle操作

•对于窄依赖,节点计算失败后恢复更有效,只需重新计算对应的父RDD的分区,可以在其他节点上并行计算,相反,宽依赖继承关系,一个节点的失败会导致其父RDD的多个分区重新计算,这个代价比较高

79ca6e00e5b68be5405f669058512329.png

0bcc5f7f267948aeb91b8b3c59f77b25.png

•利用Spark丰富的RDD接口,可以非常方便的实现PageRarnk算法

•RDD分区计算

–对于每个RDD的计算都是以Partition为单位的,并RDD中的compute函数都是对迭代器复合,不需要保存每次计算的结果

•RDD分区函数

–partiton就是RDD分区函数,目前在Spark中实现了两种类型的分区函数就是;

•Hashpartition(哈希分区)

•RangPatitioner(区域分区)

–都是存在k,v类型的RDD中,对于非k,v类型的partiton的值就是None,

–partition函数决定了RDD本身的分区数量,也可以作为其父RDD Shuffle的输出中,每个分区进行数据切割的依据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值