- 博客(114)
- 资源 (11273)
- 问答 (1)
- 收藏
- 关注
原创 CDC是什么?有没有合适的技术方案?
CDC 是 Change Data Capture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动(包括数据或数据表的插入、更新以及删除等),将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅及消费。
2023-06-07 09:53:27 955
原创 Flink有状态计算的状态容错
假设来自 Kafka 的数据流,经过应用逻辑的计算,生成状态保存到 state 中,这个过程是源源不断的,如图所示,为了保证state的容错性,程序会周期性的保存数据消费的位置和该时刻的状态,叫做快照,如果程序有异常需要重启的时候,就会从快照中恢复。Flink 支持有状态的计算,可以把数据流的结果一直维持在内存(或 disk)中,比如累加一个点击数,如果某一时刻计算程序挂掉了,如何保证下次重启的时候,重新恢复计算的数据可以从状态中恢复,并且每条数据只被计算了一次呢?但是,您可以配置要保留的定期检查点。
2023-05-22 09:59:39 508
原创 使用 Apache Flink 开发实时 ETL
Apache Flink 是大数据领域又一新兴框架。它与 Spark 的不同之处在于,它是使用流式处理来模拟批量处理的,因此能够提供亚秒级的、符合 Exactly-once 语义的实时处理能力。Flink 的使用场景之一是构建实时的数据通道,在不同的存储之间搬运和转换数据。本文将介绍如何使用 Flink 开发实时 ETL 程序,并介绍 Flink 是如何保证其 Exactly-once 语义的。
2023-05-19 18:27:41 2036 3
原创 Spark/Flink广播实现作业配置动态更新
下图来自Data Artisans(被阿里收购了的Flink母公司)的PPT,其中流A是普通的数据流,流B就是含有配置信息的广播流(broadcast stream),也可以叫控制流(control stream)。它能够将一个流中的数据(通常是较少量的数据)广播到下游算子的所有并发实例中,实现真正的低延迟动态更新。这种方法基本上解决了问题,但不是十全十美的,因为广播数据的更新始终是周期性的,并且周期不能太短(得考虑外部存储的压力),从根本上讲还是受Spark Streaming微批次的设计理念限制的。
2023-05-19 18:12:18 830 1
原创 算法 From on-policy to off-policy
前面 policy gradient 的做法就是 on-policy,使用参数为 θ 的actor收集训练数据,一旦参数得到更新后,我们就必须重新收集数据,因为此时参数已经变化了,之前收集的 data 就不能用了,整个过程非常耗时。但这里需要解决一个问题,即两个不同参数的actor得到的训练数据的分布是不同的,如何将它们联系起来呢?从公式角度出发,假设前者actor采集的训练资料的分布为q,后者的分布为p,我们应该如何实现这两者之间的转化呢?这里就需要提到一种称为。
2023-05-09 10:18:02 119
原创 Actor-Critic算法
在 Actor-Critic 算法中,Critic 是评判模块(多采用深度神经网络方法),它会对动作的好坏评价,然后反馈给 Actor(多采用深度神经网络方法),让 Actor 更新策略。在 policy gradient 中讲解到的多种评估指标已经涵盖了下面要介绍的 Actor-Critic 的思想,梯度策略算法往往采用回合更新的模式,即每轮结束后才能进行更新。如某盘游戏,假如最后的结果是胜利了,那么可以认为其中的每一步都是好的,反之则认为其中的每一步都是不好的。
2023-05-09 09:42:04 130
原创 深度学习——A3C算法
A3C 通过创建多个 agent,在多个环境实例中并行且异步的执行和学习,有个潜在的好处是不那么依赖于 GPU 或大型分布式系统,实际上 A3C 可以跑在一个多核 CPU 上,而工程上的设计和优化也是原始paper的一个重点。从上图可以看出输出包含2个部分,value network 的部分可以用来作为连续动作值的输出,而 policy network 可以作为离散动作值的概率输出,因此能够同时解决前面提到的2类问题。
2023-05-06 18:12:43 898
原创 大数据技术架构(组件)35——Spark:Spark Streaming(1)
因此,如果一个批次的处理时间比批次间隔长,那么下一个批次的作业将保持排队,将其设置为 1 的原因是并发作业可能会导致奇怪的资源共享,并且可能难以调试系统中是否有足够的资源来足够快地处理摄取的数据,当然可以通过实验性 Spark 属性 spark.streaming.concurrentJobs 进行更改,默认情况下设置为 1。如果应用程序发生重启的时候,那么会调用Receiver类中的restart()方法,其内部会异步调用onStop方法并隔一定延迟后调用onStart()方法完成重启动作。
2023-02-13 18:50:55 482
原创 大数据技术架构(组件)34——Spark:Spark SQL--Optimize
如果一个分区的大小大于所有分区大小的中位数而且大于spark.sql.adaptive.skewedPartitionSizeThreshold,或者分区条数大于所有分区条数的中位数且大于spark.sql.adaptive.skewedPartitionRowCountThreshold。即将小文件存放到DistributedCache中,然后分发到各个Task上,并加载到内存中,类似于Map结构,然后借助于Mapper的迭代机制,遍历大表中的每一条记录,并查找是否在小表中,如果不在则省略。
2023-02-13 18:33:52 531
原创 大数据技术架构(组件)33——Spark:Spark SQL--Join Type
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都分配到相同的分区里面。
2023-02-12 11:49:54 720
原创 大数据技术架构(组件)32——Spark:Spark SQL--Execute Engine
然而对于复杂的SQL查询,它可能使用中间结果来作为join的输入,在计划阶段,Spark并不能精确地知道join中两表的大小或者会错误地估计它们的大小,以致于错失了使用BroadcastHashJoin策略来优化join执行的机会。如何选择最佳的执行计划,这便是Spark SQL的Catalyst优化器的核心工作。是在执行计划中事先划分好stage,然后按stage提交执行,在运行时收集当前stage的shuffle统计信息,以此来优化下一个stage的执行计划,然后再提交执行后续的stage。
2023-02-12 11:49:48 541
原创 大数据技术架构(组件)31——Spark:Optimize--->JVM On Compute
如果shuffle使用的内存超过了这个限制,那么就会把多余的数据溢写到磁盘中,如果作业中RDD持久化的操作比较少的话,shuffle比较多的话,那么可以调大该值,降低缓存内存占用比例。1、内存管理其实就是对象的管理,包括对象的分配和释放,如果显式的释放对象,只要把该对象赋值为null,即该对象变为不可达.GC将负责回收这些不可达对象的内存空间。使用场景:如果两个RDD的倾斜Key特别多,则可以将其中一个RDD的数据进行扩容N倍,另一个RDD的每条数据都打上一个n以内的随机前缀,最后进行join。
2023-02-11 10:54:28 478
原创 大数据技术架构(组件)30——Spark:Optimize--->Submit
同时如果调小缓存层,那么向Mapper端提取的次数就会变多,性能也就会降低,但相对而言首先思考的是应该先让程序跑起来,然后再考虑增加Executor内存,或者调大缓存来对性能层面进一步的改善。spark shuffle中的reducer阶段获取数据,并不是等Mapper端全部结束之后才抓取数据,而是一边进行shuffle,一边抓取处理数据,Reducer在抓取的数据中间有一个缓存,类似于Java NIO方式,通过创建一个缓存区ByteBuffer,从通道把数据读入到缓冲区中,然后交由task进行处理。
2023-02-11 10:52:31 397
原创 大数据技术架构(组件)29——Spark:Memory Model(2)
Spark开发者们在做性能分析的时候发现大量的CPU时间会因为等待从内存中读取数据而浪费,所以在Tungsten项目中,通过设计了更加友好的缓存算法和数据结构,让spark花费更少的时间等待cpu从内存中读取数据,提供了更多的计算时间。以上小节介绍了spark对堆的划分,根据使用目的不同,对堆进行了区域划分,并说明了spark1.6之前和之后使用的两种不同内存模型管理以及之间的区别,那么这里继续逐步分析,说到内存管理,spark是如何通过进行内存寻址,内存块是如何封装的,通过何种方式来组织管理这些内存块?
2023-02-10 10:38:48 360
原创 大数据技术架构(组件)28——Spark:Memory Model(1)
经过序列化的对象,是以字节流的形式存在,占用的内存大小是可以直接计算,而对于非序列化的对象,占用的内存只能通过周期性地采样近似估算得到的,也就是说每次新增的数据项都会计算一次占用的内存大小,这种方式会有一定的误差,可能会导致某一时刻的实际内存超过预期。4、执行内存可以借用尽可能多空闲的存储内存,但是执行内存由于执行操作所涉及的复杂性,执行内存永远不会被存储区逐出,也就是说如果执行内存已经占用存储内存的大部分空间,那么缓存块就会有可能失败,在这种情况下,根据存储级别的设置,新的块会被立即逐出内存。
2023-02-10 10:38:16 269
原创 大数据技术架构(组件)27——Spark:Cache&Checkpoint & Broadcast&Accumulate
(这里会进行检查,如果程序在集群中运行,但是目录设置的是本地,那么会记录一个警告,然后driver会试图从它的本地文件系统重建RDD的checkpoint检测点,因为checkpoint文件检查点不正确。2、如果某个RDD需要进行checkpoint,那么就会生成RDDCheckpointData对象,首先会调用doCheckpoint方法,其内部会通过checkpoint方法会标记RDD的检查点,移除所有引用的父RDDS,来截断RDD血统,并保存到对应的目录中。避免了容错、更新顺序逻辑的考虑。
2023-02-09 09:48:43 322
原创 大数据技术架构(组件)26——Spark:Shuffle
sort shuffle其核心借助于ExternalSorter首先会把每个ShuffleMapTask的输出排序内存中,当超过内存容纳的时候,会spill到一个文件中(FileSegmentGroup),同时还会写一个索引文件用来区分下一个阶段Reduce Task不同的内容来告诉下游Stage的并行任务哪些数据是属于自己的。第二次是根据数据本身的Key进行排序,当然第二次排序除非调用了带排序的方法,在方法里指定了Key值的Ordering实例,这个时候才会对分区内的数据进行排序)。
2023-02-09 09:45:08 604
原创 大数据技术架构(组件)25——Spark:By算子 & SparkContext
功能:使用关联函数和中性的“零值”合并每个键的值,可以将其添加到结果中任意次数,并且不得更改结果;相对于aggregateByKey来说局部聚合和全局聚合的规则是一样的,而aggregateByKey对应的局部聚合和全局聚合的规则可以不一样。操作:其实就是按照一定分区规则进行分组,将相同的key的value组装到一个序列中去,然后不保证组内有序的。当程序提交之后,获取到资源就开始真正的计算了,那么在计算的过程中需要分发Task,task在执行的过程中需要监控其运行状态,以及中间的资源分配释放等动作。
2023-02-08 09:35:13 253
原创 大数据技术架构(组件)24——Spark:RDD & Partition
2、如果源分区数S>目标分区数T,且是一种极端的合并,比如从1000个分区数进行重新分配到几个分区,那么这个时候可能会造成运行节点IO异常甚至OOM,所以为了避免这种情况发生,可以设置shuffle=true。RDD每次转换都会生成新的RDD,所以RDD之间会形成依赖关系,对于这种关系,RDD会进行存储,这样当发生错误的时候可以从上一个RDD中进行恢复,这样保证了容错,对于RDD的容错又分为了几种情况。分区器的使用只针对于KV类型的RDD,也就是说对于非KV类型的RDD没有具体的分区器。
2023-02-08 09:35:01 237
原创 大数据技术架构(组件)23——Spark:Spark Core-Overall Architecture&Run Schema
这样独立的好处在于每个程序在独立的JVM中调度各自的任务,从资源层面上的隔离结合执行调度层面的隔离保证每个应用相互独立,提高其稳定性。5、Executor上的BlockManager提供了内存和磁盘的共同存储机制,所以在迭代计算产生中间结果的时候不需要存储到分布式系统中,这样后续可以直接读取中间结果,避免了网络IO或者磁盘IO。2、Spark服务和集群管理器无关,只要能够获取到executor进程使其执行任务,并且进程间可以互相通信,那么底层采用什么样的管理器(如mesos/yarn)都是可以的。
2023-02-07 18:26:18 268
原创 大数据技术架构(组件)22——Hive:补充
1、内存方面:在Insert场景下,每个动态目录分区写入器(File Writer)至少会打开一个文件,特别是对于parquert或者orc格式的文件,在写入的时候会首先写到缓冲区中,而这些缓冲区是按照分区来维护的,在运行的时候需要的内存量会随着分区数增加而增加。3.2、如果是大量的key造成的情况,可以采用二次聚合的方式(有一定的限制,只能是一些聚合统计操作,如sum/min/max;3.3、针对3.2的一些限制,可以采用扩容的操作,即key前缀增加n个数,非倾斜部分数据要扩大N倍。
2023-02-07 18:21:20 403
原创 大数据技术架构(组件)21——Hive:Parameter optimization
N = min(hive.exec.reducers.max,总输入数据量/hive.exec.reducers.bytes.per.reducer)通过配置参数hive.exec.mode.local.auto=true,由hive自动执行优化。1、job的输入数据必须小于参数:hive.exec.mode.local.auto.inputbytes.max。同时需要结合集群配置的块大小设置。2、job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max。
2023-02-05 13:53:17 367
原创 大数据技术架构(组件)20——Hive:External Table or Managed Table & Bucket & Scheduled Queries
1、内部表又称为托管表,Hive管理其数据、元数据,统计信息;外部表的数据由HDFS管理,并不是只能通过Hive方式命令来操作数据。3、内部表的数据存储在hive.metastore.warehouse.dir参数配置下的路径。对于执行信息的保留策略通过metastore.scheduled.queries.execution.max.age参数配置。1、如果单个分区的数据量也很大,且不能更加细粒度划分数据的时候,那么这个时候就需要使用分桶再次对数据进行划分管理。6、对于事务/ACID只能作用域内部表。
2023-02-05 13:05:56 316
原创 大数据技术架构(组件)19——Hive:FileFormats(2)
比如Gzip或者Bzip2,当然对于一些不可切分的压缩格式,在生成MR任务的时候,Map数就会有所限制,不能很好的发挥算力。通过set hive.exec.compress.output命令来查看当前系统环境支持的压缩类型。orc.bloom.filter.columns:创建字段对应的布隆过滤器,字段之间以逗号分隔。orc.row.index.stride:索引之间的行数,必须得大于1000。orc.bloom.filter.fpp:布隆过滤器的误报概率。orc.compress.size:压缩大小。
2023-02-04 16:57:55 384
原创 大数据技术架构(组件)18——Hive:FileFormats(1)
第二部分是行组的元数据头部,用 于存储行组单元的信息,包括行组中的记录数、每个列的字节数、列中每个域的字节数;从图可以看出,首先存储了列A的所有域,然后存储列B的所有域等。5、parquet文件格式对于谓词下推的优化方法在于对每个行组中的每个列块,在存储的时候都会去计算对应的统计信息,比如列块的最大值、最小值和空值个数,通过这些信息可以判断该行组是否需要扫描;1、文件头header包括每个文件块存储一个行组,一个行组的大小通常是一个块的大小,这个一个mapper就可以处理一个行组,增大任务执行度。
2023-02-04 16:36:49 688
原创 大数据技术架构(组件)17——Hive:UDF/UDTF/UDAF三者区别
我们写一段SQL,调用UDF,得到结果就算是结束了,但大家有没有想过UDF底层是怎么执行的呢?如上图所示,对于SUM类型的UDAF是在map端和reduce端都执行了,哎呦,这是怎么回事呢?在实际场景中用的不多,该类型的执行阶段通常是在本地,大家也可以理解成是做map转换和UDF是一样的阶段。首先抛开在哪端执行不说,那我们知道UDF的模式是我们给一个值,然后再返回一个值。如上图所示,传一个A,返回给一个A_1;从这里也可以看出来这就是一个转换功能,但有些同学仍有疑惑,没关系,让我们来一个走MR的例子。
2023-02-03 09:32:32 1511
原创 大数据技术架构(组件)16——Hive:内置UDTF函数
有效的部分名称为:HOST、PATH、QUERY、REF、PROTOCOL、AUTHORITY、FILE、USE。使用 int 类型的附加位置列(原始数组中项目的位置,从 0 开始)将数组分解为多行。返回一个包含两列 (pos,val) 的行集,数组中的每个元素占一行,其实就是带有序号的explode功能。返回一个包含两列 (key,value) 的行集,输入映射中的每个键值对对应一行。将一个结构数组分解为多行。返回一个有N列的行集(N=结构中顶级元素的数量),每个结构在数组中都有一行。
2023-02-03 09:32:14 205
原创 大数据技术架构(组件)15——Hive:内置UDAF函数
count(DISTINCT expr[, expr]) -返回提供的表达式唯一且非 NULL 的行数。将一个有序的分区分成 x 个称为桶的组,并为分区中的每一行分配一个桶号。输出是表示 bin 中心和高度的双值 (x,y) 坐标的大小为 b 的数组。返回线性回归线的 y 截距,即等式中 b 的值依赖 = a * independent + b。返回线性回归线的斜率,即等式中 a 的值依赖 = a * independent + b。返回具有重复项的对象列表,(从 Hive 0.13.0 开始。
2023-02-02 09:31:14 253
原创 大数据技术架构(组件)14——Hive:掩码函数&杂项函数
计算 SHA-2 系列哈希函数(SHA-224、SHA-256、SHA-384 和 SHA-512)(从 Hive 1.3.0 开始))。默认情况下,大写字母转换为“X”,小写字母转换为“x”,数字转换为“n”。例如, mask("abcd-EFGH-8765-4321", "U", "l", "#") 结果为 llll-UUUU-####-####例如, mask_show_last_n("1234-5678-8765-4321", 4) 结果为 nnnn-nnnn-nnnn-4321。
2023-02-02 09:31:01 391
原创 大数据技术架构(组件)13——Hive:字符串函数
使用提供的字符集('US-ASCII'、'ISO-8859-1'、'UTF-8'、'UTF-16BE'、'UTF-16LE'、'UTF- 16')。使用提供的字符集('US-ASCII'、'ISO-8859-1'、'UTF-8'、'UTF-16BE'、'UTF-16LE'、'UTF- 16')。--返回 'abc,b,ab,c,def' 中第一次出现的 ab ,其中 'abc,b,ab,c,def' 是逗号分隔的字符串。例如, concat('foo', 'bar') 结果为 'foobar'。
2023-02-01 19:26:40 732
原创 大数据技术架构(组件)12——Hive:判断函数
如果 a=b,则返回 NULL;如果“条件”不为真,则抛出异常,否则返回 null(从 Hive 0.8.0 开始)。当 a = true 时,返回 b;返回第一个不是 NULL 的 v,如果所有 v 都是 NULL,则返回 NULL。如果值为 null 则返回默认值,否则返回值(从 Hive 0.11 开始)当 a = b 时,返回 c;当 a = d 时,返回 e;如果 a 不是 NULL,则返回 true,否则返回 false。如果 a 为 NULL,则返回 true,否则返回 false。
2023-02-01 19:08:29 402
原创 大数据技术架构(组件)11——Hive:日期函数
将格式为 yyyy-MM-dd HH:mm:ss 的时间字符串转换为 Unix 时间戳(以秒为单位),使用默认时区和默认语言环境,如果失败则返回 0: unix_timestamp('2009-03-20 11:30:01 ') = 1237573801。add_months('2009-08-31', 1) 返回'2009-09-30'.add_months('2017-12-31 14:15:16', 2, 'YYYY-MM-dd HH:mm:ss') 返回'2018-02-28 14:15:16'.
2023-01-30 09:33:29 410
原创 大数据技术架构(组件)10——Hive:集合函数&类型转化函数
例如, cast('1' as BIGINT) 会将字符串 '1' 转换为其整数表示。如果转换不成功,则返回 null。如果 cast(expr as boolean) Hive 为非空字符串返回 true。注意:该函数中判断参数的类型要和数组元素类型保持一致,否则会查询失败。根据数组元素的自然顺序对输入数组进行升序排序并返回。如果数组包含值,则返回 TRUE。返回array数组中的元素个数。返回map中的所有value。返回map中的所有key。1.4.4、类型转化函数。返回map中的元素个数。
2023-01-29 11:19:07 266
原创 大数据技术架构(组件)9——Hive:数学函数
如果expr < min_value,返回1,如果expr > max_value 返回num_buckets+1。对于bigint a,返回bigint。将 a 的符号返回为“1.0”(如果 a 为正)或“-1.0”(如果 a 为负),否则返回“0.0”。如果 -1
2023-01-29 10:40:23 347
原创 大数据技术架构(组件)8——Hive:Function Cases & UDF/UDTF/UDAF 1
具体可以见HIVE-7314。自定义函数:参考org.apache.hadoop.hive.ql.udf.generic.GenericUDAFMax。get_json_object:使用频率 ★★★★★。regexp_replace:使用频率 ★★★★★。unix_timestamp:使用频率 ★★★★★。regexp_extract:使用频率 ★★★★。from_unxitime:使用频率 ★★★★★。collect_list:使用频率 ★★★★★。collect_set:使用频率 ★★★★★。
2023-01-27 08:08:53 504
原创 大数据技术架构(组件)7——Hive:Filter PushDown Cases And Outer Join Behavior
1、Join On中的谓词: 左表不下推、右表不下推(前提:关闭mapjoin优化)1、Join On中的谓词: 左表不下推、右表下推(前提:关闭mapjoin优化)1、Join On中的谓词: 左表下推、右表不下推(前提:关闭mapjoin优化)1、Join On中的谓词: 左表下推、右表下推。2、Where谓词:左表不下推、右表不下推。2、Where谓词:左表下推、右表下推。2、Where谓词:左表下推、右表下推。2、Where谓词:左表下推、右表下。
2023-01-26 20:36:21 855
原创 大数据技术架构(组件)6——Hive:流程剖析3
该框架内的MapReduce和hadoop底层的MR组件不一样,hive自身的MR框架,Map和Reduce是独立开的,每个阶段都是直接使用输入输出流,两者之间并没有依赖关系。同样在hive的源码中也可以发现,ExecDriver在配置Job的时候是绑定了ExecMapper和ExecReducer,那么底层引擎是依赖于MapReduce的。常规上思考MapReduce任务肯定是要有map阶段的,reduce阶段输入数据是通过map端输出数据拿来的。但是在Hive的源码中存在另外一个MR框架。
2023-01-18 10:40:51 320
原创 大数据技术架构(组件)5——Hive:流程剖析2
Stage划分的界限决定于ReduceSinkOperator,在遇到ReduceSinkOperator之前的Operator都划分到Map阶段,同时也标识这Map阶段的结束。Stage是Hive执行任务中的某一个阶段,那么这个阶段可能是一个MR任务,也可能是一个抽取任务,也可能是一个Map Reduce Local ,也可能是一个Limit。R5:UNION% ---->如果所有的子查询都是map-only,则把所有的MapWork进行合并连接。第三个Job发生的Map阶段。
2023-01-18 10:26:38 384
原创 大数据技术架构(组件)——Hive:流程剖析1
5、SemanticAnalyzer会遍历AST Tree,进一步进行语义分析,这个时候会和Hive MetaStore进行通信获取Schema信息,抽象成QueryBlock,逻辑计划生成器会遍历QueryBlock,翻译成Operator(计算抽象出来的算子)生成OperatorTree,这个时候是未优化的逻辑计划。6、Optimizer会对逻辑计划进行优化,如进行谓词下推、常量值替换、列裁剪等操作,得到优化后的逻辑计划。2、提交sql,通过Driver进行编译、解析、优化逻辑计划,生成物理计划。
2023-01-17 18:04:34 452
算法源码-相关性分析:基于(互)相关性的数字信号处理与信号识别(matlab实现)+源代码.zip
2023-06-06
JAVA精品毕业设计项目:JAVA-JSP企业合同管理系统(源代码+数据库+论文任务书检查表答辩PPT+项目说明等).zip
2023-06-13
Highcharts横坐标问题
2018-04-23
TA创建的收藏夹 TA关注的收藏夹
TA关注的人