试用MotherDuck: DuckDB 的ServerLess版(或者叫NoServer版)云服务

Sat Dec 30, 2023

1800 Words|Read in about 9 Min
Tags:

背景

更多用法请参考motherduck手册
- https://motherduck.com/docs/intro

《期望未来DuckDB的架构演变方向》 里说到了serverless的演进方向, 想不到已经有了motherduck这样的产品.

准备

1、使用最强学习镜像
-《2023-PostgreSQL Docker镜像学习环境 ARM64版, 已集成热门插件和工具》
-《2023-PostgreSQL Docker镜像学习环境 AMD64版, 已集成热门插件和工具》

2、你需要1个github账号

3、进入容器

docker exec -ti pg bash    
    
su - postgres    

试用motherduck

1、启动duckdb 0.9.2 及以上版本

./duckdb     
v0.9.2 3c695d7ba9    
Enter ".help" for usage hints.    
Connected to a transient in-memory database.    
Use ".open FILENAME" to reopen on a persistent database.    

2、打开motherduck

D .open md:    
1. Please open this link to login into your account: https://auth.motherduck.com/activate    
2. Enter the following code: xxxx-xxxx    

3、下载sdk并激活motherduck
- 在电脑中使用chrome浏览器打开 : https://auth.motherduck.com/activate
- 输入 : xxxx-xxxx
- 根据提示注册motherduck账号, 我这里关联到1个github账号.

成功. 你以后可以在启动duckdb前执行export motherduck_token=...., 避免每次.open md:都要做一次认证.

Token successfully retrieved ✅    
You can store it as an environment variable to avoid having to log in again:    
  $ export motherduck_token='xx.....xxx'    

4、列出的是在motherduckl里面的数据库

D show databases;    
┌───────────────┐    
│ database_name │    
│    varchar    │    
├───────────────┤    
│ my_db         │    
│ sample_data   │    
└───────────────┘    

5、查询存储在motherduck服务里的数据

D SELECT    
>    passenger_count,    
>    avg(total_amount)    
> -- reading from shared sample database    
> FROM sample_data.nyc.taxi    
> GROUP BY passenger_count    
> ORDER by passenger_count;    
┌─────────────────┬────────────────────┐    
│ passenger_count │ avg(total_amount)  │    
│     double      │       double       │    
├─────────────────┼────────────────────┤    
│             0.0 │ 20.271222848458628 │    
│             1.0 │ 21.225624974276688 │    
│             2.0 │  24.09675238862258 │    
│             3.0 │  23.21117216536006 │    
│             4.0 │ 24.267935907713383 │    
│             5.0 │  21.02734475294877 │    
│             6.0 │ 21.519300095288067 │    
│             7.0 │  76.26999999999998 │    
│             8.0 │  61.56470588235294 │    
│             9.0 │  75.68666666666667 │    
│                 │  29.30373481034481 │    
├─────────────────┴────────────────────┤    
│ 11 rows                    2 columns │    
└──────────────────────────────────────┘    

6、查询存储在s3里的数据

D SET s3_region='us-east-1';    
D .timer on    
D SELECT    
>    passenger_count,    
>    avg(total_amount)    
> -- reading from AWS S3 parquet files    
> FROM read_parquet('s3://us-prd-motherduck-open-datasets/nyc_taxi/parquet/yellow_cab_nyc_2022_11.parquet')    
> GROUP BY passenger_count    
> ORDER by passenger_count;    
┌─────────────────┬────────────────────┐    
│ passenger_count │ avg(total_amount)  │    
│     double      │       double       │    
├─────────────────┼────────────────────┤    
│             0.0 │ 20.271222848458628 │    
│             1.0 │ 21.225624974276013 │    
│             2.0 │ 24.096752388622424 │    
│             3.0 │  23.21117216536007 │    
│             4.0 │ 24.267935907713316 │    
│             5.0 │  21.02734475294876 │    
│             6.0 │ 21.519300095288088 │    
│             7.0 │  76.27000000000001 │    
│             8.0 │  61.56470588235294 │    
│             9.0 │  75.68666666666667 │    
│                 │  29.30373481034313 │    
├─────────────────┴────────────────────┤    
│ 11 rows                    2 columns │    
└──────────────────────────────────────┘    
Run Time (s): real 1.709 user 1.025378 sys 0.000000    
    
