Catalyst揭秘 Day8 Final

外部数据源和缓存系统

今天是Catalyst部分的收官,主要讲一些杂项内容。

外部数据源处理

什么叫外部数据源,是SparkSql自己支持的一些文件格式,以及一些自己自定义格式的文件开发。

让我们从文件的读取api开始,可以看到最终会创建一个DataFrame,当中比较关键的是relation方法。

首先,会以反射方式获取provider。

我们以json文件为例,其provider为json.DefaultSource。可以看到继承自HadoopFsRelationProvider。

进入其处理,可以看到,首先是获取文件路径,其后是调用了createRelation方法。

让我们进入json.DefaultSource的createRelation,创建了JSONRelation。

JSONRelation继承自HadoopFsRelation,来自interfaces.scala,定义了对各类文件的处理接口。

最终JSONRelation组合入LogicalRelation中,提供后续解析器处理。

简单来说,处理流程是:

  1. 目标是调用ResolvedDataSource生成Relation(比如JSONRelation)。
  2. 首先通过反射方式获得RelationProvider(比如json.DefaultDataSource)。
  3. 根据RelationProvider的类型(比如HadoopFsRelationProvider),准备参数,并生成Relation。
  4. Relation中除了文件具体信息外,还会继承一个intereface(比如HadoopFsRelation),根据文件类型,封装对文件的具体操作。

在optimizer中,对于文件的操作,在执行过程中还支持过滤下推,根据算子生成下推条件。

filters中定义了一系列算子,可以在服务器上直接过滤数据,而不是集中到客户端过滤。

缓存

我们看下缓存,很多算法都是缓存+并行来做的,是一个开发者逃不掉的魔咒,在Catalyst中直接cacheTable就可以缓存。

缓存在内存中,是以什么方式存储的?肯定是列式存储的方式,因为列式存储检索数据特别快,不是RDD一行一行object存放的方式,缓存的时候,对象会进入jvm的老年代,很容易产生full GC,进行交互查询容易悲剧。基于列的话,就可以采用类似byteBuffer这样的方式,由于是同样的数据类型,可以进行压缩,内存占用会极大的减少。查询的时候,只使用部分列也是一个自然的思路。

让我们看一下代码:首先进入cacheTable方法。

最重要的是对InMemoryRelation的生成。

InMemoryRelation继承自LogicalPlan,其方法都是一些简单的基于字节的编程

内部做cache的时候,根据构建的树,会采用mapPartitions的方式。

具体在partition里面,会迭代数据生成新的iterator,是ByteBuffer构成的array,对于每个列都会变成array的一部分,在遍历没一行数据的时候,都会变成列,每一列数据都会存入byteBuffer,

最后还是会调用rdd的persist。

这个看起来有点像高性能的内存数据库,在进行表的查询时,把内存数据结构的分区进行具体的扫描操作,根据查询表达式建立索引,通过扫描器accessor获得具体的数据。

其他

Catalyst支持让我们自己采用udf、udaf的方式去扩展功能,catalyst在分析的时候,会支持这方面的功能,由functionRegistry来进行管理。

可以看到FunctionRegistry中主要是一些管理类方法。

到此,Catalyst中比较重要的功能都已解析完毕。

欲知后事如何,且听下回分解!

DT大数据每天晚上20:00YY频道现场授课频道68917580

