跳到主要内容
版本:Latest-3.3

使用 Helm 部署 StarRocks

目标

本快速入门的目标是:

  • 使用 Helm 部署 StarRocks Kubernetes Operator 和 StarRocks 集群
  • 为 StarRocks 数据库用户 root 配置密码
  • 通过部署三个 FE 和三个 BE 保证高可用性
  • 在持久化存储中存储元数据
  • 在持久化存储中存储数据
  • 通过 MySQL 客户端从外部连接 Kubernetes 集群
  • 通过 Stream Load 从外部向 Kubernetes 集群中导入数据
  • 导入公共数据集
  • 查询数据
提示

本教程中的数据集和查询与基础快速入门中使用的相同。主要区别在于使用 Helm 和 StarRocks Operator 部署。

使用的数据由 NYC OpenData 和美国国家环境信息中心提供。

这些数据集都很大,因为本教程旨在帮助您熟悉使用 StarRocks,所以不会导入过去 120 年的数据。推荐您使用三个 e2-standard-4 (或类似的)机器构建的 GKE Kubernetes 集群,磁盘大小为 80GB。对于更大规模的部署,请参考部署文档。

本文档包含大量信息,在文档的开头是分步内容,技术细节在文章末尾,这样的顺序安排是为了:

  1. 使用 Helm 部署系统。
  2. 允许读者在 StarRocks 中导入数据并分析这些数据。
  3. 解释导入过程中数据转换的基本知识。

前提条件

Kubernetes 环境

本指南编写时使用的 Kubernetes 环境由三个节点组成,每个节点配备四个 vCPU 和 16GB 内存(GCP e2-standard-4 机器)。Kubernetes 集群是通过以下 gcloud 命令部署的:

提示

这个命令仅供参考,如果你使用的是 AWS、Azure 或其他 Kubernetes 提供商,你需要根据自身环境进行修改。在 Google Cloud 中,你需要指定自己的项目和合适的位置。

gcloud container --project enterprise-demo-422514 \
clusters create ee-docs \
--location=southamerica-west1-b \
--machine-type e2-standard-4 --disk-size 80 --num-nodes 3

Helm

Helm 是一个用于 Kubernetes 的包管理器,简化了应用程序的部署和管理。在本实验中,你将使用 Helm 来部署 CelerData Enterprise Edition Kubernetes operator 和示例 StarRocks 集群。

Install helm

SQL 客户端

您可以使用在 Kubernetes 环境中提供的 SQL 客户端,或使用您系统上的客户端。本指南使用 mysql CLI。许多兼容 MySQL 的客户端都可以使用。

curl

curl 用于向 StarRocks 发送数据导入任务,以及下载数据集。您可以通过在操作系统命令提示符下运行 curlcurl.exe 检查您是否安装了它。如果没有安装 curl,点击这里获取 curl


术语

FE

FE 节点负责元数据管理、客户端连接管理、查询规划和查询调度。每个 FE 在其内存中存储并维护完整的元数据副本,保证 FE 之间服务无差别。

BE

BE 节点负责数据存储和执行查询计划。


添加 StarRocks Helm Chart 仓库

Helm Chart 包含 StarRocks Operator 的定义和自定义资源 StarRocksCluster。

  1. 添加 Helm Chart 仓库。

    helm repo add starrocks https://starrocks.github.io/starrocks-kubernetes-operator
  2. 将 Helm Chart 仓库更新到最新版本。

    helm repo update
  3. 查看您添加的 Helm Chart 仓库。

    helm search repo starrocks
    NAME                              	CHART VERSION	APP VERSION	DESCRIPTION
    starrocks/kube-starrocks 1.9.7 3.2-latest kube-starrocks includes two subcharts, operator...
    starrocks/operator 1.9.7 1.9.7 A Helm chart for StarRocks operator
    starrocks/starrocks 1.9.7 3.2-latest A Helm chart for StarRocks cluster
    starrocks/warehouse 1.9.7 3.2-latest Warehouse is currently a feature of the StarRoc...

