过去十年,存储的速度从 50MB/s(HDD)提升到 16GB/s(NvMe);网络的速度从 1Gbps 提升到 100Gbps;但是 CPU 的主频从 2010 年的 3GHz 到现在基本不变,CPU 主频是目前数据分析的重要瓶颈。为了解决这个问题,越来越多的向量化执行引擎被开发出来。比如数砖的 Photon 、ClickHouse、Apache Doris、Intel 的 Gazelle 以及 Facebook 的 Velox(参见 《Velox 介绍:一个开源的统一执行引擎》)。本文主要关注点是如何在 Presto 上使用 Velox。
Velox 是一个统一的执行引擎,可以和很多的计算引擎进行整合。在 Facebook 内部,Velox 和 Presto(项目名称为 Prestissimo,已开源)、Spark(项目名称为 Spruce,未开源。不过可以使用 Intel 和 Kyligence 开源的 gluten)、流处理系统 XStream、消息系统 Scribe、数据摄取系统 FBETL 以及机器学习系统(数据预处理系统 TorchArrow 和特征工程 F3)等系统都有不同程度的整合。
如果想及时了解Spark、Hadoop或者HBase相关的文章,欢迎关注微信公众号:过往记忆大数据
因为 Velox 是使用 C++ 实现的,是一个通用的执行引擎,而 Presto 是使用 Java 实现的,节点之间的通信是有相关接口和协议的,直接调用 Velox 肯定是不行的。为了解决这个文件,Facebook 引入了一个名为 Prestissimo 的项目,它提供了 Presto 的 HTTP REST 接口的 C++ 实现,包括 worker- worker 交换序列化协议(exchange serialization protocol)、coordinator-worker 编排和状态报告 endpoints,从而为 Presto worker 提供了一个临时的 C++ 替代。Prestissimo 主要包括从 Java 实现的 coordinator 接收 Presto plan fragment ,将其转换为 Velox 查询计划,并将其交给 Velox 执行。整个架构大致如下所示:
Prestissimo 项目最初由 Facebook(Meta)于2020年创建,创建的时候是一个单独的项目进行维护的(https://github.com/facebookexternal/presto_cpp),直到今年4月份,Prestissimo 项目的代码已经合并到 Presto 项目里面的 presto-native-execution 模块里面,具体参见这个 MR(Move presto_cpp to presto)。Prestissimo 项目其实有些官方文档介绍如何在 Presto 通过 Prestissimo 来使用 Velox,但是我按照那个官方文档遇到一些问题,主要是编译代码的问题,试了很多次,终于于最近几天调通了相关的代码,所以这篇文章主要会介绍如果从零开始一步一步的在 Presto 中使用 Velox。
代码下载及编译
注意,本文是以 Apple M1 Pro Monterey 系统进行介绍的,其他平台及芯片可能和这里不一样。。
依次执行以下命令来下载 Presto 的相关代码:
git remote add upstream https://github.com/prestodb/presto.git
git fetch upstream
git checkout upstream/master
cd presto
./mvnw clean install -DskipTests -T 12
执行完上面操作之后,我们就下载了 Presto 的最新代码,并对 Presto 项目进行了编译。之后,我们执行下面命令来同步 Velox 的代码:
cd presto
➜ presto git:(master) make -C presto-native-execution submodules
git submodule sync --recursive
git submodule update --init --recursive
Submodule 'presto-native-execution/velox' (https://github.com/facebookincubator/velox.git) registered for path 'velox'
Cloning into '/Users/iteblog/data/code/apache/presto/presto-native-execution/velox'...
Submodule path 'velox': checked out '2c7eea574d3d7c3d3307528b08c67a77f4636f99'
Submodule 'third_party/googletest' (https://github.com/google/googletest.git) registered for path 'velox/third_party/googletest'
Submodule 'third_party/xsimd' (https://github.com/xtensor-stack/xsimd.git) registered for path 'velox/third_party/xsimd'
Cloning into '/Users/iteblog/data/code/apache/presto/presto-native-execution/velox/third_party/googletest'...
Cloning into '/Users/iteblog/data/code/apache/presto/presto-native-execution/velox/third_party/xsimd'...
Submodule path 'velox/third_party/googletest': checked out 'e2239ee6043f73722e7aa812a459f54a28552929'
Submodule path 'velox/third_party/xsimd': checked out '894493b3f77aa060c31d0bcb736a6ac76614bfec'
同步好 velox 代码后,我们初始化一下相关依赖环境:
cd presto-native-execution
sudo chown -R $(whoami) /usr/local/bin /usr/local/lib /usr/local/sbin; sudo chown -R $(whoami) /usr/local/bin /usr/local/lib /usr/local/bin; sudo chown -R $(whoami) /usr/local/bin /usr/local/lib /usr/local/lib; chmod u+w /