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本文主要是通过斐波那契来引入问题,开始逐步分析递归的解法缺点,使用缓存和尾递归进行优化,最后将尾递归展开为循环迭代逻辑,通过这个思路来加深对递归的理解。
Read More概述随着 Hadoop 生态的快速发展,海量数据的处理的方法已经非常成熟并且丰富了,但是这些处理方法一般都是批处理方式,也就是输入的数据是确定的,例如1小时的日志,在日志已经准备好之后再开始计算。当今产品业务的快速发展,在很多场景(反作弊等)下对数据处理的时效性提出了新的要求,要求更高的时效性。于是,流式计算就逐...
Read More正文转眼已经工作了6年多了,一直从事大数据相关的工作,对整个大数据发展的趋势有个人比较浅显的理解。本文主要从Google的几篇论文来简单看一下这些年大数据的发展历程,梳理一下技术发展的脉络。Google是最早提出大数据概念,并且横空出世了三驾马车(MapReduce、GFS、BigTable),MapReduce...
Read More概述数学是笔者的短板,最近一直在积极恶补数学,重新学习了微积分中的泰勒展开式,对其有了一点简单的理解,所以记录在这里。简单介绍泰勒展开式是一个在函数某点对函数进行近似的方法,在几何图形上来理解就是泰勒展开式的曲线与原函数的曲线的拟合。展开式的项是无穷多的,随着项的增加拟合的程度就越好。看下面的图是 e^x 与其4...
Read More概述Python 中的 list 和 dict 是非常常用的数据结构,但是因为我们大多数人的第一门语言都是 C++ 或 Java,在使用 Python 的过程中,会套用之前语言的思维,而不是 Pythonic 的方式。本文提供一些使用建议,希望可以帮助大家写出更 pythonic 的代码。list 遍历list ...
Read More本文是笔者重写了旧博客中的python使用set来去重碰到TypeError: unhashable type,并增加了一些更为深入的内容。
Read More本文是笔者重写了旧博客中的Python的问题解决: IOError: [Errno 32] Broken pipe,并增加了一些更为深入的内容。
Read More前言在 Scala 中有一个强大的语言特性 implicit,提供了非常特殊并且强大的隐式转换功能。说它特殊,主要是因为在笔者目前接触到的语言中,也没有发现类似的语法,对于笔者来说这个特性非常的神秘。功能强大是因为这个特性确实好用,笔者在实际项目中进行了简单的尝试,发现对简化代码非常有帮助,可以替代默认参数,并且...
Read More随着下一代大数据计算框架 Spark 的流行,Scala 也受到了越来越多的关注。在 Scala 开发中,免不了需要编写单元测试,这样可以提升开发效率,方便地进行回归测试。在实际业务开发中,业务需求变更会引入大量的逻辑,通过单元测试可以很好地保障现有代码的逻辑依然符合预期,前提是单元测试的 case 覆盖较为全面。
Read More引子本文记录了一次笔者对 Spark SQL 使用中碰到的问题的分析,使用的 Spark 版本为 2.1。本文描述的是一个已经在新版本(2.2及以后)中修复的问题,记录了整个问题的代码分析过程,希望可以对碰到类似的问题的朋友一点启发。在分析过程中,也窥视了 Spark 的一些内部实现。基本结论:由于 UTF8St...
Read More背景计算机科班出身大多学过离散数学,或者理工类专业也大多学习过 C 或 C++ 语言,从中我们了解到基本类型的整形有 short、int、long 等,还分别有无符号(unsigned)和带符号(signed)的,但是不是所有语言都支持无符号。Java 就是这样一门语言。但是,在工程实践中,我们难免会有一些场合会...
Read More简介Apache Spark 目前越来越流行,在实际开发使用过程中,会需要使用到一些 C/C++ 的类库,需要使用 JNI 来调用,本文通过一个简单的例子来对 Spark 使用 JNI 进行讲解。本文的测试环境是 Linux,其他环境类似,但是不保证 C++ 等代码可以在其他系统下编译使用,Spark 版本使用的...
Read More日志是程序调试的利器,通过日志来解析获取数据,线上问题通过日志分析和定位等,用途多种多样。Python 作为当前常用的一门开发语言,国内很多开发者对其的使用极其粗糙,写法较为随意,受开发者本身熟悉的语言有关,会参入较多其他语言的写法。
Read More简介在服务器端配置 ss,用于下载和安装 docker 等。shadowsocks安装使用了 python shadowsocks最简单方便的方法就是安装 epel 源和 python-pip 包sudo yum -y install epel-releasesudo yum -y install python-...
Read More简介本文主要介绍 Spark Application 和 Spark SQL 中比较常用的一些配置,一来方便个人检索和补充,二来希望可以帮到别人。本文不求全,只求介绍部分个人使用过程中学习到的经验和方法,本文主要以 Spark 2.1 为例,Spark 目前发展还很快,本文中的一些方法可能很快就不适用了。额外说明...
Read MoreHadoop 的设计原则中有一条,移动计算比移动数据容易,移动计算只需要将代码发送到某台机器即可,而数据移动需要耗费带宽,拷贝耗时较大,行程慢节点,会极大地拖慢整体的计算。
Read More上一篇中讲解了 Python 的基本类型,本篇继续讲解 Python 的数据类型,本篇主要讲解集合类型:tuple、list、set和dict。
Read MoreLife is short!Python 作为一门强大易用的语言,内置了多种数据类型,有基本类型:int、long、float、string等,有集合类型:tuple、list、set、dict等,除此之外标准库还自带了多种数据结构:OrderedDict、deque、heapq、bisect等。数据类型的知识点...
Read More引子本文针对 Python 2.7。Python 中的一切都是对象,包括类也是对象。大家有没有好奇,那类的类是什么呢?下面我们通过代码来去探索。a = 1a.__class__ # inttype(a) # intclass A(object): passA.__class__ # typeA.__c...
Read Morekotlin 是 JetBrains 公司推出的一个语言,基于 JVM,100% 与 Java 兼容,主要面向 Android 开发,新版可以编译为 JavaScript,可以运行在 Node.js 或浏览器中。相对于 Java 语言,加入了很多语法糖和特性,使得很多场景下的代码得到极大的简化,比 Java 简洁很多。
Read More问题描述在维护旧系统时,碰到了一段使用 URLClassLoader 加载 url 的 jar,然后执行某个类的静态方法。远端更新了对应 url 的 jar,发现执行结果不符合预期,排查了很久未发现问题。最后,猜测是 URLClassLoader 并未重新加载 url 上的 jar,导致执行的还是旧的逻辑。下面就...
Read MorePython 语言非常强大,但是也有一些疑惑的地方,非常容易困扰新手,甚至老手。所以,对一些常见易错的地方进行总结学习非常有必要。本文大部分从参考资料中收集,也有从笔者自身实践中发现的问题,希望可以在大家碰到类似问题的时候可以从容对待。
Read More安装Maven 是一个 Java 的工程管理工具,只依赖 Java JDK 1.5 版本以上即可,依赖环境变量 JAVA_HOME。Maven 的安装路径一般也会设置一个环境变量 M2_HOME,直接下载官方编译好的 Binary Archive,解压后配置即可。# init java & maven e...
Read More背景传统的 RDBMS 大多使用的行存储方式,现如今随着大数据技术的发展,对于存储的要求越来越高,列存储相对有自己明显的优势:列数据相对来说比较类似,压缩比更高;一般的查询只涉及几列,列存储的查询性能也更高;可以方便地新增列等。在某些场景下,选择列存储是非常不错的选择,从节省存储的角度来说就非常吸引人了。目前,比...
Read More简介我们先来看看这个概念:技术债务是由 Ward Cunningham 首次提出的,是一个术语,指的是开发团队在设计或架构选型时从短期效应的角度选择了一个易于实现的方案,但从长远来看,这种方案会带来更消极的影响,亦即开发团队所欠的债务。这个债务和金融债务非常类似,如果这个项目一直持续下去,这种债务会不断地产生,如...
Read More简介MongoDB Shard Cluster 是 MongoDB 的集群解决方案,将数据进行了拆分,分布在多个 shard 节点上。Shard key 是决定数据分布的关键配置,一旦创建后是无法修改的,修改方式只能重新建表并灌库,所以选择 shard key 需要提前规划好。Shard key 分为两种:默认是...
Read MorePython 内置了一个线程池的实现,隐藏在 multiprocessing.dummy 这个包中。
Read MoreWindows 下简陋的记事本非常难用,对于程序员来说一些特殊格式会导致一些奇怪的问题。目前大多数人都会使用记事本的替代品,我个人比较喜欢 Notepad++,一款非常好用的记事本。
Read MoreVagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,是程序员的虚拟机,有助于中开发环境模拟真实环境,使用相同的系统和干净的环境。
Read More本文主要是介绍 Python 中的 yield 关键字的用法,yield 的基本用法是用来产生生成器(generator),yield 最大的特点在于上下文切换。下面通过一些简单的例子来解释这两种用法。
Read More简介Python 的修饰器(Decorator)是一种非常便捷的修改函数的方式,不影响原函数的定义而对函数进行一些额外的封装,有点类似 AOP(Aspect Oriented Programming),增加一些小功能却不侵入原有代码,非常简洁强大。在实际使用中,常见的使用场景有日志、异常处理、计时和权限等,在很多...
Read More前言Python 是一门简单强大的编程语言,非常灵活,可以极大地提升程序员的编程效率。但是,Python 本身的灵活带来了运行效率低,内存占用相对较大的问题,这限制了 Python 在某些场景下的应用。Python 的官方实现 CPython 本身提供了一个扩展机制,可以方便地编写扩展来提升效率,本文将通过一个示...
Read MorePython 有个非常好用的包管理工具——pip,在国内的网络环境下,使用官方的 pypi速度有点慢,而且不稳定,可以考虑使用豆瓣的 pypi,这是在可以连接外网的情况下我们可以选择比较容易的使用 pip。
Read More简介Python 是一门常用的脚本语言,做一些日常小功能的开发和文本处理之类的事情非常方便,大多数人不以 Python 为主语言,所以导致大家并不是十分重视 Python,在日常的 Python 代码编写中,书写受主语言(可能是 C/C++、Java 等语言)的影响,导致经常会写出一些反 Pythonic 的代码...
Read More最近在多看上看你了一本正则表达式的书《学习正则表达式》(英文:Introducing Regular Expressions), 让自己对正则表达式的特性有所了解,中文翻译主要是术语名词比较少见,本文会将术语都采用中英文。
Read MorePython使用的垃圾回收方式是引用计数(reference counting)和垃圾回收器(garbage collector), 在2.0版本之前只有引用计数,2.0版本之后带有garbage collector,并且默认开启,可以通过gc模块来进行控制。
Read More概述使用 Python 进行数据分析是非常方便的,笔者在工作中需要对数据进行分析时发现了一套 Pandas + Plotly + Dash 的数据可视化方案,非常简洁实用。Pandas 是一个非常方便的数据分析工具,可以使用 plotly 将 Pandas 的数据进行可视化,Dash 可以直接使用 Python ...
Read More概述Python 中的 list 和 dict 是非常常用的数据结构,但是因为我们大多数人的第一门语言都是 C++ 或 Java,在使用 Python 的过程中,会套用之前语言的思维,而不是 Pythonic 的方式。本文提供一些使用建议,希望可以帮助大家写出更 pythonic 的代码。list 遍历list ...
Read More本文是笔者重写了旧博客中的python使用set来去重碰到TypeError: unhashable type,并增加了一些更为深入的内容。
Read More本文是笔者重写了旧博客中的Python的问题解决: IOError: [Errno 32] Broken pipe,并增加了一些更为深入的内容。
Read More日志是程序调试的利器,通过日志来解析获取数据,线上问题通过日志分析和定位等,用途多种多样。Python 作为当前常用的一门开发语言,国内很多开发者对其的使用极其粗糙,写法较为随意,受开发者本身熟悉的语言有关,会参入较多其他语言的写法。
Read More上一篇中讲解了 Python 的基本类型,本篇继续讲解 Python 的数据类型,本篇主要讲解集合类型:tuple、list、set和dict。
Read MoreLife is short!Python 作为一门强大易用的语言,内置了多种数据类型,有基本类型:int、long、float、string等,有集合类型:tuple、list、set、dict等,除此之外标准库还自带了多种数据结构:OrderedDict、deque、heapq、bisect等。数据类型的知识点...
Read More引子本文针对 Python 2.7。Python 中的一切都是对象,包括类也是对象。大家有没有好奇,那类的类是什么呢?下面我们通过代码来去探索。a = 1a.__class__ # inttype(a) # intclass A(object): passA.__class__ # typeA.__c...
Read MorePython 语言非常强大,但是也有一些疑惑的地方,非常容易困扰新手,甚至老手。所以,对一些常见易错的地方进行总结学习非常有必要。本文大部分从参考资料中收集,也有从笔者自身实践中发现的问题,希望可以在大家碰到类似问题的时候可以从容对待。
Read More简介MongoDB Shard Cluster 是 MongoDB 的集群解决方案,将数据进行了拆分,分布在多个 shard 节点上。Shard key 是决定数据分布的关键配置,一旦创建后是无法修改的,修改方式只能重新建表并灌库,所以选择 shard key 需要提前规划好。Shard key 分为两种:默认是...
Read MorePython 内置了一个线程池的实现,隐藏在 multiprocessing.dummy 这个包中。
Read More本文主要是介绍 Python 中的 yield 关键字的用法,yield 的基本用法是用来产生生成器(generator),yield 最大的特点在于上下文切换。下面通过一些简单的例子来解释这两种用法。
Read More简介Python 的修饰器(Decorator)是一种非常便捷的修改函数的方式,不影响原函数的定义而对函数进行一些额外的封装,有点类似 AOP(Aspect Oriented Programming),增加一些小功能却不侵入原有代码,非常简洁强大。在实际使用中,常见的使用场景有日志、异常处理、计时和权限等,在很多...
Read More前言Python 是一门简单强大的编程语言,非常灵活,可以极大地提升程序员的编程效率。但是,Python 本身的灵活带来了运行效率低,内存占用相对较大的问题,这限制了 Python 在某些场景下的应用。Python 的官方实现 CPython 本身提供了一个扩展机制,可以方便地编写扩展来提升效率,本文将通过一个示...
Read MorePython 有个非常好用的包管理工具——pip,在国内的网络环境下,使用官方的 pypi速度有点慢,而且不稳定,可以考虑使用豆瓣的 pypi,这是在可以连接外网的情况下我们可以选择比较容易的使用 pip。
Read More简介Python 是一门常用的脚本语言,做一些日常小功能的开发和文本处理之类的事情非常方便,大多数人不以 Python 为主语言,所以导致大家并不是十分重视 Python,在日常的 Python 代码编写中,书写受主语言(可能是 C/C++、Java 等语言)的影响,导致经常会写出一些反 Pythonic 的代码...
Read More最近在多看上看你了一本正则表达式的书《学习正则表达式》(英文:Introducing Regular Expressions), 让自己对正则表达式的特性有所了解,中文翻译主要是术语名词比较少见,本文会将术语都采用中英文。
Read MorePython使用的垃圾回收方式是引用计数(reference counting)和垃圾回收器(garbage collector), 在2.0版本之前只有引用计数,2.0版本之后带有garbage collector,并且默认开启,可以通过gc模块来进行控制。
Read More概述LRU 是 Least Recently Used 的缩写,意思是最近最少使用,是一种常见的缓存淘汰策略,其他策略还有 FIFO、LFU 等。缓存的访问速度比较快,但是其是一种有限的资源,所以需要进行缓存的淘汰,一般情况下缓存会使用内存,计算机的内存一般来说都有比较有限的资源。下面通过一个示意图来解释 LRU...
Read More概述Wikipedia 对于Flood fill算法的定义是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法。因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名。最简单的实现思路就是深度优先搜索的递归方法,从一个点根据规则去扩散到各个可以到达的地方。这个思路对于我们日常解决...
Read More二叉树的前序(preorder)、中序(inorder)、后续(postorder)遍历是非常经典的遍历方式,其中中序遍历较为常用,因为二分查找树按照中序遍历获得的就是有序的数组。
Read More本文主要是通过斐波那契来引入问题,开始逐步分析递归的解法缺点,使用缓存和尾递归进行优化,最后将尾递归展开为循环迭代逻辑,通过这个思路来加深对递归的理解。
Read MoreHadoop 的设计原则中有一条,移动计算比移动数据容易,移动计算只需要将代码发送到某台机器即可,而数据移动需要耗费带宽,拷贝耗时较大,行程慢节点,会极大地拖慢整体的计算。
Read MoreVagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,是程序员的虚拟机,有助于中开发环境模拟真实环境,使用相同的系统和干净的环境。
Read MoreWindows 下简陋的记事本非常难用,对于程序员来说一些特殊格式会导致一些奇怪的问题。目前大多数人都会使用记事本的替代品,我个人比较喜欢 Notepad++,一款非常好用的记事本。
Read More简介我们先来看看这个概念:技术债务是由 Ward Cunningham 首次提出的,是一个术语,指的是开发团队在设计或架构选型时从短期效应的角度选择了一个易于实现的方案,但从长远来看,这种方案会带来更消极的影响,亦即开发团队所欠的债务。这个债务和金融债务非常类似,如果这个项目一直持续下去,这种债务会不断地产生,如...
Read More背景传统的 RDBMS 大多使用的行存储方式,现如今随着大数据技术的发展,对于存储的要求越来越高,列存储相对有自己明显的优势:列数据相对来说比较类似,压缩比更高;一般的查询只涉及几列,列存储的查询性能也更高;可以方便地新增列等。在某些场景下,选择列存储是非常不错的选择,从节省存储的角度来说就非常吸引人了。目前,比...
Read More背景计算机科班出身大多学过离散数学,或者理工类专业也大多学习过 C 或 C++ 语言,从中我们了解到基本类型的整形有 short、int、long 等,还分别有无符号(unsigned)和带符号(signed)的,但是不是所有语言都支持无符号。Java 就是这样一门语言。但是,在工程实践中,我们难免会有一些场合会...
Read More问题描述在维护旧系统时,碰到了一段使用 URLClassLoader 加载 url 的 jar,然后执行某个类的静态方法。远端更新了对应 url 的 jar,发现执行结果不符合预期,排查了很久未发现问题。最后,猜测是 URLClassLoader 并未重新加载 url 上的 jar,导致执行的还是旧的逻辑。下面就...
Read More安装Maven 是一个 Java 的工程管理工具,只依赖 Java JDK 1.5 版本以上即可,依赖环境变量 JAVA_HOME。Maven 的安装路径一般也会设置一个环境变量 M2_HOME,直接下载官方编译好的 Binary Archive,解压后配置即可。# init java & maven e...
Read Morekotlin 是 JetBrains 公司推出的一个语言,基于 JVM,100% 与 Java 兼容,主要面向 Android 开发,新版可以编译为 JavaScript,可以运行在 Node.js 或浏览器中。相对于 Java 语言,加入了很多语法糖和特性,使得很多场景下的代码得到极大的简化,比 Java 简洁很多。
Read More引子本文记录了一次笔者对 Spark SQL 使用中碰到的问题的分析,使用的 Spark 版本为 2.1。本文描述的是一个已经在新版本(2.2及以后)中修复的问题,记录了整个问题的代码分析过程,希望可以对碰到类似的问题的朋友一点启发。在分析过程中,也窥视了 Spark 的一些内部实现。基本结论:由于 UTF8St...
Read More简介Apache Spark 目前越来越流行,在实际开发使用过程中,会需要使用到一些 C/C++ 的类库,需要使用 JNI 来调用,本文通过一个简单的例子来对 Spark 使用 JNI 进行讲解。本文的测试环境是 Linux,其他环境类似,但是不保证 C++ 等代码可以在其他系统下编译使用,Spark 版本使用的...
Read More简介本文主要介绍 Spark Application 和 Spark SQL 中比较常用的一些配置,一来方便个人检索和补充,二来希望可以帮到别人。本文不求全,只求介绍部分个人使用过程中学习到的经验和方法,本文主要以 Spark 2.1 为例,Spark 目前发展还很快,本文中的一些方法可能很快就不适用了。额外说明...
Read More简介在服务器端配置 ss,用于下载和安装 docker 等。shadowsocks安装使用了 python shadowsocks最简单方便的方法就是安装 epel 源和 python-pip 包sudo yum -y install epel-releasesudo yum -y install python-...
Read More前言在 Scala 中有一个强大的语言特性 implicit,提供了非常特殊并且强大的隐式转换功能。说它特殊,主要是因为在笔者目前接触到的语言中,也没有发现类似的语法,对于笔者来说这个特性非常的神秘。功能强大是因为这个特性确实好用,笔者在实际项目中进行了简单的尝试,发现对简化代码非常有帮助,可以替代默认参数,并且...
Read More随着下一代大数据计算框架 Spark 的流行,Scala 也受到了越来越多的关注。在 Scala 开发中,免不了需要编写单元测试,这样可以提升开发效率,方便地进行回归测试。在实际业务开发中,业务需求变更会引入大量的逻辑,通过单元测试可以很好地保障现有代码的逻辑依然符合预期,前提是单元测试的 case 覆盖较为全面。
Read More概述数学是笔者的短板,最近一直在积极恶补数学,重新学习了微积分中的泰勒展开式,对其有了一点简单的理解,所以记录在这里。简单介绍泰勒展开式是一个在函数某点对函数进行近似的方法,在几何图形上来理解就是泰勒展开式的曲线与原函数的曲线的拟合。展开式的项是无穷多的,随着项的增加拟合的程度就越好。看下面的图是 e^x 与其4...
Read More概述随着 Hadoop 生态的快速发展,海量数据的处理的方法已经非常成熟并且丰富了,但是这些处理方法一般都是批处理方式,也就是输入的数据是确定的,例如1小时的日志,在日志已经准备好之后再开始计算。当今产品业务的快速发展,在很多场景(反作弊等)下对数据处理的时效性提出了新的要求,要求更高的时效性。于是,流式计算就逐...
Read More正文转眼已经工作了6年多了,一直从事大数据相关的工作,对整个大数据发展的趋势有个人比较浅显的理解。本文主要从Google的几篇论文来简单看一下这些年大数据的发展历程,梳理一下技术发展的脉络。Google是最早提出大数据概念,并且横空出世了三驾马车(MapReduce、GFS、BigTable),MapReduce...
Read More概述Facebook Presto 是一款高效通用计算引擎,用于大数据分析查询。其发展历史可以追溯到 Facebook 内部的大数据处理需求。它最初是为了解决广告、新闻feed和统计数据分析等场景的查询问题而开发的。随着社交网络和移动互联网的发展,Presto 逐渐成为 Facebook 内部数据处理的主要引擎之...
Read More简介Presto 是一款由 Facebook 开发的通用计算引擎。它由 Coordinator 和 Worker 两部分组成。Worker 是执行 task 的节点,而 task 会在执行过程中被拆分为 pipeline,并在 Driver 中执行。Driver 默认的执行逻辑是采用时间片轮转的方式,即每当时间片...
Read MoreApache Arrow 是一个内存的列式存储格式,其生态已经非常丰富,包含了计算引擎(gandiva、arrow compute layer等,计算向量化)、IPC 格式、网络传输 flight等。
Read More概述在开发过程中,Singleton 是一个非常常用的模式,例如,系统配置、内存管理等全局唯一的实例都需要使用单例。在 C++ 11 之前,实现一个线程安全的单例需要一些特别的 trick。本文介绍 C++ 11 之后的实现方式,非常的简单。实现实现的关键点: 构造函数设置为 private 拷贝和移动的构造...
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概述Java 中的内置集合类型有很多是非线程安全的,本文主要是介绍 TreeSet 在多线程并发写入后可能会导致 iterator 读取死循环的问题。本文主要是介绍复现问题的方法,做一个简单的记录。出现死循环的原因是因为 TreeSet 底层是 TreeMap 实现的,数据结构是红黑树,红黑树在并发写入后,可能会...
Read More概述Shuffle 是大数据处理中非常重要的一个操作,其作用是将数据按照新的分区方式进行重新分布,从而满足计算上对分区的要求,保证最终结果的正确性。一般来说,聚合(aggregation)、join 等都需要 Shuffle 操作。Shuffle 整体上可以分为 Shuffle 写和 Shuffle 读两个阶段。...
Read More概述LZ4 是一种常用的压缩算法,主要特点是压缩和解压的速度比较快,CPU 消耗低,移动设备上会用其作内存压缩的算法。LZ4 算法的基本思想很简单,就是将数据中发现的重复项进行编码,达到压缩的目的。本文仅仅介绍其算法的逻辑,不涉及具体的实现。算法简介对数据的重复项进行编码,编码的方式是 (offset, leng...
Read MoreGlog 是 Google 的的一个 C++ 轻量日志库,源自于 Google,支持常用的日志功能:日志级别,VLOG,条件输出,DEBUG 日志等,同时支持 Gflags 的参数配置方式。
Read More概述C++的std::tuple是在C++11中引入的,作为对C++标准库的增强。在此之前,C++标准库中的std::pair已经无法满足日益复杂的数据处理需求。因此,为了增强C++的数据处理能力,std::tuple被引入到了C++标准库中。在C++17中,又引入了变长模板和if constexpr等技术,使得...
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 MoreCXL 是什么?CXL 全称是 Compute Express Link,是一种在PCIe物理层上构建缓存一致性系统。CXL的概念最初由英特尔在2019年提出,旨在解决数据中心内存扩展和性能瓶颈问题。CXL旨在通过提供一种新的高速互连技术,使CPU、GPU、FPGA等处理器能够更高效地共享内存资源。CXL 当前有...
Read More概述当前大数据组件是基于JVM开发的,例如Spark、Hadoop、Alluxio、Presto等。对于Spark这类单次执行一个Job后资源就释放的情况来说,JVM full gc 的影响只是单个Job,很多时候可以忽略。但是对于Presto这种长期运行的Worker来说,JVM full gc造成的影响会影响...
Read More