Catalyst揭秘 Day8 Final 外部数据源和缓存系统的更多相关文章

  1. Spark Streaming揭秘 Day8 RDD生命周期研究

    Spark Streaming揭秘 Day8 RDD生命周期研究 今天让我们进一步深入SparkStreaming中RDD的运行机制.从完整的生命周期角度来说,有三个问题是需要解决的: RDD到底是怎 ...

  2. OLEDB数据源和目标组件

    在SSIS工程的开发过程中,OLEDB 数据源和目标组件是最常用的数据流组件.从功能上讲,OLEDB 数据源组件用于从OLEDB 提供者(Provider)中获取数据,传递给下游组件,OLEDB提供者 ...

  3. jQuery源码解读 - 数据缓存系统:jQuery.data

    jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据 ...

  4. spring + redis 实现数据的缓存

    1.实现目标 通过redis缓存数据.(目的不是加快查询的速度,而是减少数据库的负担) 2.所需jar包 注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要 ...

  5. Catalyst揭秘 Day7 SQL转为RDD的具体实现

    Catalyst揭秘 Day7 SQL转为RDD的具体实现 从技术角度,越底层和硬件偶尔越高,可动弹的空间越小,而越高层,可动用的智慧是更多.Catalyst就是个高层的智慧. Catalyst已经逐 ...

  6. Catalyst揭秘 Day6 Physical plan解析

    Catalyst揭秘 Day6 Physical plan解析 物理计划是Spark和Sparksql相对比而言的,因为SparkSql是在Spark core上的一个抽象,物理化就是变成RDD,是S ...

  7. Catalyst揭秘 Day5 optimizer解析

    Catalyst揭秘 Day5 optimizer解析 Optimizer是目前为止中catalyst中最重要的部分.主要作用是把analyzed logicalPlan变成optimized Log ...

  8. Catalyst揭秘 Day4 analyzer解析

    Catalyst揭秘 Day4 analyzer解析 今天继续解析catalyst,主要讲一下analyzer,在sql语句的处理流程中,analyzer是在sqlparse的基础上,把unresol ...

  9. Catalyst揭秘 Day3 sqlParser解析

    Catalyst揭秘 Day3 sqlParser解析 今天我们会进入catalyst引擎的第一个模块sqlparser,它是catalyst的前置模块. 树形结构 从昨天的介绍我们可以看到sqlPa ...

随机推荐

  1. 关于删除linux多余内核

    step 1: 查找当前正在使用的内核文件的版本号 #uname -r step 2: 列出所有的内核文件,使用rpm 或者 dpkg(基于linux系统) 命令  #rpm -q kernel 或者 ...

  2. ASP.NET MVC 4 让数据库自动迁移

    今天实际测试了下这个方法,可以保持数据库与实体类同步,同时不会出现数据库迁移的提示.但是只能更改实体类来改变数据库,而不能改数据库来改变实体类.所以这才是Code frist,如果通过改数据库表来改动 ...

  3. [转]关于IIS7.5下的web.config 404 配置的一些问题

    本文转自:http://www.codesky.net/article/201103/161589.html 本文介绍一个关于IIS环境下web.config配置的经验问题.在IIS7.5中添加配置4 ...

  4. ‘初始化锁相环INIT_PLL()’

    在XS128的SCI学习的过程中,INIT_PLL()显得很重要,初始化锁相环几乎在每个程序中都有,今天看的程序-初始化锁相环的相关代码如下: /*************************** ...

  5. Commons CLI - Option Properties

    Option Properties The following are the properties that each Option has. All of these can be set usi ...

  6. HDOJ2025查找最大元素

    查找最大元素 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  7. NDIS IM 驱动那些事情

    最近不知道为什么开始学习windows NDIS驱动开发,用的是寒江独钓的例子,其实他的改的代码也就一点点,说的有用的东西也就那么多,不过还是感谢他出了这么一本书,不然这真的就没有一本稍微好一点的书籍 ...

  8. Swift结构体与类

    在面向过程的编程语言(如C语言)中,结构体用得比较多,但是面向对象之后,如在C++和Objective-C中,结构体已经很少使用了.这是因为结构体能够做的事情,类完全可以取而代之.而Swift语言却非 ...

  9. 获取bundle目录下的所有图片文件名

    今天在写代码时候,偶然发现自己忘记了一些oc的基础知识(这里指的是获取bundle目录下的所有图片),感到很不爽.在百度了几次,发现自己的领悟能力实在不行,感觉萌萌的::>_<:: 好了, ...

  10. 使用Ctex总结1

    使用Ctex应该是每一个做学术研究的人要学会掌握的. 它的基本结构: \documentclass[11pt,two side,a4paper]{cctart}%使用cctart可以让摘要变成中文,比 ...