StarRocks 和 MinIO 解耦存储指南

A Guide to Decoupled Storage with StarRocks and MinIO

解耦存储和计算是现代数据栈的基本架构原则。这种分离允许企业独立扩展其计算资源和存储容量,从而优化成本效率和性能。从 3.0 版本开始,StarRocks 引入了存储计算分离架构,其中数据存储与计算节点分离,允许独立扩展存储和计算。

通过将最佳的云对象存储委托来处理其专门的功能,并将查询性能留给数据库供应商的专业知识,这种方法最大程度地发挥了每个组件的优势。当将 MinIO 与StarRocks在解耦计算模式下结合使用时,这种关系得到了非常清晰的体现。将高性能分析与高性能云对象存储相结合,会产生良好的效果。

要被认为是真正的现代化,您的数据栈必须能够使用单个 Kubernetes YAML 文件每天多次部署。这两个 Kubernetes 原生的开源项目满足了这一要求。更准确地说,这意味着它是为云构建的,而不是为特定的公共云构建的。

本文提供了一个逐步教程,用于使用 MinIO 作为主要存储来开始使用 StarRocks。它基于StarRock 的教程,其中可以找到更多配置细节。

StarRocks 解释

StarRocks 是一款高性能、大规模并行处理 (MPP) OLAP 数据库,它允许在数据湖仓上执行数据仓库查询。它拥有全向量化引擎、新设计的基于成本的优化器和智能物化视图等功能,所有这些都使其能够提供极快的查询速度,尤其是在亚秒级响应时间内进行复杂的多表联接时。StarRocks 支持各种模式,包括扁平、星型和雪花模式,并且与 MySQL 协议兼容。在使用解耦存储的同时,您可以访问 StarRocks 内部格式中的数据,Apache IcebergApache HudiDelta Lake在 MinIO 存储桶内。您可以在 http://starrocks.io 上了解更多关于 StarRocks 的信息。

解耦存储和计算的优势

为了解决解耦可能导致的网络开销增加问题,StarRocks 使用本地数据缓存来存储经常访问的数据,从而提高查询性能。这种架构提供了以下优势:

  • 节省成本:分离计算和存储允许独立扩展和优化资源利用率,从而可以节省大量成本。
  • 灵活度:解耦允许更大的运营灵活性,使企业能够选择最适合特定任务的工具和服务。
  • 可扩展性:它还提供独立扩展云对象存储和计算的能力,从而带来更好的敏捷性和最终更精确的扩展。
  • 性能:分离存储和计算允许优化每个组件以完成其特定任务,从而提高性能,缩短处理时间并提高数据吞吐量。
  • 简化管理:解耦存储和计算可以简化数据栈的管理,因为它允许更轻松地移动工作负载并更好地分配资源。
  • 资源隔离:解耦架构能够实现资源隔离,确保计算资源与特定工作负载匹配。

您将学到的知识

在本教程中,您将学习在 Docker 容器中运行 StarRocks 和 MinIO 的基本知识。您将完成配置 StarRocks 以共享数据的过程:您将加载两个公共数据集并使用 SQL 命令探索数据。

先决条件

您将使用 curl 下载 YAML、数据集并上传 StarRocks。通过在命令提示符中键入 curlcurl.exe 来查看您是否有 curl 安装。如果您没有它,请从这里获取 curl。

您还需要Docker Compose。您可以选择使用 Docker Desktop 单独或一起安装 Docker Engine 和 Docker Compose 二进制文件。安装 Docker Desktop 是最简单的选择。

通过执行以下命令来验证您是否拥有 Docker Compose

docker compose version

您可以使用 MySQL CLI 访问本教程中的 MySQL 实例,从而无需其他先决条件。或者,您可以通过下载DBeaverMySQL Workbench来增强您的体验。

入门

打开终端并运行以下命令以创建一个工作目录并下载 Docker compose 文件。

mkdir sr-quickstart
cd sr-quickstart
curl -O https://raw.githubusercontent.com/StarRocks/demo/master/documentation-samples/quickstart/docker-compose.yml

使用以下命令指示 Docker Compose 在后台启动 docker-compose.yml 文件中指定的容器

docker compose up -d

MinIO

