
大数据
文章平均质量分 80
DrawnBreak
这个作者很懒,什么都没留下…
展开
-
图解spark之map端计算结果缓存
当spark中做完一次map操作,准备发给下游时,究竟会做什么事呢?我按照一些问题来逐步分析。首先有个问题:map操作之后,数据是直接缓存到内存或者磁盘,等待下游client来拉取吗?spark是批处理,假设正好map处理完一批数据,会调用insertAll方法去做缓存,然而缓存并不是那么简单的存储,而是如下:可以看到,spark会判断这个map操作之后,是否会接一个聚合的操作,如果有,那么会在缓存并准备发给下游时时,提前做好聚合操作, 否则就是简单缓存。我们先看下简单缓存的分支:可以看到在这原创 2021-01-21 00:19:29 · 478 阅读 · 0 评论 -
图解Spark的task是怎么分发到各节点上并执行的
假设此时已经构建好DAG划分好stage,接着就是要分发task了。当运行submitTask时,有如下的过程:上图可以看到,每次都会新建一个专门的taskManager,都运行ok后就会消失,并不是独立持续存在的一个角色。reviveOffers具体做什么的呢?看一下可以看到reciveOffer主要是做worker资源分配的。workerOffer列表一般需要做随机处理,避免一直分给同一个各机器上的CPU核数在分配的考虑范围之内。spark每次可能会有多个TaskSetManager原创 2020-07-06 00:27:17 · 2278 阅读 · 0 评论 -
图解spark的任务构建和提交流程
简述spark的任务运行流程先是在写spark代码的时候,背后做一些RDD的转换,写完后构建DAG,划分stage, 然后提交到资源管理器分配计算资源, 并在worker上执行。首先写spark代码时离不开对RDD的调用,那么:为什么需要RDD数据处理模型统一:RDD是1个数据结构, 能够获取数据的分区。不区分流式还是批式,只理解为1个数学模型。依赖划分原则:RDD之间通过窄依赖(仅1个依赖)和宽依赖(多依赖)进行关联。为什么要划分依赖?依赖数量不同,决定是否能在1个stage原创 2020-07-02 00:00:24 · 551 阅读 · 0 评论 -
图解spark RDD缓存管理cacheManager和磁盘管理DiskStore/DiskBlockManager
RDD缓存管理cacheManager当需要计算RDD时,需要避免重复计算的RDD。什么时候RDD可能会被重复计算?一般是宽依赖RDD, 即RDD的下游可能有多个, 但是另一个下游的拉去可能较慢, 那么此时需要做缓存。cacheManager只是对RDD的管理, 真正的缓存以及获取是通过blockManager,然后根据内存情况选择存内存还是存磁盘。RDD不是一定会做缓存,这取决于存储级别的设定。RDD没缓存时, 不一定要重新计算, 也可能从CheckPoint中拿checkPoint概念:原创 2020-06-30 00:25:19 · 466 阅读 · 0 评论 -
apache beam 入门之触发器
目录:apache beam 个人使用经验总结目录和入门指导(Java)概念触发器指 窗口的触发策略, 即窗口何时可以把该窗口内收集到的数据向下发送。而手动设定触发器可以让我们做到2件事:在窗口时间内, 我可以实现多次触发而不是像默认那样仅仅在窗口结束时触发1次我可以对延迟数据做特殊触发,而不是像默认那样,1收到延迟数据就触发。触发器使用p.apply(窗口对象.triggering(触发器对象) 来进行设定以下介绍各类触发器。默认触发器当 “当前时间” 超过了窗口右界,则触发1次,原创 2020-06-11 21:12:55 · 893 阅读 · 0 评论 -
apache beam入门之 窗口水位线和超时数据概念
目录:apache beam 个人使用经验总结目录和入门指导(Java)上一章讲了窗口概念,这一章要接着窗口中很重要的窗口水位线和超时数据概念。beam如何确定当前时间?例如有1个 00:00:00-00:00:03的窗口,beam 默认是当时间过了00:00:03之后,该窗口会关闭,并将该窗口内的数据往下发送。但是有个问题,这个时间对beam来说如何确定? 是系统时间过了00:00:03就关闭窗口吗?答案是否, 因为如果依据系统时间来确定当前时间并用来结束窗口, 那不确定性很高,因为记录到达的原创 2020-06-11 20:20:48 · 625 阅读 · 0 评论 -
spark——BlockManager笔记整理和学习
spark的cacheManager这张图能知道什么?Q: spark对RDD的缓存是通过谁去做的?A: 通过BlockManager去缓存, 并且根据配置选项,决定缓存在文件还是内存中。driver、executor和BlockManager的关系从中可以看到blockManagerMaster在driver端生成executor中生成blockManager,并负责向BMM注册。spark中注册消息通过ActorSystem进行发送blockManager包含什么Blo原创 2020-06-10 00:02:52 · 228 阅读 · 0 评论 -
apache beam入门之窗口概念
目录:apache beam 个人使用经验总结目录和入门指导(Java)输入时刻概念对于beam里的数据集里的每个数据,都会附带1个Instant成员(以下称为输入时刻),指明了该条数据输入时的时间戳(单位毫秒)。如果是有限数据集(批处理方式输入的),且未没手动设置输入时刻, 则默认输入时刻全部相同。如果是无限流式数据集,例如kafka,会根据到达的时间来设置输入时刻。窗口则就是根据输入时刻来进行划分的。伪造流式数据因为用kafka做输入数据时,不好精确地控制输入时间所以理解窗口概念和举例之原创 2020-06-06 17:36:15 · 822 阅读 · 1 评论 -
apache beam KafkaIO的使用(流处理IO)
目录:apache beam 个人使用经验总结目录和入门指导(Java)这里我以下面这个为例,弄1个demo第一步建立option和pipeline PipelineOptions kafkaOption = PipelineOptionsFactory.fromArgs(args).withoutStrictParsing().as(PipelineOptions.class); Pipeline pipeline = Pipeline.create(kafkaOpt原创 2020-06-06 14:51:21 · 764 阅读 · 0 评论 -
在Spark上运行apache beam
目录:apache beam 个人使用经验总结目录和入门指导(Java)为了方便,以下面这个名字替换的程序做简单例子:/** * The ReplaceMyName * 把Create数组里的myName替换成xxx * @since 2019/12/17 */public class OutpuMyName { public static void main(String[] args) { MyTestOption myTestOption = PipelineOp原创 2020-06-06 14:01:55 · 579 阅读 · 0 评论 -
图解sparkContext初始化
之前看了半本书《深入理解Spark:核心思想与源码分析》, 为什么说是半本,因为看不下去了,这本书太喜欢贴scala代码却不解释,但自己那时候不太了解如何去阅读源码,所以希望借助它学习一下。这里贴一贴学习的过程。sparkContext初始化的内容一些问题和思考Q: SparkConf配置信息来自哪些?A: spark-submit时spark-default.conf里的配置, spark-submit时写入的命令参数Q: SparkContext必须指定哪2个内容?A: 指定s.原创 2020-06-06 00:14:41 · 276 阅读 · 0 评论 -
apache beam 入门之beam-sql
目录:apache beam 个人使用经验总结目录和入门指导(Java)就像spark-sql 一样,apache beam也有beam-sql, 就是能够输入1张模拟数据表, 然后通过sql语句来实现计算。举个例子,我们不希望在数据源端执行 select * from tableA left join talbeB on tableA.id = tableB.id where tableA.id < 10 这句话, 因为这样很占用数据源端的计算资源(尤其是hive这类数仓), 所以会希望把tab原创 2020-06-05 23:49:29 · 1362 阅读 · 0 评论 -
apache beam入门之编码Coder相关
目录:apache beam 个人使用经验总结目录和入门指导(Java)为什么需要Coderapache beam在做计算时, 会对数据进行序列化和反序列化,以方便进行分布式节点间的传输。因此任何PCollection都会指定1个Coder编码,来确定当前数据集里的数据类型,以便在计算时进行正确的序列化操作。当我们通过apply组装好1个PCollection后,其coder也就需要被指定了。beam默认识别编码正常情况下,beam能够自动识别编码,如下例子,我们生成1个字符串的数据集,并转成整原创 2020-06-04 21:30:32 · 835 阅读 · 0 评论 -
apache beam入门之旁路输入
目录:apache beam 个人使用经验总结目录和入门指导(Java)如果我们希望给某个PCollection数据集输入1个 计算后 的结果,则就需要用到旁路输入。例如要计算某个数据集的方差,其公式为这个计算过程就需要用到旁路输入,来将平均值u传递给数据集中的每个数字进行计算。我们下面这个数据集为例PCollection<Integer> numbers = pipeline.apply(Create.of(10,20,40,70,80));创建旁路输入视窗数据集的平均值就是原创 2020-06-04 20:22:47 · 702 阅读 · 0 评论 -
apache beam入门之group分组操作
目录:apache beam 个人使用经验总结目录和入门指导(Java)如果我们希望将相同的元素进行分组,则可以用Group的转化方法进行操作首先我们生成1个单词数据集List<String> strLists = new ArrayList<>();strLists.add("cat");strLists.add("cat");strLists.add("cat");strLists.add("dog");strLists.add("dog");strLists.原创 2020-06-04 00:20:06 · 714 阅读 · 0 评论 -
apache beam 入门之数据集PCollection的拆分和合并
有时候我们会需要对PCollection数据集进行拆分, 分别进行不同的计算后,再合并成1个数据集。拆分数据集拆分数据集有2种方式,1种是使用PartitionFn。假设我们要将1个整数的数据集分成2份,奇数和偶数分别处理,则可以如下: PCollection<Integer> numbers = pipeline.apply(Create.of(1,2,3,4,5)); PCollectionList<Integer> numbersList原创 2020-06-04 00:18:19 · 1054 阅读 · 0 评论 -
apache beam 入门之数据聚合
聚合元素(多个元素合并成1个)操作(类似于reduce操作)如果要将数据集里的所有元素聚合成1个元素,在beam里称为combine操作。假设现在我们有1个PCollection数据集 pInt则我们以计算整数求和的方式,展示3种聚合方式:用beam提供的sdkPCollection<Integer> pSum = pInt.apply(Sum.integersGlobally());用Combine.globally(SerializableFunction类)PCollect原创 2020-06-02 21:07:06 · 761 阅读 · 0 评论 -
apache beam入门之组装数据变换过程
目录:apache beam 个人使用经验总结目录和入门指导(Java)当我们通过option新建的pipeline后,需要进行一系列组装过程,最后再通过pipeline.run()启动计算。Pipeline pipeline = Pipeline.create(option);/***组装计算过程*/pipeline.run();因此编写beam程序时最核心的部分就是组装计算过程,其中包含1对1转换、聚合等操作。1对1转换(类似于map操作)该部分通过apply函数进行装饰器模式组装,原创 2020-06-02 20:55:48 · 594 阅读 · 0 评论 -
apache beam入门之输入输出SDK调用(批处理)
目录:apache beam 个人使用经验总结目录和入门指导(Java)众所周知数据处理分批处理和流处理,beam是基于底层计算引擎并支持2者的。 这一章先只介绍批处理的几种数据输入方式,即一次性全部输入全部数据的方式。内存输入数据内存输入方式之前介绍过了,可以通过组装Create类进行内存输入PCollection<String> pcStart = pipeline.apply( Create.of( "HELLO!",原创 2020-05-30 17:53:45 · 960 阅读 · 0 评论 -
apache beam 入门之pipeline管道
目录:apache beam 个人使用经验总结目录和入门指导(Java)编写beam程序的本质就是对pipeline管道进行创建和组装,最后再运行。pipeline的创建pipeline可以通过option创建。Pipeline pipeline = Pipeline.create(option);也可以先创建无option的管道, 之后再用不同赋值的option去运行Pipeline pipeline = Pipeline.create();........pipeline.run(o原创 2020-05-30 17:49:57 · 938 阅读 · 0 评论 -
apache beam 个人使用经验总结目录和入门指导(Java)
根据个人一年来使用apache beam的经验, 简单写了一批apache beam的入门文章,以便提供给希望快速上手的同事们使用, 范围暂时只基于自己所接触过的部分, 如果需要更详细地了解apache beam, 需要去beam的官网以及官方文档中去探索。以下使用指导基于java,同时范围只涉及本人一年来的使用经历,并不全面,希望全面深入了解的话请参考官方使用手册和源码注释apache beam介绍初识 apache beamapache beam 入门使用apache beam入门之初次使用原创 2020-05-30 17:48:41 · 2873 阅读 · 6 评论 -
apache beam入门之程序入口——PipelineOption
前置章节apache beam入门宝典之初次使用从第一章里我们看到最开始需要生成1个PipelineOption,然后才能生成1个Pipeline, 而这个所谓的option用处是将可以将程序输入的args数组转成1个PipelineOption对象, 然后就能直接从里面进行get和set操作了,不需要自己再去编写输入参数转化相关的实体类。简单应用例子我们直接先以例子入手,先自定义1个MyTestOption类public interface MyTestOption extends Pipelin原创 2020-05-28 19:43:15 · 1063 阅读 · 0 评论 -
apache beam入门之初次使用
beam入门宝典之初次使用咱们不多废话,先直接来如何简单使用beam框架。这里我不使用常见的wordCount做例子,而是一个大写转小写的例子,语言选用java语言这个例子里我们会初步学到:如何建立管道如何手动生成数据如何转换如何查看输出首先我们要新建1个maven工程,然后在pom.xml中加入如下依赖:<dependency> <groupId>org.apache.beam</groupId> <artifactId>beam-原创 2020-05-27 22:51:46 · 2017 阅读 · 0 评论 -
初始apache beam
apache beam的使用背景大数据项目一定会涉及数据处理和计算, 就会涉及到选用哪种计算工具, 摆在面前的有spark、flink、mapreduce、Google Cloud Dataflow等等诸多选择, 如果以同一种计算逻辑去切换计算引擎,就要重新修改里面的API,并调整使用细节,非常不方便。因此就出现了1个整合这些计算资源的解决方案:apache beamBeam是1个统一的编程框架,支持批处理和流处理, 并可以将用beam写出来的程序,在多个计算引擎上去运行。以下是bema当前可支持的原创 2020-05-27 22:46:27 · 525 阅读 · 0 评论