热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ApacheArrow源码分析(一)——简介和框架

@原创文章,转载请注明:转载自镜中影的技术博客本文链接地址:ApacheArrow源码分析(一)——简介和框架URL:http:blog.csdn.netlinkpark190

@原创文章,转载请注明: 转载自 镜中影的技术博客
本文链接地址: Apache Arrow源码分析(一)——简介和框架
URL:http://blog.csdn.net/linkpark1904/article/details/50980464

背景

列存储在数据库领域中早已被提出,列存储数据结构在分析型事务上表现优异,大数据分析引擎,诸如Spark-SQL,Impala 均采用列存储作为其中间数据表示形式,那么Apache Arrow就是这样一种内存列式数据结构。

在众多分布式系统中,每个系统都有自己内部的内存格式,70-80%的CPU浪费在序列化和反序列化过程,类似功能在多个项目中实现,没有一个标准。那么Arrow就是为解决这一问题而提出了。Arrow基于列存储的数据组织方式,能够很好的适应CPU的Cache,以及现代CPU SIMD (Single input multiple data) 技术,并且提供良好的序列化和反序列化性能。更值得一提的是,Arrow提供良好的扩展性,既有C++版的实现,又有java版的实现,是一个很值得学习的数据结构库。

基本思想

Arrow 基本思想就是把向量在内存中的布局给紧凑话,说白了,就是把之前按行表示的数据按列进行组织。
这里写图片描述

举一个很简单的例子,对于一个字符串向量{“a”, “bb”, “”, “”, “ccc”},通常在c++中我们采用vector进行存储vector strings = {"a", "bb", "", "", "ccc"};, 采用这种存储方式,其内存布局大致如下图所示:
vector<string>内存布局

由于STL容器string中存储字符串的空间在堆上分配,那么每一个string对象会单独在堆上申请内存空间,存储字符串,这就可能导致在内存中,vector 存储空间并非连续的。这样的存储会带来两个问题,其一在于,不能很好的适应CPU cache,其二在于序列化和反序列化代价较大。

那么Apache Arrow将vector进行变形,转换成如下的存储方式:
Arrow存储

引入一个Offset向量,以及连续内存空间的buffer,对外提供和vector类似的接口。其中,对于string 的访问接口实现如下所示:

  const uint8_t* GetValue(int64_t i, int64_t* out_length) const {                                                                
int32_t pos = offsets_[i];
*out_length = offsets_[i + 1] - pos;
return raw_bytes_ + pos;
}

std::string GetString(int64_t i) const {
const uint8_t* str = GetValue(i, &nchars);
return std::string(reinterpret_cast<const char*>(str), nchars);
}

引入偏移量向量来对连续的buffer空间进行索引,从而对外提供和vector类似的取值接口。

框架和类图

Apache Arrow类的设计采用建造者模式,封装了基础类array,buffer,以及arraybuilder,具体类图如下图所示:

这里写图片描述

参考资料:

https://github.com/apache/arrow
http://www.uml.org.cn/itnews/2016030208.asp


推荐阅读
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 流数据流和IO流的使用及应用
    本文介绍了流数据流和IO流的基本概念和用法,包括输入流、输出流、字节流、字符流、缓冲区等。同时还介绍了异常处理和常用的流类,如FileReader、FileWriter、FileInputStream、FileOutputStream、OutputStreamWriter、InputStreamReader、BufferedReader、BufferedWriter等。此外,还介绍了系统流和标准流的使用。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了一个误删Oracle数据文件导致数据库无法打开的问题,并提供了解决方式。解决方式包括切换到mount状态、离线删除报错的数据文件等。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 本文介绍了在PostgreSQL中批量导入数据时的优化方法。包括使用unlogged表、删除重建索引、删除重建外键、禁用触发器、使用COPY方法、批量插入等。同时还提到了一些参数优化的注意事项,如设置effective_cache_size、shared_buffer等,并强调了在导入大量数据后使用analyze命令重新收集统计信息的重要性。 ... [详细]
author-avatar
silaker
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有