您可以通过 MinIO 控制台或使用 mc 来使用 MinIO。下面的屏幕截图和说明适用于 MinIO 控制台。

导航到http://localhost:9001/access-keys。用户名和密码在 Docker compose 文件中提及,默认情况下设置为 minioadmin:minioadmin。

单击“创建访问密钥 +”,然后单击“创建”。

SQL 客户端

您需要连接到 SQL 客户端才能使用数据。您可以选择性地使用 DBeaver。在 DBeaver 中创建新的数据库连接。然后选择 MySQL 数据库驱动程序。

配置以下字段

  • 端口: 9030
  • 服务器主机:localhost

用户名:root

测试连接,如果测试成功,请单击“完成”。

或者,如果您不喜欢 DBeaver,或者您更喜欢在命令行上操作,您可以使用 starrocks-fe 容器中的 MySQL CLI。要连接到 StarRocks,请转到与您的 docker-compose.yml 相同的目录,然后运行以下命令。

docker compose exec starrocks-fe \
mysql -P9030 -h127.0.0.1 -uroot --prompt="StarRocks > "

创建存储桶

在您的 SQL 客户端中运行以下命令,确保您使用之前在 MinIO 控制台中创建的访问密钥和密钥

CREATE STORAGE VOLUME shared
TYPE = S3
LOCATIONS = ("s3://starrocks/shared/")
PROPERTIES
(
   "enabled" = "true",
   "aws.s3.endpoint" = "http://minio:9000",
   "aws.s3.use_aws_sdk_default_behavior" = "false",
   "aws.s3.enable_ssl" = "false",
   "aws.s3.use_instance_profile" = "false",
   "aws.s3.access_key" = "{YOUR ACCESS KEY}",
   "aws.s3.secret_key"= "{YOUR SECRET KEY}"
);

SET shared AS DEFAULT STORAGE VOLUME;

导航到http://localhost:9001/buckets以查看 starrocks 存储桶是否已成功创建。

下载数据

在终端窗口中运行以下命令以在 starrocks-fe 容器中打开一个 Bash shell,允许您与容器的文件系统交互并在其中执行命令。

docker compose exec starrocks-fe bash

运行以下命令在容器中创建一个快速入门目录。

mkdir quickstart
cd quickstart

运行以下命令将两个数据集下载到您刚刚创建的文件夹中。

curl -O https://raw.githubusercontent.com/StarRocks/demo/master/documentation-samples/quickstart/datasets/NYPD_Crash_Data.csv
curl -O https://raw.githubusercontent.com/StarRocks/demo/master/documentation-samples/quickstart/datasets/72505394728.csv

创建表

在终端窗口中,您使用 SQL 客户端连接到 StarRocks 的 StarRocks > 提示符处运行以下命令。

CREATE DATABASE IF NOT EXISTS quickstart;
USE quickstart;

您的终端应如下所示

StarRocks > CREATE DATABASE IF NOT EXISTS quickstart;
Query OK, 0 rows affected (0.02 sec)
StarRocks > USE quickstart;
Database changed
StarRocks > 

在 SQL 客户端中创建表

回到 DBeaver 或您选择的 SQL 客户端,执行以下命令以创建数据表。

USE quickstart;
CREATE TABLE IF NOT EXISTS crashdata (
   CRASH_DATE DATETIME,
   BOROUGH STRING,
   ZIP_CODE STRING,
   LATITUDE INT,
   LONGITUDE INT,
   LOCATION STRING,
   ON_STREET_NAME STRING,
   CROSS_STREET_NAME STRING,
   OFF_STREET_NAME STRING,
   CONTRIBUTING_FACTOR_VEHICLE_1 STRING,
   CONTRIBUTING_FACTOR_VEHICLE_2 STRING,
   COLLISION_ID INT,
   VEHICLE_TYPE_CODE_1 STRING,
   VEHICLE_TYPE_CODE_2 STRING
);
CREATE TABLE IF NOT EXISTS weatherdata (
   DATE DATETIME,
   NAME STRING,
   HourlyDewPointTemperature STRING,
   HourlyDryBulbTemperature STRING,
   HourlyPrecipitation STRING,
   HourlyPresentWeatherType STRING,
   HourlyPressureChange STRING,
   HourlyPressureTendency STRING,
   HourlyRelativeHumidity STRING,
   HourlySkyConditions STRING,
   HourlyVisibility STRING,
   HourlyWetBulbTemperature STRING,
   HourlyWindDirection STRING,
   HourlyWindGustSpeed STRING,
   HourlyWindSpeed STRING
);