下载数据

将这两个数据集下载到您的机器上。

纽约市交通事故数据

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

创建 Helm values 文件

本快速入门的目标是:

  1. 为 StarRocks 数据库用户 root 配置密码
  2. 提供具有三个 FE 和三个 BE 的高可用性
  3. 在持久化存储中存储元数据
  4. 在持久化存储中存储数据
  5. 允许 MySQL 客户端从外部连接 Kubernetes 集群
  6. 允许使用 Stream Load 从 Kubernetes 集群外部导入数据

Helm Chart 提供了达成所有这些目标的选项,但默认情况下未配置。本小节的其余部分涵盖了实现所有这些目标所需的配置。小节最后将提供完整的 values 规范,但首先请阅读每个部分的详细信息,然后复制完整规范。

1. 数据库用户密码

这个 YAML 片段指示 StarRocks operator 将数据库用户 root 的密码设置为 Kubernetes secret starrocks-root-pass 的 password 键的值。

starrocks:
initPassword:
enabled: true
# 设置密码 secret,例如:
# kubectl create secret generic starrocks-root-pass --from-literal=password='g()()dpa$$word'
passwordSecret: starrocks-root-pass
  • 任务:创建 Kubernetes secret

    kubectl create secret generic starrocks-root-pass --from-literal=password='g()()dpa$$word'

2. 具有 3 个 FE 和 3 个 BE 的高可用性

通过将 starrocks.starrockFESpec.replicasstarrocks.starrockBeSpec.replicas 设置为 3,部署足够的 FE 和 BE 保证高可用性。将 CPU 和内存请求设置得较低可以在小型 Kubernetes 环境中创建 pod。

starrocks:
starrocksFESpec:
replicas: 3
resources:
requests:
cpu: 1
memory: 1Gi

starrocksBeSpec:
replicas: 3
resources:
requests:
cpu: 1
memory: 2Gi

3. 在持久化存储中存储元数据

starrocks.starrocksFESpec.storageSpec.name 的值设置为 "" 以外的任何内容都会导致:

  • 使用持久化存储
  • starrocks.starrocksFESpec.storageSpec.name 的值用作该服务的所有存储卷的前缀。

通过将值设置为 fe,将为 FE 0 创建这些 PV:

  • fe-meta-kube-starrocks-fe-0
  • fe-log-kube-starrocks-fe-0
starrocks:
starrocksFESpec:
storageSpec:
name: fe

4. 在持久化存储中存储数据

starrocks.starrocksBeSpec.storageSpec.name 的值设置为 "" 以外的任何内容都会导致:

  • 使用持久化存储
  • starrocks.starrocksBeSpec.storageSpec.name 的值用作该服务的所有存储卷的前缀。

通过将值设置为 be,将为 BE 0 创建这些 PV:

  • be-data-kube-starrocks-be-0
  • be-log-kube-starrocks-be-0

storageSize 设置为 15Gi 以将存储从默认的 1Ti 减少到适合较小的存储配额。

starrocks:
starrocksBeSpec:
storageSpec:
name: be
storageSize: 15Gi

5. 用于 MySQL 客户端的负载均衡器

默认情况下,通过集群 IP 访问 FE 服务。要允许外部访问,请将 service.type 设置为 LoadBalancer

starrocks:
starrocksFESpec:
service:
type: LoadBalancer

6. 用于外部数据导入的负载均衡器

Stream Load 需要对 FEs 和 BEs 的外部访问。请求发送到 FE,然后 FE 将分配 BE 处理上传。为了允许 curl 命令重定向到 BE,需要启用并将 starroclFeProxySpec 设置为 LoadBalancer 类型。

starrocks:
starrocksFeProxySpec:
enabled: true
service:
type: LoadBalancer

完整的 values 文件

以上片段组合提供了一个完整的 values 文件。将其保存为 my-values.yaml:

starrocks:
initPassword:
enabled: true
# 设置密码 secret,例如:
# kubectl create secret generic starrocks-root-pass --from-literal=password='g()()dpa$$word'
passwordSecret: starrocks-root-pass

