StarRocks with Helm
目標
このクイックスタートの目標は次のとおりです:
- StarRocks Kubernetes Operator と Helm を使用して StarRocks クラスターをデプロイする
 - StarRocks データベースユーザー 
rootのパスワードを設定する - 3 つの FE と 3 つの BE で高可用性を提供する
 - メタデータを永続ストレージに保存する
 - データを永続ストレージに保存する
 - MySQL クライアントが Kubernetes クラスターの外部から接続できるようにする
 - Kubernetes クラスターの外部から Stream Load を使用してデータをロードできるようにする
 - 一部の公開データセットをロードする
 - データをクエリする
 
データセットとクエリは、Basic Quick Start で使用されるものと同じです。ここでの主な違いは、Helm と StarRocks Operator を使用してデプロイすることです。
使用されるデータは、NYC OpenData と National Centers for Environmental Information によって提供されています。
これらのデータセットは大規模であり、このチュートリアルは StarRocks を使用することに慣れるためのものなので、過去 120 年分のデータをロードすることはしません。3 台の e2-standard-4 マシン(または同等のもの)で構築された GKE Kubernetes クラスターでこれを実行できます。より大規模なデプロイメントについては、他のドキュメントを用意しており、後で提供します。
このドキュメントには多くの情報が含まれており、最初にステップバイステップの内容が提示され、最後に技術的な詳細が示されています。これは次の目的を達成するためにこの順序で行われます:
- Helm を使用してシステムをデプロイする。
 - 読者が StarRocks にデータをロードし、そのデータを分析できるようにする。
 - ロード中のデータ変換の基本を説明する。
 
前提条件
Kubernetes 環境
このガイドを作成する際に使用した Kubernetes 環境は、各ノードが 4 つの vCPU と 16GB の RAM を持つ 3 つのノードで構成されています(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 にデータロードジョブを発行し、データセットをダウンロードするために使用されます。OS のプロンプトで curl または curl.exe を実行してインストールされているか確認してください。curl がインストールされていない場合は、こちらから curl を取得してください.
用語
FE
フロントエンドノードは、メタデータ管理、クライアント接続管理、クエリプランニング、クエリスケジューリングを担当します。各 FE はメモリ内にメタデータの完全なコピーを保存および維持し、FEs 間での無差別なサービスを保証します。
BE
バックエンドノードは、データストレージとクエリプランの実行の両方を担当します。
StarRocks Helm チャートリポジトリを追加する
Helm チャートには、StarRocks Operator とカスタムリソース StarRocksCluster の定義が含まれています。
- 
Helm チャートリポジトリを追加します。
helm repo add starrocks https://starrocks.github.io/starrocks-kubernetes-operator - 
Helm チャートリポジトリを最新バージョンに更新します。
helm repo update - 
追加した Helm チャートリポジトリを表示します。
helm search repo starrocksNAME 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... 
データをダウンロードする
これらの 2 つのデータセットをマシンにダウンロードします。
ニューヨーク市のクラッシュデータ
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 の値ファイルを作成する
このクイックスタートの目標は次のとおりです:
- StarRocks データベースユーザー 
rootのパスワードを設定する - 3 つの FE と 3 つの BE で高可用性を提供する
 - メタデータを永続ストレージに保存する
 - データを永続ストレージに保存する
 - MySQL クライアントが Kubernetes クラスターの外部から接続できるようにする
 - Kubernetes クラスターの外部から Stream Load を使用してデータをロードできるようにする
 
Helm チャートはこれらの目標を満たすオプションを提供しますが、デフォルトでは設定されていません。このセクションの残りの部分では、これらの目標をすべて満たすために必要な設定を説明します。完全な値の仕様が提供されますが、最初に 6 つのセクションの詳細を読み、次に完全な仕様をコピーしてください。
1. データベースユーザーのパスワード
この YAML の一部は、StarRocks オペレーターに対して、データベースユーザー 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 とメモリのリクエストを低く設定することで、小さな 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 に設定することで、これらの PV が FE 0 のために作成されます:
fe-meta-kube-starrocks-fe-0fe-log-kube-starrocks-fe-0
starrocks:
    starrocksFESpec:
        storageSpec:
            name: fe
4. データを永続ストレージに保存する
starrocks.starrocksBeSpec.storageSpec.name に "" 以外の値を設定すると、次のことが発生します:
- 永続ストレージが使用される
 - サービスのすべてのストレージボリュームのプレフィックスとして 
starrocks.starrocksBeSpec.storageSpec.nameの値が使用される 
値を be に設定することで、これらの PV が BE 0 のために作成されます:
be-data-kube-starrocks-be-0be-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
完全な値ファイル
上記のスニペットを組み合わせると、完全な値ファイルが提供されます。これを 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 ルートデータベースユーザーパスワードを設定する
Kubernetes クラスターの外部からデータをロードするために、StarRocks データベースを外部に公開します。StarRocks データベースユーザー root のパスワードを設定する必要があります。オペレーターは FE と BE ノードにパスワードを適用します。
kubectl create secret generic starrocks-root-pass --from-literal=password='g()()dpa$$word'
secret/starrocks-root-pass created
オペレーターと 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 ポッドは、StarRocks ルートパスワードを設定するために FE および BE ポッドに接続しようとする際に、error および CrashLoopBackOff 状態を経ることがあります。これらのエラーは無視し、このポッドのステータスが 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 を除いて READY 列に 1/1 を表示したときにシステムは準備完了です。kube-starrocks-initpwd ポッドは 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 ポッドで mysql コマンドを実行します:
kubectl exec --stdin --tty kube-starrocks-fe-0 -- \
  mysql -P9030 -h127.0.0.1 -u root --prompt="StarRocks > "
mysql CLI がローカルにインストールされている場合は、Kubernetes クラスター内のものではなくそれを使用できます:
mysql -P9030 -h $MYSQL_IP -u root --prompt="StarRocks > " -p
テーブルを作成する
mysql -P9030 -h $MYSQL_IP -u root --prompt="StarRocks > " -p
データベースの作成
StarRocks >  プロンプトで次の2行を入力し、それぞれの後にエンターキーを押します。
CREATE DATABASE IF NOT EXISTS quickstart;
USE quickstart;
2つのテーブルを作成
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 クライアントから退出するか、コマンドラインでコマンドを実行するために新しいシェルを開いてデータをアップロードします。
exit
データをアップロードする
StarRocks にデータをロードする方法は多数あります。このチュートリアルでは、最も簡単な方法として curl と StarRocks Stream Load を使用します。
前にダウンロードした 2 つのデータセットをアップロードします。
これらの curl コマンドはオペレーティングシステムのプロンプトで実行されるため、新しいシェルを開いてください。mysql クライアントではありません。コマンドはダウンロードしたデータセットを参照するため、ファイルをダウンロードしたディレクトリから実行してください。
これは新しいシェルなので、エクスポートコマンドを再度実行します:
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;
NYCでの1時間あたりの事故数は?
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時頃も同様です。
NYCの平均気温は?
SELECT avg(HourlyDryBulbTemperature),
       date_trunc("hour", weatherdata.DATE) AS Time
FROM weatherdata
GROUP BY Time
ORDER BY Time ASC
LIMIT 100;
出力:
これは2014年のデータであり、最近のNYCはこれほど寒くありません。
+-------------------------------+---------------------+
| 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 |
視界が悪いときにNYCで運転するのは安全ですか?
視界が悪いとき(0から1.0マイルの間)の事故数を見てみましょう。この質問に答えるために、2つのテーブルをDATETIME列でジョインします。
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;
低視界時に1時間で最も多くの事故は129件です。考慮すべき点はいくつかあります:
- 2014年2月3日は月曜日
 - 8時はラッシュアワー
 - 雨が降っていた(その時間の降水量は0.12インチ)
 - 気温は32度F(水の氷点)
 - 視界は0.25マイルで悪い、NYCの通常は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度Fで氷に昇華することがあります。このクエリは0から40度Fの間の気温を見ています。
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 オペレーターを削除したい場合は、このコマンドを実行します。
helm delete starrocks
まとめ
このチュートリアルでは:
- Helm と StarRocks Operator を使用して StarRocks をデプロイしました
 - ニューヨーク市が提供するクラッシュデータと NOAA が提供する気象データをロードしました
 - SQL JOIN を使用して、視界が悪い状態や凍結した道路での運転が悪い考えであることを分析しました
 
学ぶことはまだあります。Stream Load 中に行われたデータ変換については意図的に詳しく説明していません。curl コマンドに関するメモは以下にあります。
curl コマンドに関するメモ
StarRocks Stream Load と curl は多くの引数を取ります。このチュートリアルで使用されるものだけをここで説明し、残りは詳細情報セクションでリンクされます。
--location-trusted
これは、リダイレクトされた URL に資格情報を渡すように curl を設定します。
-u root
StarRocks にログインするために使用されるユーザー名です。
-T filename
T は転送を意味し、転送するファイル名です。
label:name-num
この Stream Load ジョブに関連付けるラベルです。ラベルは一意でなければならないため、ジョブを複数回実行する場合は、番号を追加してインクリメントし続けることができます。
column_separator:,
ファイルが単一の , を使用している場合は、上記のように設定します。異なる区切り文字を使用している場合は、その区切り文字をここで設定します。一般的な選択肢は \t、,、| です。
skip_header:1
一部の CSV ファイルには、すべての列名が記載された単一のヘッダー行があり、データ型を追加する2行目がある場合もあります。ヘッダー行が1行または2行ある場合は skip_header を 1 または 2 に設定し、ない場合は 0 に設定します。
enclose:\"
埋め込みコンマを含む文字列をダブルクォートで囲むことが一般的です。このチュートリアルで使用されるサンプルデータセットにはコンマを含む地理的位置があるため、enclose 設定は \" に設定されています。" を \ でエスケープすることを忘れないでください。
max_filter_ratio:1
これはデータのいくつかのエラーを許可します。理想的には 0 に設定し、エラーがある場合はジョブが失敗するようにします。デバッグ中にすべての行が失敗することを許可するために 1 に設定されています。
columns:
CSV ファイルの列を StarRocks テーブルの列にマッピングします。CSV ファイルにはテーブルの列よりも多くの列があることに気付くでしょう。テーブルに含まれていない列はスキップされます。
また、クラッシュデータセットの columns: 行にデータの変換が含まれていることに気付くでしょう。CSV ファイルには標準に準拠していない日付と時刻が含まれていることが非常に一般的です。これは、クラッシュの日時を DATETIME 型に変換するためのロジックです。
columns 行
これは1つのデータレコードの始まりです。日付は 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 ファイルの2番目の列の内容を 
tmp_CRASH_TIMEに割り当てる concat_ws()はtmp_CRASH_DATEとtmp_CRASH_TIMEをスペースで連結するstr_to_date()は連結された文字列から DATETIME を作成する- 結果の DATETIME を 
CRASH_DATE列に格納する 
詳細情報
Default values.yaml
Motor Vehicle Collisions - Crashes データセットは、ニューヨーク市によって提供され、これらの 利用規約 および プライバシーポリシー に従います。
Local Climatological Data (LCD) は、NOAA によって提供され、免責事項 および プライバシーポリシー に従います。
Helm は Kubernetes のパッケージマネージャーです。Helm Chart は Helm パッケージであり、Kubernetes クラスターでアプリケーションを実行するために必要なすべてのリソース定義を含んでいます。