文盘Rust -- rust 连接云上数仓 starwift

rust,连接,上数,starwift · 浏览次数 : 71

小编点评

## rust 与 starwift 连接指南 **简介:** 作者分享了如何在京东云 Starwfit 中使用 Rust 与 ClickHouse 的步骤,并遇到了依赖冲突问题,最后通过探索发现 ClickHouse-rs 与 clickhouse.rs 由于依赖方式不同导致编译不通过。 **步骤:** 1. 创建集群登录控制台,直接选配创建即可创建用户开启白名单。 2. 在实际生产环境中,根据实际情况配置白名单避免安全问题。 3. 开启公网连接,便于开发和测试mac客户端安装安装客户端macos。 4. 使用 `clickhouse_rs` 或 `clickhouse` 库连接 Starwift。 **代码示例:** **tcp 连接:** ```rust use clickhouse_rs::Pool; let database_url = "tcp://username:password@service-terrabase-9s29mdlsb7.terrabase-9s2mdsb-hb-public.jvessel2.jdcloud.com:9000?compression=lz4"; let pool = Pool::new(database_url); let mut client = pool.get_handle().await.unwrap(); let sql = "show databases;"; let r = client.query(sql).fetch_all().await; println!("result is: {:?}", r); ``` **http 连接:** ```rust use clickhouse::Client; let client = Client::default() .with_url("https://service-terrabase-9s29mdlsb7.terrabase-9sdlb7-hb-public.jvessel2.jdcloud.com:8123") .with_user("username") .with_password("password"); let sql = "SHOW databases"; let r = client.query(sql).fetch_all::<Database>().await; println!("result is: {:?}", r); ``` **踩坑及爬坑:** * 依赖冲突:`clickhouse-rs` 和 `clickhouse.rs` 由于依赖方式不同导致编译不通过。 **总结:** 使用 Rust 与 ClickHouse 可以建立高效的数据仓库解决方案,但需要克服依赖冲突问题。通过探索相关资料和代码示例,我们可以逐步解决问题,并将最终实现数据库连接。

正文

作者:京东云 贾世闻

最近想看看 rust 如何集成 clickhouse,又犯了好吃懒做的心理(不想自己建环境),刚好京东云发布了兼容ck 的云原生数仓 Starwfit,于是搞了个实例折腾一番。

Starwfit 是京东云自主研发的新一代云原生数据仓库,通过存算分离降低了存储成本,同时兼具性能和扩展弹性。其写入和查询速度可达到传统数据仓库的数倍,为用户提供实时数据分析能力。广泛应用于流量分析、精准营销、用户画像、广告实时竞价、BI报表分析、日志分析、促销选品、物联网等业务场景。

言归正传,看看 rust 如何与 starwift 打交道。

创建集群

  • 创建用户

  • 开启白名单

为了保证starwift能够被外部资源访问需要开启白名单,默认情况下新创建的实例只有该实例所在vpc下才能访问

为了方便,实验环境直接编辑 default 分组,编辑 ip 列表为 0.0.0.0/0,对所有ip开放。在实际生产环境需要根据实际情况配置白名单避免安全问题。

  • 开启公网连接

为了实验方便,开启公网访问域名便于开发和测试

mac客户端安装

  • 安装客户端

    macos 客户端安装

     curl -O 'https://builds.clickhouse.com/master/macos/clickhouse' && chmod a  +x ./clickhouse
    

    其他客户端安装 参见 clickhosue 官方文档

  • 测试连通性

    clickhouse client --host service-terrabase-9s29mdlsb7.  terrabase-9s29mdlsb7-hb-public.jvessel2.jdcloud.com \
    --port 9000 \
    --user sample \
    --password xxxxxx
    
    clickhouse:) show databases
    

rust 连接 starwift

starwift 支持 tcp 和 http 两种协议连接server。下面我们分别给出两种方式的示例代码

  • tcp 连接

    • 依赖 crate

      # clickhouse tcp
      tokio = { version = "1.21.2", features = ["full"] }
      clickhouse-rs = { git = "https://github.com/suharev7/clickhouse-rs", features = ["default"]}
      
    • 示例代码

      use clickhouse_rs::Pool;
      
      #[tokio::main]
      async fn main() {
          let database_url="tcp://username:password@service-terrabase-9s29mdlsb7.terrabase-9s2mdsb-hb-public.jvessel2.jdcloud.com:9000?compression=lz4".to_string();
          let pool = Pool::new(database_url);
      
          let mut client = pool.get_handle().await.unwrap();
          let sql = "show databases;";
          let r = client.query(sql).fetch_all().await;
          println!("result is: {:?}", r);
      }
      
      
  • http 连接

    • 依赖 crate

      # clickhouse http
      clickhouse = {git = "https://github.com/loyd/clickhouse.rs", features = ["test-util"]}
      
    • 示例代码

      use clickhouse::Client;
      use clickhouse::Row;
      use serde::{Deserialize, Serialize};
      
      #[derive(Debug, Row, Serialize, Deserialize)]
      struct Database {
          name: String,
      }
      
      #[tokio::main]
      async fn main() {
          let client = Client::default()
          .with_url("https://service-terrabase-9s29mdlsb7.terrabase-9sdlb7-hb-public.jvessel2.jdcloud.com:8123")
          .with_user("username")
          .with_password("password");
      
          let sql = "SHOW databases";
          let r = client.query(sql).fetch_all::<Database>().await;
          println!("result is: {:?}", r);
      }
      