starrocksFESpec:
replicas: 3
service:
type: LoadBalancer
resources:
requests:
cpu: 1
memory: 1Gi
storageSpec:
name: fe

starrocksBeSpec:
replicas: 3
resources:
requests:
cpu: 1
memory: 2Gi
storageSpec:
name: be
storageSize: 15Gi

starrocksFeProxySpec:
enabled: true
service:
type: LoadBalancer

设置 StarRocks root 数据库用户密码

为了从 Kubernetes 集群外部导入数据,需要向外部暴露 StarRocks 数据库。您需要为 StarRocks 数据库用户 root 设置密码。Operator 会将密码应用到 FE 和 BE 节点。

kubectl create secret generic starrocks-root-pass --from-literal=password='g()()dpa$$word'
secret/starrocks-root-pass created

部署 Operator 及 StarRocks 集群

helm install -f my-values.yaml starrocks starrocks/kube-starrocks
NAME: starrocks
LAST DEPLOYED: Wed Jun 26 20:25:09 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing kube-starrocks-1.9.7 kube-starrocks chart.
It will install both operator and starrocks cluster, please wait for a few minutes for the cluster to be ready.

Please see the values.yaml for more operation information: https://github.com/StarRocks/starrocks-kubernetes-operator/blob/main/helm-charts/charts/kube-starrocks/values.yaml

检查 StarRocks 集群的状态

您可以使用以下命令检查进度:

kubectl --namespace default get starrockscluster -l "cluster=kube-starrocks"
NAME             PHASE         FESTATUS      BESTATUS      CNSTATUS   FEPROXYSTATUS
kube-starrocks reconciling reconciling reconciling reconciling
kubectl get pods
备注

kube-starrocks-initpwd pod 会在连接 FE 和 BE pod 设置 StarRocks root 密码时打印 errorCrashLoopBackOff 状态。您可以忽略这些错误,并等待此 pod 的状态变为 Completed

NAME                                       READY   STATUS             RESTARTS      AGE
kube-starrocks-be-0 0/1 Running 0 20s
kube-starrocks-be-1 0/1 Running 0 20s
kube-starrocks-be-2 0/1 Running 0 20s
kube-starrocks-fe-0 1/1 Running 0 66s
kube-starrocks-fe-1 0/1 Running 0 65s
kube-starrocks-fe-2 0/1 Running 0 66s
kube-starrocks-fe-proxy-56f8998799-d4qmt 1/1 Running 0 20s
kube-starrocks-initpwd-m84br 0/1 CrashLoopBackOff 3 (50s ago) 92s
kube-starrocks-operator-54ffcf8c5c-xsjc8 1/1 Running 0 92s
kubectl get pvc
NAME                          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
be-data-kube-starrocks-be-0 Bound pvc-4ae0c9d8-7f9a-4147-ad74-b22569165448 15Gi RWO standard-rwo <unset> 82s
be-data-kube-starrocks-be-1 Bound pvc-28b4dbd1-0c8f-4b06-87e8-edec616cabbc 15Gi RWO standard-rwo <unset> 82s
be-data-kube-starrocks-be-2 Bound pvc-c7232ea6-d3d9-42f1-bfc1-024205a17656 15Gi RWO standard-rwo <unset> 82s
be-log-kube-starrocks-be-0 Bound pvc-6193c43d-c74f-4d12-afcc-c41ace3d5408 1Gi RWO standard-rwo <unset> 82s
be-log-kube-starrocks-be-1 Bound pvc-c01f124a-014a-439a-99a6-6afe95215bf0 1Gi RWO standard-rwo <unset> 82s
be-log-kube-starrocks-be-2 Bound pvc-136df15f-4d2e-43bc-a1c0-17227ce3fe6b 1Gi RWO standard-rwo <unset> 82s
fe-log-kube-starrocks-fe-0 Bound pvc-7eac524e-d286-4760-b21c-d9b6261d976f 5Gi RWO standard-rwo <unset> 2m23s
fe-log-kube-starrocks-fe-1 Bound pvc-38076b78-71e8-4659-b8e7-6751bec663f6 5Gi RWO standard-rwo <unset> 2m23s
fe-log-kube-starrocks-fe-2 Bound pvc-4ccfee60-02b7-40ba-a22e-861ea29dac74 5Gi RWO standard-rwo <unset> 2m23s
fe-meta-kube-starrocks-fe-0 Bound pvc-5130c9ff-b797-4f79-a1d2-4214af860d70 10Gi RWO standard-rwo <unset> 2m23s
fe-meta-kube-starrocks-fe-1 Bound pvc-13545330-63be-42cf-b1ca-3ed6f96a8c98 10Gi RWO standard-rwo <unset> 2m23s
fe-meta-kube-starrocks-fe-2 Bound pvc-609cadd4-c7b7-4cf9-84b0-a75678bb3c4d 10Gi RWO standard-rwo <unset> 2m23s