D select count(*) FROM read_parquet('s3://us-prd-motherduck-open-datasets/nyc_taxi/parquet/yellow_cab_nyc_2022_11.parquet');    
┌──────────────┐    
│ count_star() │    
│    int64     │    
├──────────────┤    
│      3252717 │    
└──────────────┘    
Run Time (s): real 1.361 user 0.726456 sys 0.000000    

7、从explain 结果来看像是使用的motherduck的算力而非本地算力:

D explain SELECT    
>    passenger_count,    
>    avg(total_amount)    
> FROM sample_data.nyc.taxi    
> GROUP BY passenger_count    
> ORDER by passenger_count;    
    
┌─────────────────────────────┐    
│┌───────────────────────────┐│    
││       Physical Plan       ││    
│└───────────────────────────┘│    
└─────────────────────────────┘    
┌───────────────────────────┐    
│    DOWNLOAD_SOURCE (L)    │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│        bridge_id: 1       │    
└─────────────┬─────────────┘                                 
┌─────────────┴─────────────┐    
│  BATCH_DOWNLOAD_SINK (R)  │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│        bridge_id: 1       │    
└─────────────┬─────────────┘                                 
┌─────────────┴─────────────┐    
│        ORDER_BY (R)       │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│          ORDERS:          │    
│  taxi.passenger_count ASC │    
└─────────────┬─────────────┘                                 
┌─────────────┴─────────────┐    
│     HASH_GROUP_BY (R)     │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│             #0            │    
│          avg(#1)          │    
└─────────────┬─────────────┘                                 
┌─────────────┴─────────────┐    
│       PROJECTION (R)      │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│      passenger_count      │    
│        total_amount       │    
└─────────────┬─────────────┘                                 
┌─────────────┴─────────────┐    
│       SEQ_SCAN  (R)       │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│            taxi           │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│      passenger_count      │    
│        total_amount       │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│        EC: 3252717        │    
└───────────────────────────┘                                 
Run Time (s): real 0.633 user 0.314237 sys 0.002464    
    
    
D explain SELECT    
>    passenger_count,    
>    avg(total_amount)    
> -- reading from AWS S3 parquet files    
> FROM read_parquet('s3://us-prd-motherduck-open-datasets/nyc_taxi/parquet/yellow_cab_nyc_2022_11.parquet')    
> GROUP BY passenger_count    
> ORDER by passenger_count;    
    
┌─────────────────────────────┐    
│┌───────────────────────────┐│    
││       Physical Plan       ││    
│└───────────────────────────┘│    
└─────────────────────────────┘    
┌───────────────────────────┐    
│    DOWNLOAD_SOURCE (L)    │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│        bridge_id: 1       │    
└─────────────┬─────────────┘                                 
┌─────────────┴─────────────┐    
│  BATCH_DOWNLOAD_SINK (R)  │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│        bridge_id: 1       │    
└─────────────┬─────────────┘                                 
┌─────────────┴─────────────┐    
│        ORDER_BY (R)       │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│          ORDERS:          │    
│        read_parquet       │    
│    .passenger_count ASC   │    
└─────────────┬─────────────┘                                 
┌─────────────┴─────────────┐    
│     HASH_GROUP_BY (R)     │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│             #0            │    
│          avg(#1)          │    
└─────────────┬─────────────┘                                 
┌─────────────┴─────────────┐    
│       PROJECTION (R)      │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│      passenger_count      │    
│        total_amount       │    
└─────────────┬─────────────┘                                 
┌─────────────┴─────────────┐    
│     READ_PARQUET  (R)     │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│      passenger_count      │    
│        total_amount       │    
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │    
│        EC: 3252717        │    
└───────────────────────────┘                                 
Run Time (s): real 1.071 user 0.287674 sys 0.000563    

8、暂时不支持远程操作的explain analyze

D explain analyze SELECT    
>    passenger_count,    
>    avg(total_amount)    
> -- reading from AWS S3 parquet files    
> FROM read_parquet('s3://us-prd-motherduck-open-datasets/nyc_taxi/parquet/yellow_cab_nyc_2022_11.parquet')    
> GROUP BY passenger_count    
> ORDER by passenger_count;    
Run Time (s): real 0.558 user 0.007176 sys 0.002299    
Error: Not implemented Error: Explain analyze is not yet supported on remote operations    
    
D explain analyze SELECT    
>    passenger_count,    
>    avg(total_amount)    
> FROM sample_data.nyc.taxi    
> GROUP BY passenger_count    
> ORDER by passenger_count;    
Run Time (s): real 0.001 user 0.000730 sys 0.000000    
Error: Not implemented Error: Explain analyze is not yet supported on remote operations    

9、将s3里的数据导入另一个motherduck本地表

D create table main.tbl as select * from read_parquet('s3://us-prd-motherduck-open-datasets/nyc_taxi/parquet/yellow_cab_nyc_2022_11.parquet');    
Run Time (s): real 3.592 user 0.021703 sys 0.005232    
D show tables;    
┌─────────┐    
│  name   │    
│ varchar │    
├─────────┤    
│ tbl     │    
└─────────┘    
Run Time (s): real 0.034 user 0.040085 sys 0.003168    
    
D select count(*) from main.tbl;    
┌──────────────┐    
│ count_star() │    
│    int64     │    
├──────────────┤    
│      3252717 │    
└──────────────┘    
Run Time (s): real 0.554 user 0.299526 sys 0.000653    

10、观察数据结构

D DESCRIBE main.tbl;    
┌───────────────────────┬─────────────┬─────────┬─────────┬─────────┬───────┐    
│      column_name      │ column_type │  null   │   key   │ default │ extra │    
│        varchar        │   varchar   │ varchar │ varchar │ varchar │ int32 │    
├───────────────────────┼─────────────┼─────────┼─────────┼─────────┼───────┤    
│ VendorID              │ BIGINT      │ YES     │         │         │       │    
│ tpep_pickup_datetime  │ TIMESTAMP   │ YES     │         │         │       │    
│ tpep_dropoff_datetime │ TIMESTAMP   │ YES     │         │         │       │    
│ passenger_count       │ DOUBLE      │ YES     │         │         │       │    
│ trip_distance         │ DOUBLE      │ YES     │         │         │       │    
│ RatecodeID            │ DOUBLE      │ YES     │         │         │       │    
│ store_and_fwd_flag    │ VARCHAR     │ YES     │         │         │       │    
│ PULocationID          │ BIGINT      │ YES     │         │         │       │    
│ DOLocationID          │ BIGINT      │ YES     │         │         │       │    
│ payment_type          │ BIGINT      │ YES     │         │         │       │    
│ fare_amount           │ DOUBLE      │ YES     │         │         │       │    
│ extra                 │ DOUBLE      │ YES     │         │         │       │    
│ mta_tax               │ DOUBLE      │ YES     │         │         │       │    
│ tip_amount            │ DOUBLE      │ YES     │         │         │       │    
│ tolls_amount          │ DOUBLE      │ YES     │         │         │       │    
│ improvement_surcharge │ DOUBLE      │ YES     │         │         │       │    
│ total_amount          │ DOUBLE      │ YES     │         │         │       │    
│ congestion_surcharge  │ DOUBLE      │ YES     │         │         │       │    
│ airport_fee           │ DOUBLE      │ YES     │         │         │       │    
├───────────────────────┴─────────────┴─────────┴─────────┴─────────┴───────┤    
│ 19 rows                                                         6 columns │    
└───────────────────────────────────────────────────────────────────────────┘    
Run Time (s): real 0.025 user 0.037545 sys 0.005881    

11、观察数据特征

D SUMMARIZE main.tbl;    
┌──────────────────────┬─────────────┬─────────────────────┬─────────────────────┬───────────────┬───┬────────────────────┬────────────────────┬─────────┬─────────────────┐    
│     column_name      │ column_type │         min         │         max         │ approx_unique │ … │        q50         │        q75         │  count  │ null_percentage │    
│       varchar        │   varchar   │       varchar       │       varchar       │    varchar    │   │      varchar       │      varchar       │  int64  │     varchar     │    
├──────────────────────┼─────────────┼─────────────────────┼─────────────────────┼───────────────┼───┼────────────────────┼────────────────────┼─────────┼─────────────────┤    
│ VendorID             │ BIGINT      │ 1                   │ 6                   │ 3             │ … │ 2                  │ 2                  │ 3252717 │ 0.0%            │    
│ tpep_pickup_datetime │ TIMESTAMP   │ 2002-12-31 23:03:33 │ 2022-12-01 23:55:39 │ 1629458       │ … │                    │                    │ 3252717 │ 0.0%            │    
│ tpep_dropoff_datet…  │ TIMESTAMP   │ 2003-01-01 13:50:43 │ 2022-12-02 00:07:25 │ 1605341       │ … │                    │                    │ 3252717 │ 0.0%            │    
│ passenger_count      │ DOUBLE      │ 0.0                 │ 9.0                 │ 10            │ … │ 1.0                │ 1.0                │ 3252717 │ 3.75%           │    
│ trip_distance        │ DOUBLE      │ 0.0                 │ 305756.36           │ 4465          │ … │ 1.881695154430698  │ 3.5818849316889634 │ 3252717 │ 0.0%            │    
│ RatecodeID           │ DOUBLE      │ 1.0                 │ 99.0                │ 7             │ … │ 1.0                │ 1.0                │ 3252717 │ 3.75%           │    
│ store_and_fwd_flag   │ VARCHAR     │ N                   │ Y                   │ 2             │ … │                    │                    │ 3252717 │ 3.75%           │    
│ PULocationID         │ BIGINT      │ 1                   │ 265                 │ 261           │ … │ 162                │ 234                │ 3252717 │ 0.0%            │    
│ DOLocationID         │ BIGINT      │ 1                   │ 265                 │ 262           │ … │ 162                │ 234                │ 3252717 │ 0.0%            │    
│ payment_type         │ BIGINT      │ 0                   │ 5                   │ 6             │ … │ 1                  │ 1                  │ 3252717 │ 0.0%            │    
│ fare_amount          │ DOUBLE      │ -1274.0             │ 1274.0              │ 7625          │ … │ 10.504850022300305 │ 17.11010696527587  │ 3252717 │ 0.0%            │    
│ extra                │ DOUBLE      │ -5.5                │ 14.35               │ 65            │ … │ 0.5                │ 1.0                │ 3252717 │ 0.0%            │    
│ mta_tax              │ DOUBLE      │ -0.5                │ 16.55               │ 6             │ … │ 0.5                │ 0.5                │ 3252717 │ 0.0%            │    
│ tip_amount           │ DOUBLE      │ -81.6               │ 333.0               │ 3658          │ … │ 2.215828224322078  │ 3.5040940837137833 │ 3252717 │ 0.0%            │    
│ tolls_amount         │ DOUBLE      │ -58.25              │ 655.55              │ 762           │ … │ 0.0                │ 0.0                │ 3252717 │ 0.0%            │    
│ improvement_surcha…  │ DOUBLE      │ -0.3                │ 1.0                 │ 4             │ … │ 0.3                │ 0.3                │ 3252717 │ 0.0%            │    
│ total_amount         │ DOUBLE      │ -1277.8             │ 1277.8              │ 13439         │ … │ 16.33454854410054  │ 23.749735030885194 │ 3252717 │ 0.0%            │    
│ congestion_surcharge │ DOUBLE      │ -2.5                │ 2.5                 │ 5             │ … │ 2.5                │ 2.5                │ 3252717 │ 3.75%           │    
│ airport_fee          │ DOUBLE      │ -1.25               │ 1.25                │ 3             │ … │ 0.0                │ 0.0                │ 3252717 │ 3.75%           │    
├──────────────────────┴─────────────┴─────────────────────┴─────────────────────┴───────────────┴───┴────────────────────┴────────────────────┴─────────┴─────────────────┤    
│ 19 rows                                                                                                                                             12 columns (9 shown) │    
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘    
Run Time (s): real 1.462 user 1.246896 sys 0.000000    

12、将s3里的数据拷贝到本地parquet文件内, 这个耗时就是真实的全量数据网络传输

D copy (select * from read_parquet('s3://us-prd-motherduck-open-datasets/nyc_taxi/parquet/yellow_cab_nyc_2022_11.parquet')) to './tbl.parquet';    
100% ▕████████████████████████████████████████████████████████████▏     
Run Time (s): real 34.359 user 37.874342 sys 0.983531    
    
    
D select count(*) from read_parquet( './tbl.parquet' );    
┌──────────────┐    
│ count_star() │    
│    int64     │    
├──────────────┤    
│      3252717 │    
└──────────────┘    
Run Time (s): real 0.006 user 0.007341 sys 0.002252    

注意这里的本地显得很快, 可能是由于我的客户端到motherduck服务端之间网络特别慢, 而不是motherduck的算力差劲.

See Also

Sat Dec 30, 2023

1800 Words|Read in about 9 Min
Tags: