为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用AWS无服务器技术开发Amazon Athena的Clickhouse数据连接器

AWS 无服务器分析服务 [StabilityAI]

我的一些 AWS 客户使用 Clickhouse,这是一个开源的列式数据库,支持 PB 级别的实时 OLAP 查询,并被成千上万的公司用于包括 AI 和 ML、可观测性、电子商务、金融、游戏、物联网、安全等在内的多种用例。我的客户需要方便地将存储在 Clickhouse 中的 TB 级数据与其他 AWS 服务集成,特别是Amazon AthenaAmazon QuickSightAWS GlueAmazon SageMakerAmazon Data Zone。本文讨论了为什么要这样做以及如何使用 AWS 无服务器技术开发一个将 Clickhouse 数据库连接到 AWS Athena 的连接器。

ClickHouse

Clickhouse 是一个高性能的列式 SQL 数据库,支持 PB 级的实时 OLAP。Clickhouse 提供开源软件包和云服务。OLAP 需要在包含数百万到 万亿 行的大型数据集上实时执行复杂的分析查询。数据通常组织成宽表,包含超过100列,但在回答特定查询时,通常只选择和聚合少数列。列通常很小,比如时间戳、数值和短字符串。查询结果必须在几秒内返回。插入通常以大批量(>1000 行)进行,通常不需要事务支持。

列式数据库比行式数据库更适合OLAP使用场景,因为关系型数据库管理系统只需要读取必要的列,从而最小化磁盘I/O读操作。这一点可通过以下Clickhouse的动画最好地展示。Clickhouse还使用了其他一些性能优化措施,包括数据压缩、内存中的索引、向量化查询执行以及跨服务器集群的CPU核心和磁盘的分布式查询处理。

行导向的 OLAP 数据库 [Clickhouse]

列式 OLAP 数据库 [ Clickhouse ]

Clickhouse 的客户包括 Akamai、阿里巴巴、Bloomberg、Cloudflare、德意志银行、GitLab、InstaCart、LangChain、Lyft、NGINX、Netflix、Spotify、腾讯、Vantage、Vimeo、沃尔玛等。此外,Clickhouse 还可以与 Apache Airflow、Apache Hive、Apache Spark、Amazon MSK、Amazon S3、MinIO、Redis 和 RabbitMQ 等进行集成。最后,在多方面的比较中,Clickhouse 在性能上明显优于 Elasticsearch、Snowflake、Google BigQuery、Amazon Redshift 等数据仓库解决方案。

Amazon的Athena

Amazon Athena 架构(AWS)

Amazon Athena 是一项无服务器分析服务,提供了一种简单且灵活的方式来分析数据,而无需移动数据。Athena 支持标准 SQL,并可以连接到 Amazon S3 及其他超过 30 个数据源。Athena 建立在开源的 Trino 和 Presto 引擎及 Apache Spark 框架之上,并且无需配置或管理操作。Athena 还与包括 QuickSight、Glue、SageMaker 和 Data Zone 在内的其他 AWS 分析服务进行集成。Athena 的客户包括 Atlassian、宝马、可口可乐、ENGIE、FINRA、Georgia-Pacific、西门子等在内的数千家公司。

Amazon Athena ClickHouse 数据连接

上述提到的Athena的开源软件(OSS)开源基础以及AWS发布了用于Athena连接器的开源SDK意味着你可以用Java开发自己的连接器,如果还没有现成的。我审查了现有的Athena连接器,虽然JDBC和MySQL的连接器比较接近,但没有一个完全符合Clickhouse的情况。我有几个目标:1/使用Clickhouse的OEM驱动来最大化性能,2/最大化代码复用并符合现有的Athena代码基础,3/最小化客户的部署工作量