确认集群健康

提示

此处命令与上一小节部分相同,但返回了集群正常运转时的预期状态。

kubectl --namespace default get starrockscluster -l "cluster=kube-starrocks"
NAME             PHASE     FESTATUS   BESTATUS   CNSTATUS   FEPROXYSTATUS
kube-starrocks running running running running
kubectl get pods
提示

当除 kube-starrocks-initpwd 外的所有 pod 在 READY 列显示 1/1 时,表示系统已准备完成。kube-starrocks-initpwd pod 应显示 0/1,其 STATUSCompleted

NAME                                       READY   STATUS      RESTARTS   AGE
kube-starrocks-be-0 1/1 Running 0 57s
kube-starrocks-be-1 1/1 Running 0 57s
kube-starrocks-be-2 1/1 Running 0 57s
kube-starrocks-fe-0 1/1 Running 0 103s
kube-starrocks-fe-1 1/1 Running 0 102s
kube-starrocks-fe-2 1/1 Running 0 103s
kube-starrocks-fe-proxy-56f8998799-d4qmt 1/1 Running 0 57s
kube-starrocks-initpwd-m84br 0/1 Completed 4 2m9s
kube-starrocks-operator-54ffcf8c5c-xsjc8 1/1 Running 0 2m9s

高亮显示的行中的 EXTERNAL-IP 地址将用于从 Kubernetes 集群外部访问 SQL 客户端和 Stream Load。

kubectl get services
NAME                              TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                                       AGE
kube-starrocks-be-search ClusterIP None <none> 9050/TCP 78s
kube-starrocks-be-service ClusterIP 34.118.228.231 <none> 9060/TCP,8040/TCP,9050/TCP,8060/TCP 78s
kube-starrocks-fe-proxy-service LoadBalancer 34.118.230.176 34.176.12.205 8080:30241/TCP 78s
kube-starrocks-fe-search ClusterIP None <none> 9030/TCP 2m4s
kube-starrocks-fe-service LoadBalancer 34.118.226.82 34.176.215.97 8030:30620/TCP,9020:32461/TCP,9030:32749/TCP,9010:30911/TCP 2m4s
kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 8h
提示

将高亮行中的 EXTERNAL-IP 地址存储在环境变量中,以便随时使用:

export MYSQL_IP=`kubectl get services kube-starrocks-fe-service --output jsonpath='{.status.loadBalancer.ingress[0].ip}'`
export FE_PROXY=`kubectl get services kube-starrocks-fe-proxy-service --output jsonpath='{.status.loadBalancer.ingress[0].ip}'`:8080

使用 SQL 客户端连接到 StarRocks

提示

如果您使用的客户端不是 mysql CLI,请现在打开它。

此命令将在 Kubernetes pod 中运行 mysql 命令:

kubectl exec --stdin --tty kube-starrocks-fe-0 -- \
mysql -P9030 -h127.0.0.1 -u root --prompt="StarRocks > "

