Skip to main content

An in-memory immutable data manager

Project description

libvineyard

vineyard:: an in-memory immutable data manager

Build and Test Coverage Docs

Vineyard is an in-memory immutable data manager that provides out-of-box high-level abstraction and zero-copy in-memory sharing for distributed data in big data tasks, such as numerical computing, machine learning, and graph analytics.

Vineyard is designed to enable zero-copy data sharing between big data systems. Let’s begin with a typical machine learning task of time series prediction with LSTM. We can see that the task is divided into steps of works: First, we read the data from the file system as a pandas.DataFrame. Then, we apply some preprocessing jobs, such as eliminating null values to the dataframe. After that, we define the model, and train the model on the processed dataframe in PyTorch. Finally, the performance of the model is evaluated.

On a single machine, although pandas and PyTorch are two different systems targeting different tasks, data can be shared between them efficiently with little extra-cost, with everything happening end-to-end in a single python script.

Comparing the workflow with and without vineyard

What if the input data is too big to be processed on a single machine? As illustrated on the left side of the figure, a common practice is to store the data as tables on a distributed file system (e.g., HDFS), and replace pandas with ETL processes using SQL over a big data system such as Hive and Spark. To share the data with PyTorch, the intermediate results are typically saved back as tables on HDFS. This can bring some headaches to developers.

  1. For the same task, users are forced to program for multiple systems (SQL & Python).

  2. Data could be polymorphic. Non-relational data, such as tensors, dataframes and graphs/networks are becoming increasingly prevalent. Tables and SQL may not be best way to store/exchange or process them. Having the data transformed from/to “tables” back and forth between different systems could be a huge overhead.

  3. Saving/loading the data to/from the external storage requires lots of memory-copies and IO costs.

Vineyard is designed to solve these issues by providing:

  1. In-memory distributed data sharing in a zero-copy fashion to avoid introducing extra I/O costs by exploiting a shared memory manager derived from plasma.

  2. Built-in out-of-box high-level abstraction to share the distributed data with complex structures (e.g., distributed graphs) with nearly zero extra development cost, while the transformation costs are eliminated.

As shown in the right side of the above figure, we illustrate how to integrate vineyard to solve the task in the big data context.

First, we use Mars (a tensor-based unified framework for large-scale data computation which scales Numpy, Pandas and Scikit-learn) to preprocess the raw data just like the single machine solution do, and save the preprocessed dataframe into vineyard.

single

data_csv = pd.read_csv('./data.csv', usecols=[1])

distributed

import mars.dataframe as md
dataset = md.read_csv('hdfs://server/data_full', usecols=[1])
# after preprocessing, save the dataset to vineyard
vineyard_distributed_tensor_id = dataset.to_vineyard()

Then, we modify the training phase to get the preprocessed data from vineyard. Here vineyard makes the sharing of distributed data between Mars and PyTorch just like a local variable in the single machine solution.

single

data_X, data_Y = create_dataset(dataset)

distributed

client = vineyard.connect(vineyard_ipc_socket)
dataset = client.get(vineyard_distributed_tensor_id).local_partition()
data_X, data_Y = create_dataset(dataset)

Finally, we run the training phase distributedly across the cluster.

From the example, we see that with vineyard, the task in the big data context can be handled with only minor modifications to the single machine solution. Compare with the existing approaches, the I/O and transformation overheads are also eliminated.

Features

In-Memory immutable data sharing

Vineyard is an in-memory immutable data manager, sharing immutable data across different systems via shared memory without extra overheads. Vineyard eliminates the overhead of serialization/deserialization and IO during exchanging immutable data between systems.

Out-of-box high level data abstraction

Computation frameworks usually have their own data abstractions for high-level concepts, for example tensor could be torch.tensor, tf.Tensor, mxnet.ndarray etc., not to mention that every graph processing engine has its own graph structure representations.

The variety of data abstractions makes the sharing hard. Vineyard provides out-of-box high-level data abstractions over in-memory blobs, by describing objects using hierarchical metadatas. Various computation systems can utilize the built-in high level data abstractions to exchange data with other systems in computation pipeline in a concise manner.

Stream pipelining

A computation doens’t need to wait all precedent’s result arrive before starting to work. Vineyard provides stream as a special kind of immmutable data for such pipeling scenarios. The precedent job can write the immutable data chunk by chunk to vineyard, while maintaining the data structure semantic, and the successor job reads shared-memory chunks from vineyard’s stream without extra copy cost, then triggers it’s own work. The overlapping helps for reducing the overall processing time and memory consumption.

Drivers

Many big data analytical tasks have lots of boilerplate routines for tasks that unrelated to the computation itself, e.g., various IO adaptors, data partition strategies and migration jobs. As the data structure abstraction usually differs between systems such routines cannot be easily reused.