测试过程中,遇到了依赖冲突问题,clickhouse-rs 和 clickhouse.rs 同时依赖了 clickhouse-rs-cityhash-sys 但依赖方式不同,导致编译不通过,下一期详细聊聊踩坑及爬坑过程。 再次感谢京东云数据库团队提供的 starwift 测试实例。 下期见。

与文盘Rust -- rust 连接云上数仓 starwift相似的内容:

文盘Rust -- rust 连接云上数仓 starwift

最近想看看 rust 如何集成 clickhouse,又犯了好吃懒做的心理(不想自己建环境),刚好京东云发布了兼容ck 的云原生数仓 Starwfit,于是搞了个实例折腾一番。 Starwfit 是京东云自主研发的新一代云原生数据仓库,通过存算分离降低了存储成本,同时兼具性能和扩展弹性。其写入和查询速度可达到传统数据仓库的数倍,为用户提供实时数据分析能力。广泛应用于流量分析、精准营销、用户画像、广

文盘Rust -- 领域交互模式如何实现

书接上文,上回说到如何通过interactcli-rs四步实现一个命令行程序。但是 shell 交互模式在有些场景下用户体验并不是很好。比如我们要连接某个服务,比如 mysql 或者 redis 这样的服务。如果每次交互都需要输入地址、端口、用户名等信息,交互起来太麻烦。通常的做法是一次性输入和连接相关的信息或者由统一配置文件进行管理,然后进入领域交互模式,所有的命令和反馈都和该领域相关。inte

文盘Rust —— rust连接oss | 京东云技术团队

对象存储是云的基础组件之一,各大云厂商都有相关产品。这里跟大家介绍一下rust与对象存储交到的基本套路和其中的一些技巧。

文盘Rust -- 安全连接 TiDB/Mysql

最近在折腾rust与数据库集成,选了Tidb Cloud Serverless Tier 作为数据源。Tidb 无疑是近五年来最优秀的国产开源分布式数据库,Tidb Cloud Serverless Tier作为pingcap旗下的云产品方便又经济,这次使用还有一些小惊喜。

文盘Rust -- r2d2 实现redis连接池

作者:贾世闻 我们在开发应用后端系统的时候经常要和各种数据库、缓存等资源打交道。这一期,我们聊聊如何访问redis 并将资源池化。 在一个应用后端程序访问redis主要要做的工作有两个,单例和池化。 在后端应用集成redis,我们主要用到以下几个crate:​ ​once_cell​​​、​ ​re

文盘Rust -- tonic-Rust grpc初体验

gRPC 是开发中常用的开源高性能远程过程调用(RPC)框架,tonic 是基于 HTTP/2 的 gRPC 实现,专注于高性能、互操作性和灵活性。该库的创建是为了对 async/await 提供一流的支持,并充当用 Rust 编写的生产系统的核心构建块。今天我们聊聊通过使用tonic 调用grpc的的具体过程。

文盘Rust -- FFI 浅尝

rust FFI 是rust与其他语言互调的桥梁,通过FFI rust 可以有效继承 C 语言的历史资产。本期通过几个例子来聊聊rust与C 语言交互的具体步骤

文盘Rust -- 本地库引发的依赖冲突

clickhouse 的原生 rust 客户端目前比较好的有两个clickhouse-rs 和 clickhouse.rs 。两个库在单独使用时没有任何问题,但是,在同一工程同时引用时会报错。本篇内容主要讲解如何用rust语言解决本地库引发的依赖冲突问题

文盘Rust -- 用Tokio实现简易任务池

Tokio 无疑是 Rust 世界中最优秀的异步Runtime实现。非阻塞的特性带来了优异的性能,但是在实际的开发中我们往往需要在某些情况下阻塞任务来实现某些功能。

文盘Rust -- 把程序作为守护进程启动

当我们写完一个服务端程序,需要上线部署的时候,或多或少都会和操作系统的守护进程打交道,毕竟谁也不希望shell关闭既停服。今天我们就来聊聊这个事儿。 最早大家部署应用的通常操作是 “nohup xxxx &”,别说像weblogic 或者其他java 容器有启动脚本,里面其实也差不多;很喜欢 ngi