如果您在本地安装了 mysql CLI,则可以直接使用:

mysql -P9030 -h $MYSQL_IP -u root --prompt="StarRocks > " -p

建表

mysql -P9030 -h $MYSQL_IP -u root --prompt="StarRocks > " -p

创建数据库

执行以下语句创建数据库 quickstart,并切换到该数据库下。

CREATE DATABASE IF NOT EXISTS quickstart;

USE quickstart;

建表

crashdata 表

创建 crashdata 表,用于存储交通事故数据集中的数据。该表的字段经过裁剪,仅包含与该教程相关字段。

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
);

weatherdata 表

创建 weatherdata 表,用于存储天气数据集中的数据。该表的字段同样经过裁剪,仅包含与该教程相关字段。

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
);

退出 MySQL 客户端,或打开一个新 shell,在其中运行命令上传数据。

exit

上传数据

有很多方法可以将数据导入到 StarRocks。本教程中最简单的方法是使用 curl 和 StarRocks Stream Load。

上传您之前下载的两个数据集。

提示

您需要开启一个新 shell,因为 curl 命令需要在操作系统提示符中运行,而非 mysql 客户端。命令中引用了您下载的数据集,因此您请从下载文件的目录中运行它们。

由于这是一个新的 shell,请再次运行 export 命令:


export MYSQL_IP=`kubectl get services kube-starrocks-fe-service --output jsonpath='{.status.loadBalancer.ingress[0].ip}'`

export FE_PROXY=`kubectl get services kube-starrocks-fe-proxy-service --output jsonpath='{.status.loadBalancer.ingress[0].ip}'`:8080

系统会提示您输入密码。使用您添加到 Kubernetes secret starrocks-root-pass 的密码。如果您使用了预先提供的命令,密码是 g()()dpa$$word

尽管 curl 命令看起来很复杂,但此教程的最后部分提供了详细解释。当前,建议您直接运行这些命令导入数据并运行 SQL 分析数据,然后在教程末尾了解数据导入细节。

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://$FE_PROXY/api/quickstart/crashdata/_stream_load
Enter host password for user 'root':
{
"TxnId": 2,
"Label": "crashdata-0",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 423726,
"NumberLoadedRows": 423725,
"NumberFilteredRows": 1,
"NumberUnselectedRows": 0,
"LoadBytes": 96227746,
"LoadTimeMs": 2483,
"BeginTxnTimeMs": 42,
"StreamLoadPlanTimeMs": 122,
"ReadDataTimeMs": 1610,
"WriteDataTimeMs": 2253,
"CommitAndPublishTimeMs": 65,
"ErrorURL": "http://kube-starrocks-be-2.kube-starrocks-be-search.default.svc.cluster.local:8040/api/_load_error_log?file=error_log_5149e6f80de42bcb_eab2ea77276de4ba"
}
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://$FE_PROXY/api/quickstart/weatherdata/_stream_load
Enter host password for user 'root':
{
"TxnId": 4,
"Label": "weather-0",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 22931,
"NumberLoadedRows": 22931,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 15558550,
"LoadTimeMs": 404,
"BeginTxnTimeMs": 1,
"StreamLoadPlanTimeMs": 7,
"ReadDataTimeMs": 157,
"WriteDataTimeMs": 372,
"CommitAndPublishTimeMs": 23
}

使用 MySQL 客户端连接

如果您尚未连接,请使用 MySQL 客户端连接。请使用 kube-starrocks-fe-service 服务的外部 IP 地址和您在 Kubernetes secret starrocks-root-pass 中配置的密码。

mysql -P9030 -h $MYSQL_IP -u root --prompt="StarRocks > " -p

分析数据

在 SQL 客户端中运行以下查询。

查询一:纽约市每小时交通事故数量

SELECT COUNT(*),
date_trunc("hour", crashdata.CRASH_DATE) AS Time
FROM crashdata
GROUP BY Time
ORDER BY Time ASC
LIMIT 200;

以下截取了部分输出数据:

