rdd

Spark MapReduce实现移动聚合操作(移动平均、求和、计数等)

左心房为你撑大大i 提交于 2020-03-13 01:34:24
1. 需求 在处理时间序列或者是有序数据时候,经常会越到这样的情形:1、求客户最近一个月的平均消费金额;2、求客户最近一个月的消费次数;3、求与客户在最近一个月内发生大额消费的客户数量 上述问题中,问题1与问题2是典型的求指定客户在指定时间段的行为统计值,可以通过客户进行分组然后过滤统计即可,而问题三则是求解与该客户在指定时间段内发生某种行为的客户数量,即没有具体的聚合Key,从而不同按照问题1与问题2进行分组的方式求解,而通过类似时间序列中求一个序列的移动平均方法来求解 针对上述两类情形,下面分别提供了两个函数,这个两个函数,一个是aggregateByKey,根据key聚合,并对聚合后的每一条记录采用窗口函数获取聚合数据,即该函数是对每一个key对应的value进行移动聚合操作。另一个是aggregateByAll,根据key进行排序,通过窗口函数获取结果进行聚合。这两个函数都是根据窗口函数进行聚合操作,但不同点在于作用范围不同。 窗口函数与聚合函数用户定义可以自由定义,通过定义不同的窗口函数与聚合函数,可以实现不同的移动逻辑以及聚合运算。 2. 实现思路 2.1 aggregateByKey aggregateByKey实现起来比较简单,因为一般情况先,单个key对应的value不会很大(单个executor的内存是可以装得下的)

What is best structure to choose for updaing nodes property in Spark GraphX?

丶灬走出姿态 提交于 2020-03-11 14:49:07
问题 its a while that i was searching a way to update nodes property in GraphX. i am working on a graph that consists of nodes and nodes property. for example (1,(2,true)). in this example 1 is the nodeID, 2 is node's label and true stands for when node has been visited. i have loaded graph with GraphLoader and made a distributed graph by RDDs. The structure that i am using for every node is as below: case class nodes_properties(label: Int, isVisited: Boolean = false) var work_graph = graph

零基础开发spark实时计算程序(2)

穿精又带淫゛_ 提交于 2020-03-11 13:09:17
主要问题 处理流式数据的两种方法 静态数据的几种格式 要介绍流式数据的处理,首先要介绍spark的几种静态的数据结构:RDD、dataset和dataframe。 简单来讲,RDD是spark最基础的数据,可以看出一行行独立的数据,每一行内部是封闭的黑箱,在MapReduce之前不知道是啥(MapReduce是hadoop的一种计算模型,浅显一点理解就是做筛选统计之类的活的,就是下图紫色的过程)。 图出自https://blog.csdn.net/MrZhangBaby/article/details/88840635,看不清可以点进去看 Dataset是整理过的RDD,同样可以理解为一行行的数据,只是里面更有序(有了固定的结构schema) Dataframe就是Python和R里的那种dataframe,也就是最常见的带表头的表,是Dataset的特例,链接里的图就很形象 https://blog.csdn.net/weixin_42702831/article/details/82492421 RDD Dataframe Dataset 或者是 流式数据的2种处理方式 从文件里读数据,读一次就产生一个静态数据,而像日志之类的记录这种不断增长的数据,可以看做是一个瀑布流,源源不断的增长。针对这种流式数据(data stream)的处理,要么用flink

spark的性能优化

倾然丶 夕夏残阳落幕 提交于 2020-03-09 13:13:05
spark性能优化点 一、分配更多的资源 它是性能优化调优的王道,就是增加和分配更多的资源,这对于性能和速度上的提升是显而易见的, 基本上,在一定范围之内,增加资源与性能的提升,是成正比的;写完了一个复杂的spark作业之后,进行性能调 优的时候,首先第一步,就是要来调节优的资源配置;在这个基础之上,如果说你的spark作业,能够分配的资源达到 了你的能力范围的顶端之后,无法再分配更多的资源了,公司资源有限;那么才是考虑去做后面的这些性能调优的点。 1、分配哪些资源 executor-memory、executor-cores、driver-memory 2、在哪里设置 在实际的生产环境中,提交spark任务时,使用spark‐submit shell脚本,在里面调整对应的参数。 提交任务的脚本: spark‐submit \ ‐‐master spark://node1:7077 \ ‐‐class cn.itcast.WordCount \ ‐‐num‐executors 3 \ 配置executor的数量 ‐‐driver‐memory 1g \ 配置driver的内存(影响不大) ‐‐executor‐memory 1g \ 配置每一个executor的内存大小 ‐‐executor‐cores 3 \ 配置每一个executor的cpu个数 /export/servers

Spark的累加器和广播变量