Vineyard provides such common manipulate routines on immutable data as drivers. Besides sharing the high level data abstractions, vineyard extends the capabily of data structures by drivers, enabling out-of-box reusable runtines for the boilerplate part in computation jobs.

Install vineyard

Vineyard is distributed as a python package and can be easily installed with pip:

pip3 install vineyard

The latest version of online documentation can be found at https://v6d.io.

If you want to build vineyard from source, please refer to Installation.

License

libvineyard is distributed under Apache License 2.0. Please note that third-party libraries may not have the same license as libvineyard.

Acknowledgements

  • apache-arrow, a cross-language development platform for in-memory analytics;

  • boost-leaf, a C++ lightweight error augmentation framework;

  • dlmalloc, Doug Lea’s memory allocator;

  • etcd-cpp-apiv3, a C++ API for etcd’s v3 client API;

  • flat_hash_map, an efficient hashmap implementation;

  • pybind11, a library for seamless operability between C++11 and Python;

  • uri, a library for URI parsing.

Getting involved

  • Read contribution guide.

  • Please report bugs by submitting a GitHub issue.

  • Submit contributions using pull requests.

Thank you in advance for your contributions to vineyard!

Project details


Release history Release notifications | RSS feed

This version

0.1.3

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

vineyard-0.1.3-cp39-cp39-manylinux2010_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

vineyard-0.1.3-cp39-cp39-macosx_10_9_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

vineyard-0.1.3-cp38-cp38-manylinux2010_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

vineyard-0.1.3-cp38-cp38-macosx_10_9_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

vineyard-0.1.3-cp37-cp37m-manylinux2010_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

vineyard-0.1.3-cp37-cp37m-macosx_10_9_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

vineyard-0.1.3-cp36-cp36m-manylinux2010_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64

vineyard-0.1.3-cp36-cp36m-macosx_10_9_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

vineyard-0.1.3-cp35-cp35m-manylinux2010_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.5mmanylinux: glibc 2.12+ x86-64

vineyard-0.1.3-cp35-cp35m-macosx_10_6_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.5mmacOS 10.6+ x86-64

