Glog 是 Google 的的一个 C++ 轻量日志库,源自于 Google,支持常用的日志功能:日志级别,VLOG,条件输出,DEBUG 日志等,同时支持 Gflags 的参数配置方式。
Read More概述当前大数据组件是基于JVM开发的,例如Spark、Hadoop、Alluxio、Presto等。对于Spark这类单次执行一个Job后资源就释放的情况来说,JVM full gc 的影响只是单个Job,很多时候可以忽略。但是对于Presto这种长期运行的Worker来说,JVM full gc造成的影响会影响...
Read MoreCXL 是什么?CXL 全称是 Compute Express Link,是一种在PCIe物理层上构建缓存一致性系统。CXL的概念最初由英特尔在2019年提出,旨在解决数据中心内存扩展和性能瓶颈问题。CXL旨在通过提供一种新的高速互连技术,使CPU、GPU、FPGA等处理器能够更高效地共享内存资源。CXL 当前有...
Read More概述Facebook Presto 是一款高效通用计算引擎,用于大数据分析查询。其发展历史可以追溯到 Facebook 内部的大数据处理需求。它最初是为了解决广告、新闻feed和统计数据分析等场景的查询问题而开发的。随着社交网络和移动互联网的发展,Presto 逐渐成为 Facebook 内部数据处理的主要引擎之...
Read More概述C++的std::tuple是在C++11中引入的,作为对C++标准库的增强。在此之前,C++标准库中的std::pair已经无法满足日益复杂的数据处理需求。因此,为了增强C++的数据处理能力,std::tuple被引入到了C++标准库中。在C++17中,又引入了变长模板和if constexpr等技术,使得...
Read More概述LRU 是 Least Recently Used 的缩写,意思是最近最少使用,是一种常见的缓存淘汰策略,其他策略还有 FIFO、LFU 等。缓存的访问速度比较快,但是其是一种有限的资源,所以需要进行缓存的淘汰,一般情况下缓存会使用内存,计算机的内存一般来说都有比较有限的资源。下面通过一个示意图来解释 LRU...
Read More概述Wikipedia 对于Flood fill算法的定义是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法。因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名。最简单的实现思路就是深度优先搜索的递归方法,从一个点根据规则去扩散到各个可以到达的地方。这个思路对于我们日常解决...
Read More概述string_view 是一个从 C++ 17 开始引入的新特性,是一个字符串的视图,轻量级的字符串,不可变的,不持有的内存,只持有内存的指针。支持的方法与 string 非常类似,合理使用 string_view 可以获得不错的性能提升,并且编译器也可以有更多优化的机会。基本用法string 是可变的(mu...
Read More概述2022 年,Meta 发布了一篇论文《Velox: Meta’s Unified Execution Engine》,介绍了一个新的计算引擎 Velox,其愿景是做一个通用的单机计算引擎,可以用来在 Meta 中的各种需要计算的组件中使用。目前开源社区中已经有一些在使用 Velox 引擎了。Meta 的 P...
Read More概述LZ4 是一种常用的压缩算法,主要特点是压缩和解压的速度比较快,CPU 消耗低,移动设备上会用其作内存压缩的算法。LZ4 算法的基本思想很简单,就是将数据中发现的重复项进行编码,达到压缩的目的。本文仅仅介绍其算法的逻辑,不涉及具体的实现。算法简介对数据的重复项进行编码,编码的方式是 (offset, leng...
Read More概述使用 Python 进行数据分析是非常方便的,笔者在工作中需要对数据进行分析时发现了一套 Pandas + Plotly + Dash 的数据可视化方案,非常简洁实用。Pandas 是一个非常方便的数据分析工具,可以使用 plotly 将 Pandas 的数据进行可视化,Dash 可以直接使用 Python ...
Read More概述Shuffle 是大数据处理中非常重要的一个操作,其作用是将数据按照新的分区方式进行重新分布,从而满足计算上对分区的要求,保证最终结果的正确性。一般来说,聚合(aggregation)、join 等都需要 Shuffle 操作。Shuffle 整体上可以分为 Shuffle 写和 Shuffle 读两个阶段。...
Read More概述Java 中的内置集合类型有很多是非线程安全的,本文主要是介绍 TreeSet 在多线程并发写入后可能会导致 iterator 读取死循环的问题。本文主要是介绍复现问题的方法,做一个简单的记录。出现死循环的原因是因为 TreeSet 底层是 TreeMap 实现的,数据结构是红黑树,红黑树在并发写入后,可能会...
Read More概述2022年,Databricks 发布了 Photon —— 兼容 Spark 的 Native 引擎,并且还发布一篇 paper。photon 在英文中是光子的意思,所以显而易见的 Photon 的特点就是追求更快的速度。其实早在 2020 年,Databricks 的 Reynold Xin 就在 Spa...
Read More概述随着硬件技术的发展,当前计算引擎的瓶颈已经从之前的IO(网络、存储等)重新变为了CPU,也就是计算的优化重新成为了当前发展的主流方向。其中,向量化计算引擎是近几年非常火热的发展方向,比较受人关注的是 Databricks 为 Spark 开发了基于 JNI 的 native engine – Photon,使...
Read More概述在开发过程中,Singleton 是一个非常常用的模式,例如,系统配置、内存管理等全局唯一的实例都需要使用单例。在 C++ 11 之前,实现一个线程安全的单例需要一些特别的 trick。本文介绍 C++ 11 之后的实现方式,非常的简单。实现实现的关键点: 构造函数设置为 private 拷贝和移动的构造...
Read MoreApache Arrow 是一个内存的列式存储格式,其生态已经非常丰富,包含了计算引擎(gandiva、arrow compute layer等,计算向量化)、IPC 格式、网络传输 flight等。
Read More简介Presto 是一款由 Facebook 开发的通用计算引擎。它由 Coordinator 和 Worker 两部分组成。Worker 是执行 task 的节点,而 task 会在执行过程中被拆分为 pipeline,并在 Driver 中执行。Driver 默认的执行逻辑是采用时间片轮转的方式,即每当时间片...
Read More二叉树的前序(preorder)、中序(inorder)、后续(postorder)遍历是非常经典的遍历方式,其中中序遍历较为常用,因为二分查找树按照中序遍历获得的就是有序的数组。
Read More