我克隆了Athena查询联邦(AQF)SDK 代码库。接着,我阅读了Athena连接器的指南,并检查了AQF代码,并注意到MySQL连接器的代码可能适用于Clickhouse,因为Clickhouse支持MySQL wire协议。最后,我找到了Clickhouse JDBC驱动程序,并开始了具体的工作。我扩展了几个Java类,比如CompositeHandler、MySqlMetadataHandler、MultiplexingJdbcCompositeHandler和JdbcRecordHandler;我还实现了几个Java接口,比如JdbcMetadataHandlerFactory和JdbcRecordHandlerFactory。

    public class ClickHouseCompositeHandler  
            extends CompositeHandler {}  

    public class ClickHouseRecordHandler  
            extends JdbcRecordHandler {}  

    public class ClickHouseMetadataHandler  
            extends MySqlMetadataHandler {}  

    public class ClickHouseMuxCompositeHandler  
            extends MultiplexingJdbcCompositeHandler {}  

    public class ClickHouseMuxMetadataHandler  
            extends MultiplexingJdbcMetadataHandler {}  

    public class ClickHouseMuxRecordHandler   
            extends MultiplexingJdbcRecordHandler {}

我编写了多个单元测试来覆盖所有新代码,并重新运行了新 athena-clickhouse 模块以及整个 AQF SDK 的回归测试套件。我按照 MySQL 的示例,创建了一个基于 AWS Serverless 应用模型 (SAM) 的 YAML 格式 CloudFormation 脚本,该脚本部署了一个 Lambda 函数,该函数在必要时将 Athena 的 SQL 命令委托给底层的 Clickhouse 数据库。

亚马逊 Athena 联邦查询引擎架构 AWS

我创建了一个S3桶来存储JAR二进制文件,并作为Athena查询结果的暂存区域。我还在我托管Clickhouse数据库的VPC中创建了AWS S3和AWS Secrets Manager的这些VPC终端节点,这样我的VPC托管的Lambda函数就能访问这些AWS服务。最后,我使用_sam_脚本进行部署,部署了新的Athena Clickhouse连接器,该连接器包括_Lambda_函数、_JAR_二进制文件和_IAM_角色三部分,然后在已安装在Amazon EC2实例上的Clickhouse数据库服务器上进行了测试验证,该服务器上已加载了基准数据。

注意,你必须为你的特定环境的网络和安全要求配置 SAM 部署参数。你必须设置 S3(以及可选的 Secrets Manager,如果需要使用它来存储凭证)的 VPC 终端节点。更多部署详情请参见 athena-clickhouse 代码库

    git clone https://github.com/bishrtabbaa/athena-clickhouse  
    cd athena-clickhouse  
    curl --location -O https://github.com/awslabs/aws-athena-query-federation/releases/download/v2024.25.1/athena-clickhouse-2024.25.1.jar  
    aws s3 cp --region us-east-2 athena-clickhouse-2024.25.1.jar  s3://my-bishrtabbaa-athena-demo/code/  # 将jar文件上传到S3指定位置
    sam validate --region us-east-2 --template-file athena-clickhouse.yaml  # 验证模板文件是否符合要求
    sam deploy --guided --region us-east-2 --template-file athena-clickhouse.yaml --stack-name AthenaClickhouseConnectorStack --capabilities CAPABILITY_NAMED_IAM --parameter-overrides LambdaFunctionName=athenaclickhouseconnectorfunction DefaultConnectionString='clickhouse://jdbc:clickhouse:https://myclickhouseserver.xyzware.io:8443/default?user=foo&password=bar&sslmode=none' DisableSpillEncryption=true SecretNamePrefix=AthenaClickhouse SpillBucket=my-bishrtabbaa-athena-demo  SpillPrefix=athena-spill SecurityGroupIds=sg-26b5a34e SubnetIds=subnet-15ce057d,subnet-86cec2fd LambdaS3CodeUriBucket=my-bishrtabbaa-athena-demo LambdaS3CodeUriKey=code/athena-clickhouse-2024.25.1.jar  # 使用指定参数部署Lambda函数和相关的资源

令我高兴的是,从功能正确性、性能和安全性方面来看,一切运行良好,我非常激动地与 AWS 开源社区分享这个新的大数据连接组件。代码已经过审查、批准,并合并到了官方的 Athena 联合查询系统 repo 中。

最后来个总结

Clickhouse 是 Amazon Athena 以及您的其他 AWS 工作负载的自然大数据来源。您可以使用此无服务器部署包工具将 Clickhouse 与其他 AWS 服务集成。期待来自 AWS、大数据领域和开源社区的反馈。

喜欢这篇文章?在代码 上使用了吗?请在Medium 和_Twitter 上关注我,获取更多更新内容。

参考资料
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消