加载数据

切换到您下载数据集的终端,并从 starrocks-fe 容器中运行的 shell 中执行这些 curl 命令。在提示输入密码时按 ENTER 键。

curl --location-trusted -u root             \
    -T ./NYPD_Crash_Data.csv                \
    -H "label:crashdata-0"                  \
    -H "column_separator:,"                 \
    -H "skip_header:1"                      \
    -H "enclose:\""                         \
    -H "max_filter_ratio:1"                 \
    -H "columns:tmp_CRASH_DATE, tmp_CRASH_TIME, CRASH_DATE=str_to_date(concat_ws(' ', tmp_CRASH_DATE, tmp_CRASH_TIME), '%m/%d/%Y %H:%i'),BOROUGH,ZIP_CODE,LATITUDE,LONGITUDE,LOCATION,ON_STREET_NAME,CROSS_STREET_NAME,OFF_STREET_NAME,NUMBER_OF_PERSONS_INJURED,NUMBER_OF_PERSONS_KILLED,NUMBER_OF_PEDESTRIANS_INJURED,NUMBER_OF_PEDESTRIANS_KILLED,NUMBER_OF_CYCLIST_INJURED,NUMBER_OF_CYCLIST_KILLED,NUMBER_OF_MOTORIST_INJURED,NUMBER_OF_MOTORIST_KILLED,CONTRIBUTING_FACTOR_VEHICLE_1,CONTRIBUTING_FACTOR_VEHICLE_2,CONTRIBUTING_FACTOR_VEHICLE_3,CONTRIBUTING_FACTOR_VEHICLE_4,CONTRIBUTING_FACTOR_VEHICLE_5,COLLISION_ID,VEHICLE_TYPE_CODE_1,VEHICLE_TYPE_CODE_2,VEHICLE_TYPE_CODE_3,VEHICLE_TYPE_CODE_4,VEHICLE_TYPE_CODE_5" \
    -XPUT http://localhost:8030/api/quickstart/crashdata/_stream_load
