<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[sysocc的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/sysocc</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sysocc]]></copyright><item><title><![CDATA[CDC是什么？有没有合适的技术方案？]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/131073763</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/131073763</guid><author>sysocc</author><pubDate>Wed, 07 Jun 2023 09:53:27 +0800</pubDate><description><![CDATA[CDC 是 Change Data Capture(变更数据获取)的简称。核心思想是，监测并捕获数据库的变动（包括数据或数据表的插入、更新以及删除等），将这些变更按发生的顺序完整记录下来，写入到消息中间件中以供其他服务进行订阅及消费。]]></description><category></category></item><item><title><![CDATA[Flink有状态计算的状态容错]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/130801146</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/130801146</guid><author>sysocc</author><pubDate>Mon, 22 May 2023 09:59:39 +0800</pubDate><description><![CDATA[假设来自 Kafka 的数据流，经过应用逻辑的计算，生成状态保存到 state 中，这个过程是源源不断的，如图所示，为了保证state的容错性，程序会周期性的保存数据消费的位置和该时刻的状态，叫做快照，如果程序有异常需要重启的时候，就会从快照中恢复。Flink 支持有状态的计算，可以把数据流的结果一直维持在内存（或 disk）中，比如累加一个点击数，如果某一时刻计算程序挂掉了，如何保证下次重启的时候，重新恢复计算的数据可以从状态中恢复，并且每条数据只被计算了一次呢？但是，您可以配置要保留的定期检查点。]]></description><category></category></item><item><title><![CDATA[使用 Apache Flink 开发实时 ETL]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/130772015</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/130772015</guid><author>sysocc</author><pubDate>Fri, 19 May 2023 18:27:41 +0800</pubDate><description><![CDATA[Apache Flink 是大数据领域又一新兴框架。它与 Spark 的不同之处在于，它是使用流式处理来模拟批量处理的，因此能够提供亚秒级的、符合 Exactly-once 语义的实时处理能力。Flink 的使用场景之一是构建实时的数据通道，在不同的存储之间搬运和转换数据。本文将介绍如何使用 Flink 开发实时 ETL 程序，并介绍 Flink 是如何保证其 Exactly-once 语义的。]]></description><category></category></item><item><title><![CDATA[Spark/Flink广播实现作业配置动态更新]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/130771938</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/130771938</guid><author>sysocc</author><pubDate>Fri, 19 May 2023 18:12:18 +0800</pubDate><description><![CDATA[下图来自Data Artisans（被阿里收购了的Flink母公司）的PPT，其中流A是普通的数据流，流B就是含有配置信息的广播流（broadcast stream），也可以叫控制流（control stream）。它能够将一个流中的数据（通常是较少量的数据）广播到下游算子的所有并发实例中，实现真正的低延迟动态更新。这种方法基本上解决了问题，但不是十全十美的，因为广播数据的更新始终是周期性的，并且周期不能太短（得考虑外部存储的压力），从根本上讲还是受Spark Streaming微批次的设计理念限制的。]]></description><category></category></item><item><title><![CDATA[算法 From on-policy to off-policy]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/130573806</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/130573806</guid><author>sysocc</author><pubDate>Tue, 09 May 2023 10:18:02 +0800</pubDate><description><![CDATA[前面 policy gradient 的做法就是 on-policy，使用参数为 θ 的actor收集训练数据，一旦参数得到更新后，我们就必须重新收集数据，因为此时参数已经变化了，之前收集的 data 就不能用了，整个过程非常耗时。但这里需要解决一个问题，即两个不同参数的actor得到的训练数据的分布是不同的，如何将它们联系起来呢？从公式角度出发，假设前者actor采集的训练资料的分布为q，后者的分布为p，我们应该如何实现这两者之间的转化呢？这里就需要提到一种称为。]]></description><category></category></item><item><title><![CDATA[Actor-Critic算法]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/130573233</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/130573233</guid><author>sysocc</author><pubDate>Tue, 09 May 2023 09:42:04 +0800</pubDate><description><![CDATA[在 Actor-Critic 算法中，Critic 是评判模块（多采用深度神经网络方法），它会对动作的好坏评价，然后反馈给 Actor（多采用深度神经网络方法），让 Actor 更新策略。在 policy gradient 中讲解到的多种评估指标已经涵盖了下面要介绍的 Actor-Critic 的思想，梯度策略算法往往采用回合更新的模式，即每轮结束后才能进行更新。如某盘游戏，假如最后的结果是胜利了，那么可以认为其中的每一步都是好的，反之则认为其中的每一步都是不好的。]]></description><category></category></item><item><title><![CDATA[深度学习——A3C算法]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/130533019</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/130533019</guid><author>sysocc</author><pubDate>Sat, 06 May 2023 18:12:43 +0800</pubDate><description><![CDATA[A3C 通过创建多个 agent，在多个环境实例中并行且异步的执行和学习，有个潜在的好处是不那么依赖于 GPU 或大型分布式系统，实际上 A3C 可以跑在一个多核 CPU 上，而工程上的设计和优化也是原始paper的一个重点。从上图可以看出输出包含2个部分，value network 的部分可以用来作为连续动作值的输出，而 policy network 可以作为离散动作值的概率输出，因此能够同时解决前面提到的2类问题。]]></description><category></category></item><item><title><![CDATA[领域分类/识别方案]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/130532839</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/130532839</guid><author>sysocc</author><pubDate>Sat, 06 May 2023 18:02:49 +0800</pubDate><description><![CDATA[所以，原始数据不能直接拿来作为训练数据，必须要经过人工筛选和标注方可使用。将用户输入与预定义的领域进行匹配。]]></description><category></category></item><item><title><![CDATA[大数据技术架构(组件)35——Spark：Spark Streaming(1)]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/129014879</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/129014879</guid><author>sysocc</author><pubDate>Mon, 13 Feb 2023 18:50:55 +0800</pubDate><description><![CDATA[因此，如果一个批次的处理时间比批次间隔长，那么下一个批次的作业将保持排队,将其设置为 1 的原因是并发作业可能会导致奇怪的资源共享，并且可能难以调试系统中是否有足够的资源来足够快地处理摄取的数据，当然可以通过实验性 Spark 属性 spark.streaming.concurrentJobs 进行更改，默认情况下设置为 1。如果应用程序发生重启的时候，那么会调用Receiver类中的restart()方法，其内部会异步调用onStop方法并隔一定延迟后调用onStart()方法完成重启动作。]]></description><category></category></item><item><title><![CDATA[大数据技术架构(组件)34——Spark：Spark SQL--Optimize]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/129014772</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/129014772</guid><author>sysocc</author><pubDate>Mon, 13 Feb 2023 18:33:52 +0800</pubDate><description><![CDATA[如果一个分区的大小大于所有分区大小的中位数而且大于spark.sql.adaptive.skewedPartitionSizeThreshold，或者分区条数大于所有分区条数的中位数且大于spark.sql.adaptive.skewedPartitionRowCountThreshold。即将小文件存放到DistributedCache中，然后分发到各个Task上，并加载到内存中，类似于Map结构，然后借助于Mapper的迭代机制，遍历大表中的每一条记录，并查找是否在小表中，如果不在则省略。]]></description><category></category></item><item><title><![CDATA[大数据技术架构(组件)33——Spark：Spark SQL--Join Type]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/128982065</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/128982065</guid><author>sysocc</author><pubDate>Sun, 12 Feb 2023 11:49:54 +0800</pubDate><description><![CDATA[1.5、如果用户没有指定任何Join Hint，那么就根据Join的策略Broadcast Hash Join ---> Shuffle Hash Join --> Sort Merge Join ---> Cartesian Product Join --> Broadcast Nested Loop Join顺序选择Join策略。当然用户也可以手动选择策。1、Shuffle阶段：对两个表参与Join的keys使用相同的分区算法和分区数进行分区，目的就是为了保障相同的key都分配到相同的分区里面。]]></description><category></category></item><item><title><![CDATA[大数据技术架构(组件)32——Spark：Spark SQL--Execute Engine]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/128981306</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/128981306</guid><author>sysocc</author><pubDate>Sun, 12 Feb 2023 11:49:48 +0800</pubDate><description><![CDATA[然而对于复杂的SQL查询，它可能使用中间结果来作为join的输入，在计划阶段，Spark并不能精确地知道join中两表的大小或者会错误地估计它们的大小，以致于错失了使用BroadcastHashJoin策略来优化join执行的机会。如何选择最佳的执行计划，这便是Spark SQL的Catalyst优化器的核心工作。是在执行计划中事先划分好stage，然后按stage提交执行，在运行时收集当前stage的shuffle统计信息，以此来优化下一个stage的执行计划，然后再提交执行后续的stage。]]></description><category></category></item><item><title><![CDATA[大数据技术架构(组件)31——Spark：Optimize---＞JVM On Compute]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/128981283</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/128981283</guid><author>sysocc</author><pubDate>Sat, 11 Feb 2023 10:54:28 +0800</pubDate><description><![CDATA[如果shuffle使用的内存超过了这个限制，那么就会把多余的数据溢写到磁盘中，如果作业中RDD持久化的操作比较少的话，shuffle比较多的话，那么可以调大该值，降低缓存内存占用比例。1、内存管理其实就是对象的管理，包括对象的分配和释放，如果显式的释放对象，只要把该对象赋值为null，即该对象变为不可达.GC将负责回收这些不可达对象的内存空间。使用场景：如果两个RDD的倾斜Key特别多，则可以将其中一个RDD的数据进行扩容N倍，另一个RDD的每条数据都打上一个n以内的随机前缀，最后进行join。]]></description><category></category></item><item><title><![CDATA[大数据技术架构(组件)30——Spark：Optimize---＞Submit]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/128981248</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/128981248</guid><author>sysocc</author><pubDate>Sat, 11 Feb 2023 10:52:31 +0800</pubDate><description><![CDATA[同时如果调小缓存层，那么向Mapper端提取的次数就会变多，性能也就会降低，但相对而言首先思考的是应该先让程序跑起来，然后再考虑增加Executor内存，或者调大缓存来对性能层面进一步的改善。spark shuffle中的reducer阶段获取数据，并不是等Mapper端全部结束之后才抓取数据，而是一边进行shuffle，一边抓取处理数据，Reducer在抓取的数据中间有一个缓存，类似于Java NIO方式，通过创建一个缓存区ByteBuffer，从通道把数据读入到缓冲区中,然后交由task进行处理。]]></description><category></category></item><item><title><![CDATA[大数据技术架构(组件)29——Spark：Memory Model（2）]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/128948392</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/128948392</guid><author>sysocc</author><pubDate>Fri, 10 Feb 2023 10:38:48 +0800</pubDate><description><![CDATA[Spark开发者们在做性能分析的时候发现大量的CPU时间会因为等待从内存中读取数据而浪费，所以在Tungsten项目中，通过设计了更加友好的缓存算法和数据结构，让spark花费更少的时间等待cpu从内存中读取数据，提供了更多的计算时间。以上小节介绍了spark对堆的划分，根据使用目的不同，对堆进行了区域划分,并说明了spark1.6之前和之后使用的两种不同内存模型管理以及之间的区别，那么这里继续逐步分析，说到内存管理，spark是如何通过进行内存寻址，内存块是如何封装的，通过何种方式来组织管理这些内存块？]]></description><category></category></item><item><title><![CDATA[大数据技术架构(组件)28——Spark：Memory Model（1）]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/128947555</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/128947555</guid><author>sysocc</author><pubDate>Fri, 10 Feb 2023 10:38:16 +0800</pubDate><description><![CDATA[经过序列化的对象，是以字节流的形式存在，占用的内存大小是可以直接计算，而对于非序列化的对象，占用的内存只能通过周期性地采样近似估算得到的，也就是说每次新增的数据项都会计算一次占用的内存大小，这种方式会有一定的误差，可能会导致某一时刻的实际内存超过预期。4、执行内存可以借用尽可能多空闲的存储内存，但是执行内存由于执行操作所涉及的复杂性，执行内存永远不会被存储区逐出，也就是说如果执行内存已经占用存储内存的大部分空间，那么缓存块就会有可能失败，在这种情况下，根据存储级别的设置，新的块会被立即逐出内存。]]></description><category></category></item><item><title><![CDATA[大数据技术架构(组件)27——Spark：Cache&Checkpoint & Broadcast&Accumulate]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/128947465</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/128947465</guid><author>sysocc</author><pubDate>Thu, 09 Feb 2023 09:48:43 +0800</pubDate><description><![CDATA[（这里会进行检查，如果程序在集群中运行，但是目录设置的是本地，那么会记录一个警告，然后driver会试图从它的本地文件系统重建RDD的checkpoint检测点，因为checkpoint文件检查点不正确。2、如果某个RDD需要进行checkpoint，那么就会生成RDDCheckpointData对象，首先会调用doCheckpoint方法，其内部会通过checkpoint方法会标记RDD的检查点，移除所有引用的父RDDS，来截断RDD血统，并保存到对应的目录中。避免了容错、更新顺序逻辑的考虑。]]></description><category></category></item><item><title><![CDATA[大数据技术架构(组件)26——Spark：Shuffle]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/128947344</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/128947344</guid><author>sysocc</author><pubDate>Thu, 09 Feb 2023 09:45:08 +0800</pubDate><description><![CDATA[sort shuffle其核心借助于ExternalSorter首先会把每个ShuffleMapTask的输出排序内存中，当超过内存容纳的时候，会spill到一个文件中(FileSegmentGroup)，同时还会写一个索引文件用来区分下一个阶段Reduce Task不同的内容来告诉下游Stage的并行任务哪些数据是属于自己的。第二次是根据数据本身的Key进行排序,当然第二次排序除非调用了带排序的方法，在方法里指定了Key值的Ordering实例，这个时候才会对分区内的数据进行排序）。]]></description><category></category></item><item><title><![CDATA[大数据技术架构(组件)25——Spark：By算子 & SparkContext]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/128923760</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/128923760</guid><author>sysocc</author><pubDate>Wed, 08 Feb 2023 09:35:13 +0800</pubDate><description><![CDATA[功能：使用关联函数和中性的“零值”合并每个键的值，可以将其添加到结果中任意次数，并且不得更改结果;相对于aggregateByKey来说局部聚合和全局聚合的规则是一样的，而aggregateByKey对应的局部聚合和全局聚合的规则可以不一样。操作：其实就是按照一定分区规则进行分组，将相同的key的value组装到一个序列中去，然后不保证组内有序的。当程序提交之后，获取到资源就开始真正的计算了，那么在计算的过程中需要分发Task，task在执行的过程中需要监控其运行状态，以及中间的资源分配释放等动作。]]></description><category></category></item><item><title><![CDATA[大数据技术架构(组件)24——Spark：RDD & Partition]]></title><link>https://blog.youkuaiyun.com/sysocc/article/details/128923727</link><guid>https://blog.youkuaiyun.com/sysocc/article/details/128923727</guid><author>sysocc</author><pubDate>Wed, 08 Feb 2023 09:35:01 +0800</pubDate><description><![CDATA[2、如果源分区数S>目标分区数T,且是一种极端的合并，比如从1000个分区数进行重新分配到几个分区，那么这个时候可能会造成运行节点IO异常甚至OOM，所以为了避免这种情况发生，可以设置shuffle=true。RDD每次转换都会生成新的RDD，所以RDD之间会形成依赖关系，对于这种关系，RDD会进行存储，这样当发生错误的时候可以从上一个RDD中进行恢复，这样保证了容错，对于RDD的容错又分为了几种情况。分区器的使用只针对于KV类型的RDD，也就是说对于非KV类型的RDD没有具体的分区器。]]></description><category></category></item></channel></rss>