vineyard-0.1.3-1-cp39-cp39-macosx_10_9_x86_64.whl (627.3 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

vineyard-0.1.3-1-cp38-cp38-macosx_10_9_x86_64.whl (627.3 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

vineyard-0.1.3-1-cp37-cp37m-macosx_10_9_x86_64.whl (622.2 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

vineyard-0.1.3-1-cp36-cp36m-macosx_10_9_x86_64.whl (622.1 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

vineyard-0.1.3-1-cp35-cp35m-macosx_10_9_x86_64.whl (622.1 kB view details)

Uploaded CPython 3.5mmacOS 10.9+ x86-64

File details

Details for the file vineyard-0.1.3-cp39-cp39-manylinux2010_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-cp39-cp39-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.9, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.23.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.2

File hashes

Hashes for vineyard-0.1.3-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 d0d28b7225f95b96e23f9166e1190b03a49a43a646ff2da11b75e0f6759da89e
MD5 30d0eb674b1706819f799004b9a37613
BLAKE2b-256 31c33fc5e985cab8d7164bf11d6a07b20f3ee5d4444e84716c420ac63d56e6d4

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.23.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.2

File hashes

Hashes for vineyard-0.1.3-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a3ecec32517bf81875a0abbc084a25a7fe34389ca873b28f825ef6548fe8414f
MD5 a17b0cbe347a3ef5a11609fcfc3ea0ba
BLAKE2b-256 8087b43653b453b6e37a1eb6d282125f5d2745417da2b0ee7ec1617f36dfa4ac

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-cp38-cp38-manylinux2010_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.23.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.2

File hashes

Hashes for vineyard-0.1.3-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 60d78acb837593396b0a0cb035314ba2d6a385e0253a75cf2f36849f70d3f9bf
MD5 7f428862b01a10c7d06ec7b5a3af5dd0
BLAKE2b-256 2cc3f97abc48714d603ab3790e54b62f7e774c7827b2de820375dec1ffcb3ccb

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.23.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.2

File hashes

Hashes for vineyard-0.1.3-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 340a06158f1211a6a8579fdc83c30c8b218efa89f4599f526c2f8befef30bfa3
MD5 73f8c65f61e9857f49fd1d90b158a782
BLAKE2b-256 4b1afca909ff22aba184ef42c3ba04a4f71ae275364c1eb360086f4e8e3d8789

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-cp37-cp37m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.23.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.2

File hashes

Hashes for vineyard-0.1.3-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 d46d96fe0cf3a48f953c8d8827ca9a0f1873bdf72bbab10b7b0ca08539077715
MD5 db1017c34f2276b7b6e1bcc81157c1cd
BLAKE2b-256 8dcbbbd134f7fb8920d1a51ba66ef198cb2f42af9694b21150de218ec4e12ee8

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.23.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.2

File hashes

Hashes for vineyard-0.1.3-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 941b977c277efe0fdd20654324e5b8debc4efc47430de31611f88e8d0a14d3ee
MD5 dab9b93d153d59d7a51598ecaa3e3fa9
BLAKE2b-256 57709cbf5cf104bc04843fb101430da4e18858584dea8dcc5b16d4f7e6e03e69

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-cp36-cp36m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-cp36-cp36m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.6m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.23.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.2

File hashes

Hashes for vineyard-0.1.3-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 a5f9e8baea2e9dba57257fec4f78bf341b38917fadfcc24000f3bb5c645674fe
MD5 8347929c6b7afe69e1dbf21fe6830c36
BLAKE2b-256 09afc1103f43403488cea5041002babeb2cdc4d40815eb3b8dcf1df77efde88a

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-cp36-cp36m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: CPython 3.6m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.23.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.2

File hashes

Hashes for vineyard-0.1.3-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 352c258a818455dbcaac1d39065b97a392c796d5507b3d55b5ea9bbc947b0513
MD5 ecee3bae614f7c6c99098d59a2f86f4c
BLAKE2b-256 d74f24b12f065fda24751bd5fab90e0bc0ea0a2996f41d0023b2b11ea38bc9c4

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-cp35-cp35m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-cp35-cp35m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.5m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.23.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.2

File hashes

Hashes for vineyard-0.1.3-cp35-cp35m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 48413abd5cff34a25744febb106f3f3e02e94ceda1065d72459b79e404aab082
MD5 5f5db3e36e5965995c485b461bde74e5
BLAKE2b-256 c6e2d2e3027d3271b312f7808c1c3475ab4e086220d4c7273decc21edc4c21fd

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-cp35-cp35m-macosx_10_6_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-cp35-cp35m-macosx_10_6_x86_64.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: CPython 3.5m, macOS 10.6+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.23.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.2

File hashes

Hashes for vineyard-0.1.3-cp35-cp35m-macosx_10_6_x86_64.whl
Algorithm Hash digest
SHA256 6116352e009404ce3fab3f0e4f6d40a1cfb123ccd07f7185d7816aeb09ee697e
MD5 eed1f3f35442e2b53a7657f48e74d910
BLAKE2b-256 096f41cc77b348569888723a8b3a5595886f0ff8f85886196c59489a1316e704

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-1-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-1-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 627.3 kB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.6

File hashes

Hashes for vineyard-0.1.3-1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c8a99c388f95747337824ba79c79924913032f844e3dd740c77967eb9850cf31
MD5 871dd3452f423f8aa6e567889611c5e1
BLAKE2b-256 b6be4a6a1d0f119620eb04350d53891b152daae3142cc75c9424fc09ee6c36c5

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-1-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-1-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 627.3 kB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.6

File hashes

Hashes for vineyard-0.1.3-1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 07c9e866b890b10f021b69e237d45444de177e8c288506b41b48a992a5f03db2
MD5 5f9b9688309f80fc0b17cb335c215e42
BLAKE2b-256 6bbed66cf14e8147938a8f9164aa2985e09021708a464f82a92f00cc5a6c1463

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-1-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-1-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 622.2 kB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.6

File hashes

Hashes for vineyard-0.1.3-1-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c2d7a123a8ff189f14931fdec03af748be88f7db3ed53d08ea55cf170106ef62
MD5 91b10b0dc1dae37105dcba754b9ac693
BLAKE2b-256 157b8d40c21043c8034c9b30db1ffa399cade6da690d6fe5f27df0b43f1883bd

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-1-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-1-cp36-cp36m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 622.1 kB
  • Tags: CPython 3.6m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.6

File hashes

Hashes for vineyard-0.1.3-1-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 89f5d0f31ea2acb488b9da4898d68170adfc3ae391c405cd7b83c451c1ef7f6d
MD5 cb7b14ef0c75f4f612d74d2c86160675
BLAKE2b-256 2b8600c454d42eb19cbe145e18f77193feee4e0a07ee7f62df1a77c23f5cbd49

See more details on using hashes here.

File details

Details for the file vineyard-0.1.3-1-cp35-cp35m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: vineyard-0.1.3-1-cp35-cp35m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 622.1 kB
  • Tags: CPython 3.5m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.8.6

File hashes

Hashes for vineyard-0.1.3-1-cp35-cp35m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3f0acdabcc97f3ed2eac2cef734afdabb9a5b69c445d40fcf6e5bcf287b1c783
MD5 909cb6e0d08698bd259334f381063f9d
BLAKE2b-256 59bdf0eb2fff39cb6b722f573cba8e08337b0378a889690d006890295c305a7f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page