佐手、 提交于 2020-03-09 08:17:39
累加器 累加器用来对信息进行聚合,通常在向 Spark传递函数时,比如使用 map() 函数或者用 filter() 传条件时,可以使用驱动器程序中定义的变量,但是集群中运行的每个任务都会得到这些变量的一份新的副本,更新这些副本的值也不会影响驱动器中的对应变量。如果想实现所有分片处理时更新共享变量的功能,那么累加器可以实现想要的效果。 系统累加器 针对一个输入的文件,如果我们想计算文件中所有空行的数量,编写以下程序: scala > val notice = sc . textFile ( "/hyk/spark/words.txt" ) notice : org . apache . spark . rdd . RDD [ String ] = / hyk / spark / words . txt MapPartitionsRDD [ 1 ] at textFile at < console > : 24 scala > val blanklines = sc . longAccumulator ( "MyAccumulator" ) blanklines : org . apache . spark . util . LongAccumulator = LongAccumulator ( id : 0 , name : Some ( MyAccumulator ) ,

pyspark中部分***ByKey的用法

橙三吉。 提交于 2020-03-08 10:43:24
准备工作 import pyspark from pyspark import SparkContext from pyspark import SparkConf conf=SparkConf().setAppName("lg").setMaster('local[4]') sc=SparkContext.getOrCreate(conf) 1. aggregateByKey aggregateByKey中前一个函数是在各分区内计算的函数,后一个函数是聚合个分区结果的函数 其中zeroVal是对每个元素进行计算时的初始值,和分区无关。 rdd = sc.parallelize([('B',1),('B',2),('A',3),('A',4),('A',5)]) zeroVal = 1 mergeVal = (lambda aggregated,el:aggregated+el) #aggregated即zeroVal mergeComb = (lambda agg1,agg2:agg1+agg2) result = rdd.aggregateByKey(zeroVal,mergeVal,mergeComb) print(rdd.glom().collect()) print(result.collect()) [[('B', 1)], [('B', 2)], [('A', 3)]

spark调优

徘徊边缘 提交于 2020-03-07 19:15:04
1.分配更多的资源     它是性能优化调优的王道,就是增加和分配更多的资源,这对于性能和速度上的提升是显而易见的, 基本上,在一定范围之内,增加资源与性能的提升,是成正比的;写完了一个复杂的spark作业之后,进行性能调 优的时候,   首先第一步,就是要来调节优的资源配置;在这个基础之上,如果说你的spark作业,能够分配的资源达到 了你的能力范围的顶端之后,无法再分配更多的资源了,公司资源有限;那么才是考虑去做后面的这些性能调优的点。 2.参数调节到多大才算大      第一种情况:standalone模式 先计算出公司spark集群上的所有资源 每台节点的内存大小和cpu核数, 比如:一共有20台worker节点,每台节点8g内存,10个cpu。 实际任务在给定资源的时候,可以给20个executor、   每个executor的内存8g、每个executor的使用的cpu个数 10。 第二种情况:Yarn 先计算出yarn集群的所有大小,比如一共500g内存,100个cpu; 这个时候可以分配的大资源,比如给定50个executor、每个executor的内存   大小10g,每个executor使用的cpu 个数为2。 使用原则:你能使用的资源有多大,就尽量去调节到大的大小(executor的数量:几十个到上百个不等;executor的 内存;exector的cpu个数

Spark RDD与MapReduce

旧城冷巷雨未停 提交于 2020-03-07 13:16:47
什么是Map、什么是Reduce MapReduce是一个分布式编程计算模型,用于大规模数据集的分布式系统计算。 我个人理解,Map(映射、过滤)就是对一个分布式文件系统(HDFS)中的每一行(每一块文件)执行相同的函数进行处理; Reduce(规约、化简)就是对Map处理好的数据进行两两运算,因此reduce函数必须要有两个参数。 Map/Reduce的执行原理其实可以参考python的map/reduce函数: https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00141861202544241651579c69d4399a9aa135afef28c44000 Spark中的MapReduce RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。 RDD也支持常见的MapReduce操作。 RDD操作: 转换操作: 每一次转换操作都会产生不同的RDD,供给下一个“转换

Spark Graphx编程指南

为君一笑 提交于 2020-03-07 11:59:22
问题导读 1.GraphX提供了几种方式从RDD或者磁盘上的顶点和边集合构造图? 2.PageRank算法在图中发挥什么作用? 3.三角形计数算法的作用是什么? Spark中文手册-编程指南 Spark之一个快速的例子 Spark之基本概念 Spark之基本概念 Spark之基本概念(2) Spark之基本概念(3) Spark-sql由入门到精通 Spark-sql由入门到精通续 spark GraphX编程指南(1) Pregel API 图本身是递归数据结构,顶点的属性依赖于它们邻居的属性,这些邻居的属性又依赖于自己邻居的属性。所以许多重要的图算法都是迭代的重新计算每个顶点的属性,直到满足某个确定的条件。 一系列的graph-parallel抽象已经被提出来用来表达这些迭代算法。GraphX公开了一个类似Pregel的操作,它是广泛使用的Pregel和GraphLab抽象的一个融合。 在GraphX中,更高级的Pregel操作是一个约束到图拓扑的批量同步(bulk-synchronous)并行消息抽象。Pregel操作者执行一系列的超级步骤(super steps),在这些步骤中,顶点从 之前的超级步骤中接收进入(inbound)消息的总和,为顶点属性计算一个新的值,然后在以后的超级步骤中发送消息到邻居顶点。不像Pregel而更像GraphLab

Spark源码系列(二)RDD详解

十年热恋 提交于 2020-03-07 11:57:40
1、什么是RDD? 上一章讲了Spark提交作业的过程,这一章我们要讲RDD。简单的讲,RDD就是Spark的input,知道input是啥吧,就是输入的数据。 RDD的全名是Resilient Distributed Dataset,意思是容错的分布式数据集,每一个RDD都会有5个特征: 1、有一个分片列表。就是能被切分,和hadoop一样的,能够切分的数据才能并行计算。 2、有一个函数计算每一个分片,这里指的是下面会提到的compute函数。 3、对其他的RDD的依赖列表,依赖还具体分为宽依赖和窄依赖,但并不是所有的RDD都有依赖。 4、可选:key-value型的RDD是根据哈希来分区的,类似于mapreduce当中的Paritioner接口,控制key分到哪个reduce。 5、可选:每一个分片的优先计算位置(preferred locations),比如HDFS的block的所在位置应该是优先计算的位置。 对应着上面这几点,我们在RDD里面能找到这4个方法和1个属性,别着急,下面我们会慢慢展开说这5个东东。 //只计算一次 protected def getPartitions: Array[Partition] //对一个分片进行计算,得出一个可遍历的结果 def compute(split: Partition, context: TaskContext):