|       14 | 2014-01-06 06:00:00 |
| 16 | 2014-01-06 07:00:00 |
| 43 | 2014-01-06 08:00:00 |
| 44 | 2014-01-06 09:00:00 |
| 21 | 2014-01-06 10:00:00 |
| 28 | 2014-01-06 11:00:00 |
| 34 | 2014-01-06 12:00:00 |
| 31 | 2014-01-06 13:00:00 |
| 35 | 2014-01-06 14:00:00 |
| 36 | 2014-01-06 15:00:00 |
| 33 | 2014-01-06 16:00:00 |
| 40 | 2014-01-06 17:00:00 |
| 35 | 2014-01-06 18:00:00 |
| 23 | 2014-01-06 19:00:00 |
| 16 | 2014-01-06 20:00:00 |
| 12 | 2014-01-06 21:00:00 |
| 17 | 2014-01-06 22:00:00 |
| 14 | 2014-01-06 23:00:00 |
| 10 | 2014-01-07 00:00:00 |
| 4 | 2014-01-07 01:00:00 |
| 1 | 2014-01-07 02:00:00 |
| 3 | 2014-01-07 03:00:00 |
| 2 | 2014-01-07 04:00:00 |
| 6 | 2014-01-07 06:00:00 |
| 16 | 2014-01-07 07:00:00 |
| 41 | 2014-01-07 08:00:00 |
| 37 | 2014-01-07 09:00:00 |
| 33 | 2014-01-07 10:00:00 |

从结果可以看出,1 月 6 日和 7 日(正常工作日的周一和周二)的早高峰(08:00 至 10:00)每小时约有 40 起事故,较其他时间时间段事故数量明显更多。除此之外,晚高峰(17:00 左右)的事故数量也接近这个数字。

查询二:纽约市的平均气温

SELECT avg(HourlyDryBulbTemperature),
date_trunc("hour", weatherdata.DATE) AS Time
FROM weatherdata
GROUP BY Time
ORDER BY Time ASC
LIMIT 100;

以下截取了部分输出数据:

+-------------------------------+---------------------+
| avg(HourlyDryBulbTemperature) | Time |
+-------------------------------+---------------------+
| 25 | 2014-01-01 00:00:00 |
| 25 | 2014-01-01 01:00:00 |
| 24 | 2014-01-01 02:00:00 |
| 24 | 2014-01-01 03:00:00 |
| 24 | 2014-01-01 04:00:00 |
| 24 | 2014-01-01 05:00:00 |
| 25 | 2014-01-01 06:00:00 |
| 26 | 2014-01-01 07:00:00 |

查询三:能见度情况对驾驶安全的影响

为了解能见度情况对驾驶安全的影响,需要对两张表格的 DATETIME 列进行 JOIN,分析在能见度不佳的情况下(0 到 1.0 英里之间)时的交通事故数量。

SELECT COUNT(DISTINCT c.COLLISION_ID) AS Crashes,
truncate(avg(w.HourlyDryBulbTemperature), 1) AS Temp_F,
truncate(avg(w.HourlyVisibility), 2) AS Visibility,
max(w.HourlyPrecipitation) AS Precipitation,
date_format((date_trunc("hour", c.CRASH_DATE)), '%d %b %Y %H:%i') AS Hour
FROM crashdata c
LEFT JOIN weatherdata w
ON date_trunc("hour", c.CRASH_DATE)=date_trunc("hour", w.DATE)
WHERE w.HourlyVisibility BETWEEN 0.0 AND 1.0
GROUP BY Hour
ORDER BY Crashes DESC
LIMIT 100;

以下截取了部分输出数据:

