Catalyst揭秘 Day8 Final 外部数据源和缓存系统
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中,提供后续解析器处理。

简单来说,处理流程是:
- 目标是调用ResolvedDataSource生成Relation(比如JSONRelation)。
- 首先通过反射方式获得RelationProvider(比如json.DefaultDataSource)。
- 根据RelationProvider的类型(比如HadoopFsRelationProvider),准备参数,并生成Relation。
- 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 外部数据源和缓存系统的更多相关文章
- Spark Streaming揭秘 Day8 RDD生命周期研究
Spark Streaming揭秘 Day8 RDD生命周期研究 今天让我们进一步深入SparkStreaming中RDD的运行机制.从完整的生命周期角度来说,有三个问题是需要解决的: RDD到底是怎 ...
- OLEDB数据源和目标组件
在SSIS工程的开发过程中,OLEDB 数据源和目标组件是最常用的数据流组件.从功能上讲,OLEDB 数据源组件用于从OLEDB 提供者(Provider)中获取数据,传递给下游组件,OLEDB提供者 ...
- jQuery源码解读 - 数据缓存系统:jQuery.data
jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据 ...
- spring + redis 实现数据的缓存
1.实现目标 通过redis缓存数据.(目的不是加快查询的速度,而是减少数据库的负担) 2.所需jar包 注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要 ...
- Catalyst揭秘 Day7 SQL转为RDD的具体实现
Catalyst揭秘 Day7 SQL转为RDD的具体实现 从技术角度,越底层和硬件偶尔越高,可动弹的空间越小,而越高层,可动用的智慧是更多.Catalyst就是个高层的智慧. Catalyst已经逐 ...
- Catalyst揭秘 Day6 Physical plan解析
Catalyst揭秘 Day6 Physical plan解析 物理计划是Spark和Sparksql相对比而言的,因为SparkSql是在Spark core上的一个抽象,物理化就是变成RDD,是S ...
- Catalyst揭秘 Day5 optimizer解析
Catalyst揭秘 Day5 optimizer解析 Optimizer是目前为止中catalyst中最重要的部分.主要作用是把analyzed logicalPlan变成optimized Log ...
- Catalyst揭秘 Day4 analyzer解析
Catalyst揭秘 Day4 analyzer解析 今天继续解析catalyst,主要讲一下analyzer,在sql语句的处理流程中,analyzer是在sqlparse的基础上,把unresol ...
- Catalyst揭秘 Day3 sqlParser解析
Catalyst揭秘 Day3 sqlParser解析 今天我们会进入catalyst引擎的第一个模块sqlparser,它是catalyst的前置模块. 树形结构 从昨天的介绍我们可以看到sqlPa ...
随机推荐
- hive-通过Java API操作
通过Java API操作hive,算是测试hive第三种对外接口 测试hive 服务启动 package org.admln.hive; import java.sql.SQLException; i ...
- [django]自定义全局context
1. 创建一个context processor函数 新建一个文件命名为custom_processors.py,把它放到项目app文件夹(例如我的blog文件夹),添加一个返回字典的函数,其代码如下 ...
- SQL Server 在线进程分析处理
SQL Server 在线进程分析处理 前言 数据库在线进程处理在很多时候需要人为干预已达到预期管理目标,下面整理一下常用的在线进程管理方法,便于后续工作使用. 一.查看目标数据库在线进程,并杀死指定 ...
- Clover:让Windows下的资源管理器具有Chrome一样的标签页
这个小巧实用的插件第一次激发了我给人捐款的冲动. 不多说,上图看效果: 具有和Chrome一样的书签功能,以网页的形式保存本地位置,将常用目录放在书签上十分方便. 多标签相比多窗口的优势不需要我多说, ...
- angularjs页面传参
例如:路由配置如下: $stateProvider.state('admin.userList', { url: '/listUser?type&role', //参数必须先在 ...
- maya 2015配置openCollada插件
1.下载对应的openCollada插件内容 https://github.com/KhronosGroup/OpenCOLLADA/wiki/OpenCOLLADA-Tools 该页面目前提供Mac ...
- pc端有弹出层 并有滚动的时候遇到的问题以及解决
有时候页面会遇到这样一个问题,页面有个弹出层 ,弹出层是有动条的,当弹出层滚完的时候,后面的页面也会滚动,但是我们希望是后面的页面不滚动;代码如下 1:弹出层出现的时候设置 $('body').css ...
- asp中utf8不会出现乱码的写法
<%@ CODEPAGE=65001 %> <% Response.CodePage=65001%> <% Response.Charset="UTF-8&qu ...
- Android 线程Thread的2种实现方法
在讲解之前有以下三点要说明: 1.在Android中有两种实现线程Thread的方法: ①扩展java.long.Thread类: ②实现Runnable()接口: 2.Thread类是线程类,它有两 ...
- 【Android】日常开发android.jar文件中十五个重要的包概述
简述Android项目中android.jar文件里包含较为重要的15个系统编译后的class文件 android.app:提供高层的程序模型,提供基本的运行环境android.content:包含各 ...