StarRocks 与 Helm
目标
本快速入门的目标是
- 使用 Helm 部署 StarRocks Kubernetes Operator 和 StarRocks 集群
- 为 StarRocks 数据库用户
root
配置密码 - 提供具有三个 FE 和三个 BE 的高可用性
- 将元数据存储在持久存储中
- 将数据存储在持久存储中
- 允许 MySQL 客户端从 Kubernetes 集群外部连接
- 允许使用 Stream Load 从 Kubernetes 集群外部加载数据
- 加载一些公共数据集
- 查询数据
数据集和查询与基本快速入门中使用的相同。这里的主要区别在于使用 Helm 和 StarRocks Operator 进行部署。
使用的数据由 NYC OpenData 和 National Centers for Environmental Information 提供。
这两个数据集都很大,并且由于本教程旨在帮助您了解如何使用 StarRocks,因此我们不会加载过去 120 年的数据。您可以在基于三个 e2-standard-4 机器(或类似机器)构建的 GKE Kubernetes 集群上运行此程序,并配备 80GB 磁盘。对于更大的部署,我们有其他文档,稍后将提供。
本文档包含大量信息,并且以逐步的方式呈现内容,首先是开头,然后是结尾的技术细节。这样做是为了按此顺序实现以下目的
- 使用 Helm 部署系统。
- 允许读者在 StarRocks 中加载数据并分析该数据。
- 解释加载期间的数据转换的基础知识。
前提条件
Kubernetes 环境
编写本指南时使用的 Kubernetes 环境包含三个节点,每个节点有四个 vCPU 和 16GB RAM(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 集群。
SQL 客户端
您可以使用 Kubernetes 环境中提供的 SQL 客户端,也可以使用系统上的客户端。本指南使用 mysql CLI
。许多 MySQL 兼容客户端都可以使用。
curl
curl
用于向 StarRocks 发出数据加载作业,以及下载数据集。通过在操作系统提示符下运行 curl
或 curl.exe
来检查是否已安装。如果未安装 curl,请在此处获取 curl。
术语
FE
前端节点负责元数据管理、客户端连接管理、查询规划和查询调度。每个 FE 在其内存中存储和维护元数据的完整副本,这保证了 FE 之间的无差别服务。
BE
后端节点负责数据存储和执行查询计划。
添加 StarRocks Helm chart 仓库
Helm Chart 包含 StarRocks Operator 和自定义资源 StarRocksCluster 的定义。
-
添加 Helm Chart 仓库。
helm repo add starrocks https://starrocks.github.io/starrocks-kubernetes-operator
-
将 Helm Chart 仓库更新到最新版本。
helm repo update
-
查看您添加的 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 文件
本快速入门的目标是
- 为 StarRocks 数据库用户
root
配置密码 - 提供具有三个 FE 和三个 BE 的高可用性
- 将元数据存储在持久存储中
- 将数据存储在持久存储中
- 允许 MySQL 客户端从 Kubernetes 集群外部连接
- 允许使用 Stream Load 从 Kubernetes 集群外部加载数据
Helm chart 提供了满足所有这些目标的选项,但默认情况下未配置它们。本节的其余部分介绍了满足所有这些目标所需的配置。将提供完整的 values 规范,但首先阅读六个部分的每个部分的详细信息,然后复制完整的规范。
1. 数据库用户密码
这段 YAML 指示 StarRocks operator 将数据库用户 root
的密码设置为 Kubernetes secret starrocks-root-pass
的 password
键的值。
starrocks:
initPassword:
enabled: true
# Set a password secret, for example:
# 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.replicas
设置为 3,并将 starrocks.starrockBeSpec.replicas
设置为 3,您将拥有足够多的 FE 和 BE 以实现高可用性。将 CPU 和内存请求设置得较低,可以使 pod 在小型 Kubernetes 环境中创建。
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 客户端的 LoadBalancer
默认情况下,对 FE 服务的访问通过集群 IP 进行。为了允许外部访问,service.type
设置为 LoadBalancer
starrocks:
starrocksFESpec:
service:
type: LoadBalancer
6. 外部数据加载的 LoadBalancer
Stream Load 需要对 FE 和 BE 的外部访问。请求将发送到 FE,然后 FE 分配一个 BE 来处理上传。为了允许将 curl
命令重定向到 BE,需要启用 starroclFeProxySpec
并将其类型设置为 LoadBalancer
。
starrocks:
starrocksFeProxySpec:
enabled: true
service:
type: LoadBalancer
完整的 values 文件
上面组合的代码段提供了完整的 values 文件。将其保存到 my-values.yaml
starrocks:
initPassword:
enabled: true
# Set a password secret, for example:
# 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 密码时,将经历 error
和 CrashLoopBackOff
状态。您应该忽略这些错误并等待此 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
和 STATUS
为 Completed
。
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,则可以使用它代替 Kubernetes 集群中的 CLI
mysql -P9030 -h $MYSQL_IP -u root --prompt="StarRocks > " -p
创建一些表
mysql -P9030 -h $MYSQL_IP -u root --prompt="StarRocks > " -p
创建数据库
在 StarRocks >
提示符下键入这两行,然后在每行后按 Enter
CREATE DATABASE IF NOT EXISTS quickstart;
USE quickstart;
创建两个表
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
与崩溃数据类似,天气数据集有更多的列(总共 125 列),只有预计回答问题的列包含在数据库中。
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。
上传您之前下载的两个数据集。
由于这些 curl 命令在操作系统提示符下运行,而不是在 mysql
客户端中运行,因此请打开一个新的 shell。这些命令引用您下载的数据集,因此请从您下载文件的目录运行它们。
由于这是一个新的 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 客户端中运行。所有查询都使用 quickstart
数据库。
USE quickstart;
纽约市每小时发生多少起车祸?
SELECT COUNT(*),
date_trunc("hour", crashdata.CRASH_DATE) AS Time
FROM crashdata
GROUP BY Time
ORDER BY Time ASC
LIMIT 200;
这是部分输出。请注意,我正在更仔细地查看 1 月 6 日和 7 日,因为这是非节假日周的星期一和星期二。查看元旦可能无法表明早高峰时段的正常情况。
| 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 |
在周一或周二早高峰时段,大约有 40 起事故,17:00 时段也大约有 40 起事故。
纽约市的平均气温是多少?
SELECT avg(HourlyDryBulbTemperature),
date_trunc("hour", weatherdata.DATE) AS Time
FROM weatherdata
GROUP BY Time
ORDER BY Time ASC
LIMIT 100;
输出
请注意,这是 2014 年的数据,纽约市最近没有这么冷。
+-------------------------------+---------------------+
| 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 |
在纽约市,能见度低时开车安全吗?
让我们看一下能见度较差(0 到 1.0 英里之间)时的崩溃次数。要回答这个问题,请使用 DATETIME 列在两个表上进行 JOIN。
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;
在低能见度的单个小时内,最高的崩溃次数为 129。有多个事项需要考虑
- 2014 年 2 月 3 日是星期一
- 上午 8 点是早高峰
- 当时正在下雨(每小时 0.12 英寸或降水)
- 温度为 32 华氏度(水的冰点)
- 能见度在 0.25 英里处较差,纽约市的正常能见度为 10 英里
+---------+--------+------------+---------------+-------------------+
| 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 |
在冰冷条件下驾驶怎么样?
水蒸气可以在 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;
冰点温度的结果让我有点惊讶,我没想到在寒冷的 1 月份的星期天早上,城市里会有太多的交通。快速浏览 weather.com 显示,当天发生了一场大风暴,导致许多车祸,就像数据中看到的那样。
+---------+--------+------------+---------------+-------------------+
| 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 |
小心驾驶!
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 代表传输,要传输的文件名。
label:name-num
与此 Stream Load 作业关联的标签。标签必须是唯一的,因此如果您多次运行作业,则可以添加一个数字并不断递增它。
column_separator:,
如果您加载的文件使用单个 ,
,则如上所示设置它,如果您使用不同的分隔符,则在此处设置该分隔符。常见的选择是 \t
、,
和 |
。
skip_header:1
一些 CSV 文件具有一个包含所有列名列表的单个标题行,一些添加了带有数据类型的第二行。如果您有一行或两行标题行,则将 skip_header 设置为 1
或 2
,如果没有标题行,则将其设置为 0
。
enclose:\"
通常用双引号括起包含嵌入逗号的字符串。本教程中使用的示例数据集具有包含逗号的地理位置,因此 enclose 设置为 \"
。请记住使用 \
转义 "
。
max_filter_ratio:1
这允许数据中存在一些错误。理想情况下,应将其设置为 0
,并且作业会在出现任何错误时失败。将其设置为 1
以允许所有行在调试期间失败。
columns:
CSV 文件列到 StarRocks 表列的映射。您会注意到 CSV 文件中的列比表中的列多得多。将跳过未包含在表中的任何列。
您还会注意到,对于崩溃数据集,columns:
行中包含一些数据转换。在 CSV 文件中查找不符合标准的日期和时间非常常见。这是用于将崩溃的时间和日期的 CSV 数据转换为 DATETIME 类型的逻辑
列行
这是一个数据记录的开头。日期格式为 MM/DD/YYYY
,时间为 HH:MI
。由于 DATETIME 通常为 YYYY-MM-DD HH:MI:SS
,因此我们需要转换此数据。
08/05/2014,9:10,BRONX,10469,40.8733019,-73.8536375,"(40.8733019, -73.8536375)",
这是 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')
这指示 StarRocks
- 将 CSV 文件的第一列的内容分配给
tmp_CRASH_DATE
- 将 CSV 文件的第二列的内容分配给
tmp_CRASH_TIME
concat_ws()
将tmp_CRASH_DATE
和tmp_CRASH_TIME
连接在一起,并在它们之间留一个空格str_to_date()
从连接的字符串创建一个 DATETIME- 将生成的 DATETIME 存储在
CRASH_DATE
列中
更多信息
默认 values.yaml
机动车碰撞 - 碰撞数据集由纽约市提供,但须遵守以下使用条款和隐私政策。
本地气候数据 (LCD) 由 NOAA 提供,并附带此免责声明和此隐私政策。
Helm 是 Kubernetes 的包管理器。Helm Chart 是 Helm 包,包含在 Kubernetes 集群上运行应用程序所需的所有资源定义。