The core of Pixels is a columnar storage engine designed for data lakes and warehouses. It is optimized for analytical tables stored in on-premises and cloud-native storage systems, including S3, GCS, HDFS, Redis, and local file systems. Pixels outperforms Parquet, which is the most widely used columnar format in today's lakehouses, by up to two orders of magnitude.
We have integrated Pixels with popular query engines including DuckDB (1.1.0), Trino (405 and 466), Presto (0.279), and Hive (2.3+).
The DuckDB integration and the C++ implementation of Pixels Reader are in the cpp folder. The other integrations are opensourced in separate repositories:
Pixels also has its own query engine Pixels-Turbo.
It prioritizes processing queries in an autoscaling MPP cluster (currently based on Trino) and exploits serverless functions
(e.g, AWS Lambda or vHive / Knative)
to accelerate the processing of workload spikes. With Pixels-Turbo
, we can achieve better performance and cost-efficiency
for continuous workloads while not compromising elasticity for workload spikes.
Based on Pixels-Turbo, we implement Pixels-Rover, a web-based query interface that provides users with a complete experience of serverless query processing, natural-language-to-SQL translation, and flexible service levels in query urgency. It allows users to select whether to execute the query immediately, within a grace period, or eventually. Pixels-Turbo can apply different resource scheduling and query execution policies for Different levels of query urgency, which will result in different monetary costs on resources.
Pixels is mainly implemented in Java (with some JNI hooks of system calls and C/C++ libs), while there is a C++ implementation of the Pixels Reader. The C++ document gives the instructions of using the C++ reader. Here we explain how to build and use the Java components.
JDK 8 (or above) and Maven 3.8 (or above) are required to build Pixels.
Earlier Maven versions may work but are not tested.
After installing these prerequisites, clone the Pixels codebase into any SRC_BASE
directory:
git clone https://github.com/pixelsdb/pixels.git
Enter SRC_BASE/pixels
, use mvn install
to build and install it to the local Maven repository.
It may take a couple of minutes to complete. After that, find jar files:
pixels-daemon-*-full.jar
inpixels-daemon/target
,this is the jar to run Pixels daemons.pixels-cli-*-full.jar
inpixels-cli/target
, this is the jar of Pixels command line tool.
They will be used in the installation of Pixels.
Pixels is compatible with different query engines, such as Trino, Presto, and Hive.
The query engine integrations also can be built using maven.
For example, to build the Trino integration for Pixels, just git clone pixels-trino,
and build it using mvn package
in the local git repository.
Pixels by itself is compatible with Java 8+ and Maven 3.8+. However, third-party query engines such as Trino may require a later JDK (e.g., Trino 405/466 requires JDK17.0.3+/23.0.0+) and Maven. It is fine to build the query engine integration (e.g.,
pixels-trino
) with the same or higher versions of JDK and Maven than Pixels.
If you want to develop Pixels in Intellij, open SRC_BASE/pixels
as a maven project.
When the project is fully indexed and the dependencies are successfully downloaded,
you can build Pixels using the maven plugin (as an alternative of mvn package
), run and debug unit tests, and debug Pixels by
setting up a Remote JVM Debug.
In some versions of IntelliJ, the default idea.max.intellisense.filesize
in IntelliJ may be not large enough for the source files generated by ProtoBuf.
Hence, the large generated source file will be considered as plain text file in the user interface.
To solve this problem, set this property to at least 3600
(i.e., 3.6MB) in Help
-> Edit Custom Properties...
and restart Intellij.
To run or debug the unit tests or the main classes of Pixels in Intellij, set the
PIXELS_HOME
environment variable forJunit
orApplication
inRun
->Edit Configurations
->Edit Configuration Templetes
. Ensure that thePIXELS_HOME
directory exists and follow the instructions in Install Pixels to put thepixels.properties
intoPIXELS_HOME
and create thelogs
directory where the log files will be written into.
You can follow the Installation instructions to deploy Pixels in a cluster, and learn how to use Pixels and evaluate its performance following TPC-H Evaluation or ClickBench Evaluation.
We welcome contributions to Pixels and its subprojects. If you are interested in contributing to Pixels, please read our Git Workflow.
Pixels is an academic system aims at providing production-grade quality. It supports all the functionalities required by TPC-H and is compatible with the mainstream data analytic ecosystems. The key ideas and insights in Pixels are elaborated in the following publications.
arXiv'24
Serverless Query Processing with Flexible Performance SLAs and Prices
Haoqiong Bian, Dongyang Geng, Yunpeng Chai, Anastasia Ailamaki
arXiv'24
PixelsDB: Serverless and Natural-Language-Aided Data Analytics with Flexible Service Levels and Prices
Haoqiong Bian, Dongyang Geng, Haoyang Li, Anastasia Ailamaki
SIGMOD'23
Using Cloud Functions as Accelerator for Elastic Data Analytics
Haoqiong Bian, Tiannan Sha, Anastasia Ailamaki
EDBT'22
Columnar Storage Optimization and Caching for Data Lakes (short)
Guodong Jin, Haoqiong Bian, Yueguo Chen, Xiaoyong Du
ICDE'22
Pixels: An Efficient Column Store for Cloud Data Lakes
Haoqiong Bian, Anastasia Ailamaki
CIDR'20
Pixels: Multiversion Wide Table Store for Data Lakes (abstract)
Haoqiong Bian
ICDE'18
Rainbow: Adaptive Layout Optimization for Wide Tables (demo)
Haoqiong Bian, Youxian Tao, Guodong Jin, Yueguo Chen, Xiongpai Qin, Xiaoyong Du
SIGMOD'17
Wide Table Layout Optimization by Column Ordering and Duplication
Haoqiong Bian, Ying Yan, Wenbo Tao, Liang Jeff Chen, Yueguo Chen, Xiaoyong Du, Thomas Moscibroda