- 博客(75)
- 资源 (1)
- 收藏
- 关注
原创 Hadoop实战&源码分析系列,持续更新
Hadoop实战MAC单机hadoop环境搭建&Wordcount实现mr实现join的功能–Map端Joinmr实现join的功能–Reduce端Join源码分析Hadoop源码分析之文件拆分Hive基础Hive实战-建表相关操作一文讲懂Hive窗口函数UDFHive深入浅出UDFHive深入浅出UDAFHive深入浅出UDTFHive深入浅出Transform-Scripts执行计划Hive执行计划分析之group by执行计划分析调优...
2020-12-08 18:27:25 205
原创 Spark实战&源码分析系列,持续更新
基于spark 2.11的源码分析系列,不定时更新中、deployRDDRDD源码分析之PartitionRDD源码分析之Dependencystage划分任务调度&执行Spark Task执行流程源码分析系列之一: 基础Spark Task执行流程源码分析系列之二: 任务构建&调度&资源分配Spark Task执行流程源码分析系列之三: TaskSetManager分析Spark Task执行流程源码分析系列之四: 任务启动&运行&结果处理sh
2020-11-18 11:12:49 769 2
原创 MergeTree概述
Clickhouse 中最强大的表引擎当属 MergeTree (合并树)引擎及该系列(MergeTree)中的其他引擎。MergeTree 系列的引擎被设计用于插入极大量的数据到一张表当中,数据可以以数据片段的形式一个接着一个的快速写入,数据片段在后台按照一定的规则进行合并。
2022-12-28 11:40:31 1720
原创 MergeTree写入&查询流程分析
分区,索引,数据存储这些组件配合在一起给Clickhouse数据库带来非常高效的查询性能,本文从写入过程、查询过程,以及数据标记与压缩数据块的三种对应关系的角度展开介绍。
2022-12-28 10:05:38 848
原创 MergeTree原理之存储
我们都知道在MergeTree中数据是按列存储的,但是具体到存储的细节、以及如何工作的,都存在很多疑问。数据存储,就好比一本书中的文字,在排版时,绝不会密密麻麻地把文字堆满,这样会导致难以阅读。更为优雅的做法是,将文字按段落的形式精心组织,使其错落有致。本节将介绍MergeTree在数据存储方面的细节,尤其是其中关于压缩数据块的概念。
2022-12-28 10:02:42 671
原创 MergeTree原理之二级索引
除了一级索引之外,MergeTree同样支持二级索引,二级索引又称跳数索引,由数据的聚合信息构建而成。根据索引类型的不同,其聚合信息的内容也不同,当然跳数索引的作用和一级索引是一样的,也是为了查询时减少数据的扫描范围
2022-12-28 09:55:19 1071
原创 MergeTree原理之一级索引
MergeTree的主键使用`PRIMARY KEY`定义,待主键定义之后,MergeTree会依据`index_granularity`间隔(默认8192行),为数据表生成一级索引并保存至`primary.idx`文件内,索引数据按照PRIMARY KEY排序。相比使用PRIMARY KEY定义,更为常见的简化形式是通过ORDER BY指代主键。在此种情形下,PRIMARY KEY与ORDER BY定义相同,所以索引(primary.idx)和数据(.bin)会按照完全相同的规则排序。
2022-12-27 17:55:11 557
原创 MergeTree原理之分区
在MergeTree表引擎中,数据是以分区目录的形式进行组织的,每个分区独立分开存储,这样子在数据查询时候可以跳过无用的数据分区,最小化扫描的数据文件,从而达到加快查询的效果。本文将从分区的规则,底层目录的格式以及分区的合并规则等方面详细讲解数据分区目录具体是如何运作的。
2022-12-27 17:46:12 772
原创 leetcode系列-1642. Furthest Building You Can Reach
1642. Furthest Building You Can Reach
2022-06-21 20:24:53 196
原创 Hive常见调优总结
基础设置队列选择yarn队列分配,选择合适的队列进行运行,避免都在同一个繁忙的队列中运行。SET mapreduce.job.queuename=xx;控制mapper&reducer数目合理控制文件切分的各种参数,使Mapper和Reducer数目达到一个合适的值,可以加快处理速度。// HiveInputFormat文件格式# 文件分割最大大小set mapreduce.input.fileinputformat.split.maxsize=536870912;# 文件分割最
2020-12-14 11:56:25 1249
原创 Hive调优之map&reduce数目
map数目确定方法Map数目的划分是由输入文件大小,个数等因素决定的,另外不同的文件输入格式切分map数目的方法也是不一样的,我们来看下Hive使用的两种输入格式的Map数目确定方法。HiveInputFormatMapTask的数目主要有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改),控制这些变量的参数如下:set hive.input.format=org.apa
2020-12-09 16:56:30 808
原创 Hadoop深入浅出Hadoop Streaming&MRJob
Hadoop Streaming 是Hadoop提供的一个 MapReduce 编程工具,它允许用户使用任何可执行文件、脚本语言或其他编程语言来实现 Mapper 和 Reducer 作业。Hadoop Streaming 使用了 Unix 的标准输入输出作为 Hadoop 和其他编程语言的开发接口,因此在其他的编程语言所写的程序中,只需要将标准输入作为程序的输入,将标准输出作为程序的输出就可以了。原理分析Hadoop Streaming是Hadoop的一个工具, 它帮助用户创建和运行一类特殊的ma.
2020-12-09 15:41:39 544
原创 Hive深入浅出Transform-Scripts
前面我们讲解了UDF,UDAF,UDTF的原理以及实现思路,本文我们介绍一种轻量级的自定义函数的实现方法,Hive的TRANSFORM关键字提供了在SQL中调用自写脚本的功能,适合实现Hive中没有的功能又不想写UDF的情况。使用实例脚本编写我们来看一个具体的实例,比较简单,直接读取列的值,解析出来,然后在封装返回,没有做任何业务处理,如下所示:#!/usr/bin/pythonimport sysfor line in sys.stdin: // 多列以\t分割 a, .
2020-12-08 18:10:52 593
原创 Hive深入浅出UDTF
前面两篇文章我们分析了UDF和UDAF的原理以及实现思路,这一节我们介绍另外一种UDF: UDTF((User-Defined Table-Generating Functions),是用来解决输入一行输出多行的需求的,本节我们来详细分析下UDTF如何实现以及如何与lateral view一起结合使用。概述UDTF(User-Defined Table-Generating Functions)是用来解决输入一行输出多行的需求。执行步骤要实现UDTF,我们需要继承org.apache.hadoo.
2020-12-08 17:07:50 2492
原创 Hive深入浅出UDAF
上一篇我们讲解了基本UDF的编写,这一节我们来看下UDAF[User Defined Aggregation Functions],自定义聚合函数,用来处理输入多行,输出一行的操作,类似MapReduce中Reduce操作。UDAF是需要在hive的sql语句和group by联合使用,hive的group by对于每个分组,只能返回一条记录。概述Hive是构建在Hadoop上的数据仓库,我们的sql语句最终都是要变成Mapreduce函数,只不过hive已经帮助我们写好并隐藏mapreduce ,.
2020-12-08 11:58:12 5066 1
原创 Hive深入浅出UDF
Hive是一种构建在Hadoop上的数据仓库,Hive把SQL查询转换为一系列在Hadoop集群中运行的MapReduce作业,是MapReduce更高层次的抽象,不用编写具体的MapReduce方法,带来了很多便利,但是有时候hive提供的函数功能满足不了业务需要,就需要我们自己来写UDF函数来辅助完成。UDF函数其实就是一个简单的函数,执行过程就是在Hive转换成Mapreduce程序后,执行java方法,类似于像Mapreduce执行过程中加入一个插件,方便扩展。UDF只能实现一进一出的操作,如果需.
2020-12-08 09:48:42 1542 1
原创 Spark源码分析系列之RDD
面试过程中经常会遇到一个问题:谈谈你对Spark RDD的理解,你该如何回答呢?RDD是弹性数据集,是Spark的基础数据结构,然后呢,没了吗?那我觉得可能面试官觉得你应该处于最低级的水平,本文详细的介绍了RDD,面试过程中你如果按照下面的顺序进行描述RDD,面试官应该会对你刮目相看。概述RDD是(Resilient Distributed Dataset)弹性分布式数据集,Spark中数据的基本抽象,表示不可变的,分区的可以并行操作的元素集合。RDD有五大部分组成:分区集合: partitio.
2020-12-07 14:57:38 405
原创 Spark DAGScheduler源码分析系列之二: 事件处理器
概述DAGScheduler中处理任务提交,任务失败,增加节点,删除节点等事件是通过事件处理器进行的。EventLoop用来接收来自调用者的事件并在线程中处理所有的事件。这是一个典型的生产消费模型:生产者通过调用DAGSchedulerEventProcessLoop.post(event: E)来将消息进行发布;消费者Eventloop内部维护了一个线程,循环的消费消息eventQueue.take(),调用onReceive(event)进行处理。DAGSchedulerEventProcessLoo
2020-12-04 16:22:01 380
原创 Spark Shuffle源码分析系列之UnsafeShuffleWriter
前面我们介绍了BypassMergeSortShuffleWriter和SortShuffleWriter,知道了它们的应用场景和实现方式,本节我们来看下UnsafeShuffleWriter,它使用了Tungsten优化,排序的是二进制的数据,不会对数据进行反序列化操作,在某些情况下会加速Shuffle过程。概述UnsafeShuffleWriter提供了以序列化方式写入文件的方式,写入的内存既可以是on-heap也可以是off-heap,当数据到来时候,先序列化,然后使用序列化的数据排序,要想使.
2020-12-04 13:25:12 615
原创 Spark DAGScheduler源码分析系列之一: 基础
DAGSchedulerDAGScheduler是Spark中比较重要的类,实现了面向DAG的高层次调度,DAGScheduler通过计算将DAG中的一系列RDD划分到不同的Stage,然后构建这些Stage之间的父子关系,最后将每个Stage按照Partition切分为多个Task,并以TaskSet的形式提交给底层的TaskScheduler。所有的组件都通过向DAGScheduler投递DAGSchedulerEvent来使用DAGScheduler。DAGScheduler内部的DAGSchedu
2020-11-19 19:02:29 483
原创 Spark Task执行流程源码分析系列之四: 任务启动&运行&结果处理
上面几节我们分析了Task的构建和调度,本节我们将聚焦在Task的执行,会涉及到Task是如何启动起来的,具体的不同任务是如何执行的,执行得到的结果是如何处理的。Task启动首先我们来看下Task是如何启动的,Driver发送lauchTask消息给Executor,Executor的常驻进程CoarseGrainedExecutorBackend接收到Driver发送来的LaunchTask消息后,会解码任务信息,然后由Executor开始执行任务,Executor会对Task进行封装为TaskR.
2020-11-16 16:22:38 987
原创 Spark Task执行流程源码分析系列之三: TaskSetManager分析
概述TaskSetManager是一个stage的任务集合的抽象,主要进行当前Stage任务集管理,跟踪每一个任务,进行失败重试,推测执行以及基于数据本地性的调度等,对外只提供两个接口,resourceOffer来判断是否在指定的executor上面执行任务,statusUpdate在任务成功或者失败时候,告知任务状态改变。本文将分析源码,解密它是如何进行调度任务执行,推测执行以及失败重试的。基本属性我们先来看下TaskSetManager的主要成员变量,主要是任务的管理相关的变量:taskSet
2020-11-16 15:42:39 1050
原创 Spark Task执行流程源码分析系列之二: 任务构建&调度&资源分配
上一节我们介绍了Task各个环节用到的主要数据结构,本节我们来看看Spark中一个Task是如何构建起来的,又是如何获取到资源,然后提交给集群相应的资源进行启动的。任务构建&提交Spark job内部是通过DAG来维护血缘关系的,通过shuffle算子进行stage的划分,上游stage计算完成后,下游stage才能进行,在一个stage中有多个任务需要执行,划分完stage后就会对同一个stage的任务集合进行提交,然后分配资源执行任务,我们先来看下任务提交入口,步骤如下:首先清空需要.
2020-11-15 17:21:49 763
原创 Spark Task执行流程源码分析系列之一: 基础
Spark的最重要的目的是进行Task的执行,涉及到调度,任务执行,资源分配等多个环节,涉及到多个模块,本文对Task从构建,提交,执行以及执行结果返回各个环节中用到的主要结构进行简单的描述,为后续源码分析做个铺垫。调度相关DAGSchedulerDAGScheduler是面向DAG的高层次调度,即将DAG中的各个RDD划分到不同的Stage。DAGScheduler可以通过计算将DAG中的一系列RDD划分到不同的Stage,然后构建这些Stage之间的父子关系,最后将每个Stage按照Parti.
2020-11-13 17:45:37 548
原创 Spark Shuffle源码分析系列之ShuffleReader 二
上一节我们分析了ShuffleReadTask是如何获取数据位置,得到各个块数据的,本节我们继续分析Spark对数据是如何存储、聚合、排序,然后供后续算子使用的。概述上一节我们讲到了ShuffleReduce任务获取数据的迭代器,那么获取来的数据存放到哪里?刚fetch来的FileSegment存放在缓冲区,经过解压缩和反序列化,如果shuffle算子规定了需要聚合操作,则要使用ExternalAppendOnlyMap进行数据聚合,优先在内存中使用SizeTrackerAppendOnlyMap进.
2020-11-07 13:02:27 658
原创 Spark Shuffle源码分析系列之ShuffleReader 一
Shuffle涉及到三方面问题:Shuffle write写过程,中间数据记录过程以及Shuffle read读过程,上面几节我们分析了write和中间记录过程,本文将聚焦在Shuffle read部分。ShffuleRead什么时候进行数据读取?ShuffleMap产生的数据如何拉取过来?拉取过来的数据如何存储和处理?本节我将通过源码分析来解答这些问题。问题ShuffleRDD是何时产生的?Shuffle-ReduceTask在什么时候开始执行,是等parent stage中的一个Shuffl.
2020-11-06 10:45:09 1265
原创 Spark Shuffle源码分析系列之SortShuffleWriter
上一节我们分析了BypassMergeSortShuffleWriter,它是Hash风格的ShuffleWriter,主要适用于不需要map-side聚合排序,并且分区数目小于spark.shuffle.sort.bypassMergeThreshold<默认200>;本节我们来介绍SortBased-ShuffleWriter,它可以处理map端的聚合排序操作,是默认的ShuffleWriter。ShuffleMapTask整体流程Spark中负责具体的Shuffle Map端执行任.
2020-11-04 13:39:29 675
原创 Spark Shuffle源码分析系列之BypassMergeSortShuffleWriter
BypassMergeSortShuffleWriter实现了Hash风格的Shuffle机制,和已经废弃的HashShuffleWriter类似。这个shuffle writer将传入的record写入单独的文件,每个reduce partition对应一个文件,然后拼接这些文件汇总成一个单独的输出文件。这个输出文件按照partitionId分成多个区域,并生成相应的索引文件,Reducer会根据索引问价中各个partitionId的偏移量来fetch对应的数据。BypassMergeSortShu.
2020-10-31 22:57:42 625
原创 Spark Shuffle源码分析系列之PartitionedPairBuffer&PartitionedAppendOnlyMap
概述SortShuffleWriter使用ExternalSorter进行ShuffleMapTask数据内存以及落盘操作,ExternalSorter中使用内存进行数据的缓存过程中根据是否需要map-side聚合以及是否需要排序来选择不同的内存存储方式,分别为PartitionedPairBuffer和PartitionedAppendOnlyMap。我们先看下两种数据结构的异同点:PartitionedAppendOnlyMap中数据存储在父类AppendOnlyMap的data数组中,Parti
2020-10-29 14:44:09 1207 4
原创 Spark Shuffle源码分析系列之AppendOnlyMap
AppendOnlyMap是spark自己实现的HashMap,与java自身的HashMap不同,它只能添加数据,不能remove,同时支持在内存中对任务执行结果进行聚合运算,本节我们来看下这个数据结构。整体结构AppendOnlyMap本质是一个HashMap,内部使用数组来存储数据,它的key-value是使用数组中相邻的两个元素进行存储的,如下图所示:我们来看下源码中相关存储以及容量的定义:val MAXIMUM_CAPACITY = (1 << 29)private v.
2020-10-28 13:42:19 981
原创 Spark Shuffle源码分析系列之Shuffle分析准备工作
Spark Shuffle源码分析系列之Shuffle介绍&演进过程介绍了Shuffle的演进过程,本文将介绍shuffle过程中使用到的基础类shuffleManager,ShuffleWriter ,ShuffleReader , ShuffleHandle, ShuffleBlockResolver的实现,为后续进行Map-Reduce实现分析打下基础。ShuffleManager概述ShuffleManager是Spark系统中可插拔的Shuffle系统接口,ShuffleManage
2020-10-26 20:42:32 522
原创 Spark存储管理源码分析系列之BlockManage块写入分析
上一节我们讲述了BlockManager是如何进行数据获取的,当需要的数据还没有计算时候,就需要先生成相应的Block数据,本节我们就来看下BlockManager是怎么把数据写入到Spark存储中的。写入入口BlockManager将读取和写入统一入口在getOrElseUpdate,会先从本地&远端获取数据,如果没有,就进行写入操作,写入成功,读取本地数据返回给使用方,如下所示:def getOrElseUpdate[T]( blockId: BlockId, level: Sto
2020-10-25 21:35:38 294
原创 Spark存储管理源码分析系列之BlockManage块读取分析
BlockManager会运行在Spark集群中的所有节点上,每个节点上的BlockManager通过MemoryManager、 MemoryStore、 DiskBlockManager、 DiskStore来管理其内存、磁盘中的块,并与其他节点进行块的交互。所以块的读和写入是其最主要的功能,接下来两节我们来分析下读取和写入的具体实现,本节我们先来聊聊读取块数据。块读取概述在BlockManager中提供了多种对块进行读写的方法,getOrElseUpdate将读写进行统一,块可以由RDD计算逻辑[
2020-10-24 22:33:46 622
原创 Spark存储管理源码分析系列之BlockManage初探
前面我们详细分析了Spark存储体系里面数据的表示,节点的通信,数据的存储过程,本节我们来看下存储体系里面的核心类BlockManager,BlockManager是spark自己的存储系统,RDD-Cache、 Shuffle-output、broadcast等的实现都是基于BlockManager来实现的,BlockManager也是分布式结构,在Driver和所有Executor上都会有blockmanager节点,每个节点上存储的block信息都会汇报给driver端的BlockManagerMa.
2020-10-23 20:00:03 451
原创 Spark存储管理源码分析系列之BlockManagerMessages消息处理
前面我们分析了Block的唯一标识,数据的抽象表示,BlockInfo的管理,Block的存储磁盘以及存入内存的各种功能,本节我们来看一下Driver和Executor是如何进行Block的消息通信和统一管理集群中的Block信息的。BlockManagerInfoDirver端会有一个HashMap来记录每个BlockManager上的元数据信息,元数据信息是用BlockManagerInfo来抽象表示的,它管理了该BlockManager管理的所有block的BlockStatus以及堆内,堆外.
2020-10-23 16:05:24 402
原创 Spark Shuffle源码分析系列之MapOutputTracker
MapOutputTracker是spark环境的主要组件之一,其功能有三方面,首先DAGScheduler使用MapOutputTrackerMaster来管理各个ShuffleMapTask的输出数据[MapStatus],另外根据各ShuffleMapTask结果的统计信息来进行尽可能的本地化Scheduler;其次ShuffleMapStage使用MapOutputTrackerMaster来判断是否要进行ShuffleMapTask的计算;最后ShuffleReduce任务用来获取从哪些exec.
2020-10-22 14:45:30 782
原创 spark存储管理源码分析系列之MemoryStore
内存池MemoryPool是对存储内存的具体管理,内存管理器MemoryManager是提供给外界进行管理内存的接口,而MemoryStore是用来将数据块保存到申请的storage内存中,并提供了从内存获取保存的数据的方法。在storage内存不足时,负责将内存中保存的数据刷新到磁盘上并释放占用的内存。MemoryStore在保存数据之前,会调用MemoryManager的相关acquire方法,判断StorageMemoryPool中是否有足够的内存可以分配,如果可用内存不足则直接返回false,由调.
2020-10-16 09:14:57 616
原创 spark存储管理源码分析系列之DiskStore
上一节我们分析了DiskManagerManager,它负责Block逻辑块的目录管理,本节将介绍DiskStore,它是真正负责磁盘存储的组件,用来保存block数据到磁盘中,负责数据写入,读取,删除操作,使用NIO ByteBuffer,MappedByteBuffer,FileChannel等黑科技加速文件写入读取,读取到的数据使用抽象的BlockData来表达,然后供使用方使用。BlockDataBlockData是一个松散的Scala特征,是DiskStore读取磁盘文件的数据组织形式,其.
2020-10-15 19:58:54 328
原创 spark存储管理源码分析系列之DiskBlockManager
前面我们了解了Spark存储的底层块数据Block的相关数据结构以及块管理器BlockInfoManager,本节我们来看下DiskBlockManager,它主要负责维护块数据在磁盘上存储位置的关系,负责数据目录规划,然后通过DiskStore进行数据写入,读取,删除操作。DiskBlockManagerDiskBlockManager负责维护块数据与其在磁盘上存储位置的关系,创建了二级目录来维护逻辑block和落地后的block文件的映射关系的,二级目录用于对文件进行散列存储,散列存储可以使所有.
2020-10-14 18:20:05 590
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人