+---------+--------+------------+---------------+-------------------+
| Crashes | Temp_F | Visibility | Precipitation | Hour |
+---------+--------+------------+---------------+-------------------+
| 129 | 32 | 0.25 | 0.12 | 03 Feb 2014 08:00 |
| 114 | 32 | 0.25 | 0.12 | 03 Feb 2014 09:00 |
| 104 | 23 | 0.33 | 0.03 | 09 Jan 2015 08:00 |
| 96 | 26.3 | 0.33 | 0.07 | 01 Mar 2015 14:00 |
| 95 | 26 | 0.37 | 0.12 | 01 Mar 2015 15:00 |
| 93 | 35 | 0.75 | 0.09 | 18 Jan 2015 09:00 |
| 92 | 31 | 0.25 | 0.12 | 03 Feb 2014 10:00 |
| 87 | 26.8 | 0.5 | 0.09 | 01 Mar 2015 16:00 |
| 85 | 55 | 0.75 | 0.20 | 23 Dec 2015 17:00 |
| 85 | 20 | 0.62 | 0.01 | 06 Jan 2015 11:00 |
| 83 | 19.6 | 0.41 | 0.04 | 05 Mar 2015 13:00 |
| 80 | 20 | 0.37 | 0.02 | 06 Jan 2015 10:00 |
| 76 | 26.5 | 0.25 | 0.06 | 05 Mar 2015 09:00 |
| 71 | 26 | 0.25 | 0.09 | 05 Mar 2015 10:00 |
| 71 | 24.2 | 0.25 | 0.04 | 05 Mar 2015 11:00 |

从以上结果可以得出,在能见度较低的一小时内的最高交通事故数量是 129。

当然,除了能见度因素外,还有其他因素需要考虑在内:

  • 2014 年 2 月 3 日是星期一(工作日)
  • 上午 8 点是早高峰时段
  • 当时正在下雨(一小时内降水量为 0.12 英寸)
  • 温度为 32 华氏度(水的冰点)

查询四:结冰情况对驾驶安全的影响

由于路面上水大约会在 40 华氏度时开始转变为冰,因此以下查询分析了温度区间为 0 到 40 华氏度的交通事故数量。

SELECT COUNT(DISTINCT c.COLLISION_ID) AS Crashes,
truncate(avg(w.HourlyDryBulbTemperature), 1) AS Temp_F,
truncate(avg(w.HourlyVisibility), 2) AS Visibility,
max(w.HourlyPrecipitation) AS Precipitation,
date_format((date_trunc("hour", c.CRASH_DATE)), '%d %b %Y %H:%i') AS Hour
FROM crashdata c
LEFT JOIN weatherdata w
ON date_trunc("hour", c.CRASH_DATE)=date_trunc("hour", w.DATE)
WHERE w.HourlyDryBulbTemperature BETWEEN 0.0 AND 40.5
GROUP BY Hour
ORDER BY Crashes DESC
LIMIT 100;

以下截取了部分输出数据:

+---------+--------+------------+---------------+-------------------+
| Crashes | Temp_F | Visibility | Precipitation | Hour |
+---------+--------+------------+---------------+-------------------+
| 192 | 34 | 1.5 | 0.09 | 18 Jan 2015 08:00 |
| 170 | 21 | NULL | | 21 Jan 2014 10:00 |
| 145 | 19 | NULL | | 21 Jan 2014 11:00 |
| 138 | 33.5 | 5 | 0.02 | 18 Jan 2015 07:00 |
| 137 | 21 | NULL | | 21 Jan 2014 09:00 |
| 129 | 32 | 0.25 | 0.12 | 03 Feb 2014 08:00 |
| 114 | 32 | 0.25 | 0.12 | 03 Feb 2014 09:00 |
| 104 | 23 | 0.7 | 0.04 | 09 Jan 2015 08:00 |
| 98 | 16 | 8 | 0.00 | 06 Mar 2015 08:00 |
| 96 | 26.3 | 0.33 | 0.07 | 01 Mar 2015 14:00 |

结果显示,2015 年 1 月 18 日发生了大量交通事故。虽然当天是星期天早晨,但根据 weather.com 显示,当天下了一场大雪,导致许多交通事故。

exit

清理

如果您完成了并希望删除 StarRocks 集群和 StarRocks Operator,请运行此命令。

helm delete starrocks

总结