curl --location-trusted -u root             \
    -T ./72505394728.csv                    \
    -H "label:weather-0"                    \
    -H "column_separator:,"                 \
    -H "skip_header:1"                      \
    -H "enclose:\""                         \
    -H "max_filter_ratio:1"                 \
    -H "columns: STATION, DATE, LATITUDE, LONGITUDE, ELEVATION, NAME, REPORT_TYPE, SOURCE, HourlyAltimeterSetting, HourlyDewPointTemperature, HourlyDryBulbTemperature, HourlyPrecipitation, HourlyPresentWeatherType, HourlyPressureChange, HourlyPressureTendency, HourlyRelativeHumidity, HourlySkyConditions, HourlySeaLevelPressure, HourlyStationPressure, HourlyVisibility, HourlyWetBulbTemperature, HourlyWindDirection, HourlyWindGustSpeed, HourlyWindSpeed, Sunrise, Sunset, DailyAverageDewPointTemperature, DailyAverageDryBulbTemperature, DailyAverageRelativeHumidity, DailyAverageSeaLevelPressure, DailyAverageStationPressure, DailyAverageWetBulbTemperature, DailyAverageWindSpeed, DailyCoolingDegreeDays, DailyDepartureFromNormalAverageTemperature, DailyHeatingDegreeDays, DailyMaximumDryBulbTemperature, DailyMinimumDryBulbTemperature, DailyPeakWindDirection, DailyPeakWindSpeed, DailyPrecipitation, DailySnowDepth, DailySnowfall, DailySustainedWindDirection, DailySustainedWindSpeed, DailyWeather, MonthlyAverageRH, MonthlyDaysWithGT001Precip, MonthlyDaysWithGT010Precip, MonthlyDaysWithGT32Temp, MonthlyDaysWithGT90Temp, MonthlyDaysWithLT0Temp, MonthlyDaysWithLT32Temp, MonthlyDepartureFromNormalAverageTemperature, MonthlyDepartureFromNormalCoolingDegreeDays, MonthlyDepartureFromNormalHeatingDegreeDays, MonthlyDepartureFromNormalMaximumTemperature, MonthlyDepartureFromNormalMinimumTemperature, MonthlyDepartureFromNormalPrecipitation, MonthlyDewpointTemperature, MonthlyGreatestPrecip, MonthlyGreatestPrecipDate, MonthlyGreatestSnowDepth, MonthlyGreatestSnowDepthDate, MonthlyGreatestSnowfall, MonthlyGreatestSnowfallDate, MonthlyMaxSeaLevelPressureValue, MonthlyMaxSeaLevelPressureValueDate, MonthlyMaxSeaLevelPressureValueTime, MonthlyMaximumTemperature, MonthlyMeanTemperature, MonthlyMinSeaLevelPressureValue, MonthlyMinSeaLevelPressureValueDate, MonthlyMinSeaLevelPressureValueTime, MonthlyMinimumTemperature, MonthlySeaLevelPressure, MonthlyStationPressure, MonthlyTotalLiquidPrecipitation, MonthlyTotalSnowfall, MonthlyWetBulb, AWND, CDSD, CLDD, DSNW, HDSD, HTDD, NormalsCoolingDegreeDay, NormalsHeatingDegreeDay, ShortDurationEndDate005, ShortDurationEndDate010, ShortDurationEndDate015, ShortDurationEndDate020, ShortDurationEndDate030, ShortDurationEndDate045, ShortDurationEndDate060, ShortDurationEndDate080, ShortDurationEndDate100, ShortDurationEndDate120, ShortDurationEndDate150, ShortDurationEndDate180, ShortDurationPrecipitationValue005, ShortDurationPrecipitationValue010, ShortDurationPrecipitationValue015, ShortDurationPrecipitationValue020, ShortDurationPrecipitationValue030, ShortDurationPrecipitationValue045, ShortDurationPrecipitationValue060, ShortDurationPrecipitationValue080, ShortDurationPrecipitationValue100, ShortDurationPrecipitationValue120, ShortDurationPrecipitationValue150, ShortDurationPrecipitationValue180, REM, BackupDirection, BackupDistance, BackupDistanceUnit, BackupElements, BackupElevation, BackupEquipment, BackupLatitude, BackupLongitude, BackupName, WindEquipmentChangeDate" \
    -XPUT http://localhost:8030/api/quickstart/weatherdata/_stream_load

返回到 MinIO,网址为http://localhost:9001,以验证数据是否已成功加载。

探索数据

返回您的 SQL 客户端。让我们对刚刚加载的数据运行一些查询。从查询数据开始,了解降水量、事故和一周中的日期/时间之间的关系。

SELECT COUNT(DISTINCT c.COLLISION_ID) AS Crashes,
       TRUNCATE(AVG(w.HourlyDryBulbTemperature), 1) AS Temp_F,
       MAX(w.HourlyPrecipitation) AS Precipitation,
       DATE_FORMAT(c.CRASH_DATE, '%d %b %Y %H:00') AS Hour
FROM crashdata c
LEFT JOIN weatherdata w
ON DATE_FORMAT(c.CRASH_DATE, '%Y-%m-%d %H:00:00') = DATE_FORMAT(w.DATE, '%Y-%m-%d %H:00:00')
WHERE DAYOFWEEK(c.CRASH_DATE) BETWEEN 2 AND 6
GROUP BY Hour
ORDER BY Crashes DESC
LIMIT 200;

使用 StarRocks 的云原生分析 StarRocks 和 MinIO 的组合为企业提供了灵活、可扩展且经济高效的数据架构。计算和存储资源的分离允许独立扩展,优化资源利用率并节省大量成本。这种方法不仅提高了性能,而且简化了管理并确保了更好的资源隔离。

随着数据成为决策的关键因素,能够高效、快速地分析和提取见解至关重要。StarRocks 与 MinIO 结合在一起,成为现代数据栈中可靠的解决方案。

有问题吗?联系我们在Slack上,或者发送邮件到hello@min.io。我们很乐意提供帮助。