在本教程中,您:

  • 使用 Helm 和 StarRocks Operator 部署了 StarRocks
  • 导入了纽约市提供的交通事故数据和 NOAA 提供的天气数据
  • 使用 SQL JOIN 分析数据,数据显示在能见度低或街道结冰时驾车有更高几率导致车祸

更多学习内容;此教程有意略过了 Stream Load 过程中进行的数据转换。关于这些的详细信息在包含下文的 curl 命令注释中。


curl 命令注释

StarRocks 的 Stream Load 导入方式需要使用 curl 命令,涉及许多参数。以下仅列出此教程中需要使用的参数,其余参数请参考更多信息部分。

--location-trusted

此参数用于允许 curl 将认证凭据传输给任何重定向的 URL。

-u root

用于登录 StarRocks 的用户名。

-T filename

T 代表传输(Transfer),用于指定需要传输的文件名。

label:name-num

与此 Stream Load 作业关联的标签。标签必须唯一,因此如果多次运行作业,您可以添加一个数字保持递增。

column_separator:,

如果导入的文件使用单个 , 作为列分隔符,则设置如上所示。如果使用其他分隔符,则在此处设置该分隔符。常见分隔符包括 \t,|

skip_header:1

某些 CSV 文件会在首行(Header)记录所有的列名,还有些会在第二行记录所有列的数据类型信息。如果 CSV 文件有一或两个 Header 行,需要将 skip_header 设置为 12。如果您使用的 CSV 没有 Header 行,请将其设置为 0

enclose:\"

如果某些字段包含带有逗号的字符串,则需要用双引号括起该字段。本教程使用的示例数据集中,地理位置信息包含逗号,因此需将 enclose 设置为 \",其中 \ 用于转义 "

max_filter_ratio:1

导入数据中允许出现错误行的比例。理想情况下,应将其设置为 0,即当导入的数据中有任意一行出现错误时,导入作业会失败。本教程中需要将其设置为 1,即在调试过程中,允许所有数据行出现错误。

columns:

此参数用于将 CSV 文件中的列映射到 StarRocks 表中的列。当前教程中使用的 CSV 文件中有大量的列,而 StarRocks 表中的列经过裁剪,仅保留部分列。未包含在表中的列在导入过程中都将被跳过。

本教程中的 columns: 参数中还包含数据转换逻辑。在 CSV 文件中经常会有不符合标准的日期和时间。以下是将日期和时间数据转换为 DATETIME 类型的逻辑:

数据转换

如下所示,数据集中的日期以 MM/DD/YYYY 为格式,时间以 HH:MI 为格式。

08/05/2014,9:10,BRONX,10469,40.8733019,-73.8536375,"(40.8733019, -73.8536375)",

由于 StarRocks 中的 DATETIME 格式为 YYYY-MM-DD HH:MI:SS,因此需要转换数据集中的数据,将两列数据合并,并以空格分隔。则此处 columns: 参数应为:

-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')

通过设置以上参数可实现以下目标:

  1. 将 CSV 文件的第一列内容分配给 tmp_CRASH_DATE 列;
  2. 将 CSV 文件的第二列内容分配给 tmp_CRASH_TIME 列;
  3. 通过 concat_ws() 函数,使用空格将 tmp_CRASH_DATE 列和 tmp_CRASH_TIME 列连接在一起;
  4. 通过 str_to_date() 函数使用连接后的字符串生成 DATETIME 数据;
  5. 将生成的 DATETIME 数据存储在列 CRASH_DATE 中。

更多信息

默认 values.yaml

Stream Load

Motor Vehicle Collisions - Crashes 数据集由纽约市提供,受其 使用条款隐私政策 约束。

Local Climatological Data(LCD) 由 NOAA 提供,并附其 免责声明 和此 隐私政策

Helm 是 Kubernetes 的包管理器。Helm Chart 是一个 Helm 包,包含在 Kubernetes 集群上运行应用程序所需的所有资源定义。

starrocks-kubernetes-operatorkube-starrocks Helm Chart