All Products
Search
Document Center

E-MapReduce:Memulai dengan ClickHouse

Last Updated:Jun 21, 2026

Tutorial ini menunjukkan cara menulis data secara acak ke tabel lokal di setiap node dalam kluster ClickHouse.

Prasyarat

Diperlukan kluster ClickHouse. Untuk informasi selengkapnya, lihat Create a ClickHouse cluster.

Prosedur

  1. Login ke kluster ClickHouse melalui SSH. Untuk informasi selengkapnya, lihat Log on to a cluster.

  2. Jalankan perintah berikut untuk mengunduh dataset sampel resmi:

    curl https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz  | unxz --threads=`nproc` > hits_v1.tsv
  3. Jalankan perintah berikut untuk memulai client ClickHouse:

    clickhouse-client -h core-1-1 -m
    Catatan

    Contoh ini login ke node core-1-1. Jika Anda memiliki beberapa node core, Anda dapat login ke salah satu dari mereka.

  4. Jalankan perintah berikut untuk membuat database:

    Anda dapat menggunakan parameter ON CLUSTER untuk membuat database di semua node dalam kluster. Identifier kluster default adalah cluster_emr.

    CREATE DATABASE IF NOT EXISTS demo on CLUSTER cluster_emr;

    Perintah tersebut menghasilkan output berikut:

    core-1-1.c-2ecd13e05xxx    cn-hangzhou.emr.aliyuncs.com :) CREATE DATABASE IF NOT EXISTS demo on CLUSTER cluster_emr;
    CREATE DATABASE IF NOT EXISTS demo ON CLUSTER cluster_emr
    Query id: ecf856dc-3490-498a-8368-386f38dcxxx
    ┌─host──────────────────────────────────────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
    │ core-1-1.c-2ecd13e05xxx.cn-hangzhou.emr.aliyuncs.com  │ 9000 │      0 │       │                   0 │                0 │
    └───────────────────────────────────────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
    1 rows in set. Elapsed: 0.123 sec.
    core-1-1.c-2ecd13e05xxx    cn-hangzhou.emr.aliyuncs.com :) CREATE DATABASE IF NOT EXISTS demo on CLUSTER cluster_emr;
    CREATE DATABASE IF NOT EXISTS demo ON CLUSTER cluster_emr
    Query id: ecf856dc-3490-498a-8368-386f38dcxxx
    ┌─host──────────────────────────────────────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
    │ core-1-1.c-2ecd13e05xxx.cn-hangzhou.emr.aliyuncs.com  │ 9000 │      0 │       │                   0 │                0 │
    └───────────────────────────────────────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
    1 rows in set. Elapsed: 0.123 sec.
  • Jalankan perintah berikut untuk membuat tabel replikasi di semua node dalam kluster:

    Tabel replikasi membuat beberapa replika data sesuai konfigurasi Anda, sehingga menjamin redundansi data dan konsistensi akhir.

    CREATE TABLE demo.hits_local ON CLUSTER cluster_emr
    (
        `WatchID` UInt64,
        `JavaEnable` UInt8,
        `Title` String,
        `GoodEvent` Int16,
        `EventTime` DateTime,
        `EventDate` Date,
        `CounterID` UInt32,
        `ClientIP` UInt32,
        `ClientIP6` FixedString(16),
        `RegionID` UInt32,
        `UserID` UInt64,
        `CounterClass` Int8,
        `OS` UInt8,
        `UserAgent` UInt8,
        `URL` String,
        `Referer` String,
        `URLDomain` String,
        `RefererDomain` String,
        `Refresh` UInt8,
        `IsRobot` UInt8,
        `RefererCategories` Array(UInt16),
        `URLCategories` Array(UInt16),
        `URLRegions` Array(UInt32),
        `RefererRegions` Array(UInt32),
        `ResolutionWidth` UInt16,
        `ResolutionHeight` UInt16,
        `ResolutionDepth` UInt8,
        `FlashMajor` UInt8,
        `FlashMinor` UInt8,
        `FlashMinor2` String,
        `NetMajor` UInt8,
        `NetMinor` UInt8,
        `UserAgentMajor` UInt16,
        `UserAgentMinor` FixedString(2),
        `CookieEnable` UInt8,
        `JavascriptEnable` UInt8,
        `IsMobile` UInt8,
        `MobilePhone` UInt8,
        `MobilePhoneModel` String,
        `Params` String,
        `IPNetworkID` UInt32,
        `TraficSourceID` Int8,
        `SearchEngineID` UInt16,
        `SearchPhrase` String,
        `AdvEngineID` UInt8,
        `IsArtifical` UInt8,
        `WindowClientWidth` UInt16,
        `WindowClientHeight` UInt16,
        `ClientTimeZone` Int16,
        `ClientEventTime` DateTime,
        `SilverlightVersion1` UInt8,
        `SilverlightVersion2` UInt8,
        `SilverlightVersion3` UInt32,
        `SilverlightVersion4` UInt16,
        `PageCharset` String,
        `CodeVersion` UInt32,
        `IsLink` UInt8,
        `IsDownload` UInt8,
        `IsNotBounce` UInt8,
        `FUniqID` UInt64,
        `HID` UInt32,
        `IsOldCounter` UInt8,
        `IsEvent` UInt8,
        `IsParameter` UInt8,
        `DontCountHits` UInt8,
        `WithHash` UInt8,
        `HitColor` FixedString(1),
        `UTCEventTime` DateTime,
        `Age` UInt8,
        `Sex` UInt8,
        `Income` UInt8,
        `Interests` UInt16,
        `Robotness` UInt8,
        `GeneralInterests` Array(UInt16),
        `RemoteIP` UInt32,
        `RemoteIP6` FixedString(16),
        `WindowName` Int32,
        `OpenerName` Int32,
        `HistoryLength` Int16,
        `BrowserLanguage` FixedString(2),
        `BrowserCountry` FixedString(2),
        `SocialNetwork` String,
        `SocialAction` String,
        `HTTPError` UInt16,
        `SendTiming` Int32,
        `DNSTiming` Int32,
        `ConnectTiming` Int32,
        `ResponseStartTiming` Int32,
        `ResponseEndTiming` Int32,
        `FetchTiming` Int32,
        `RedirectTiming` Int32,
        `DOMInteractiveTiming` Int32,
        `DOMContentLoadedTiming` Int32,
        `DOMCompleteTiming` Int32,
        `LoadEventStartTiming` Int32,
        `LoadEventEndTiming` Int32,
        `NSToDOMContentLoadedTiming` Int32,
        `FirstPaintTiming` Int32,
        `RedirectCount` Int8,
        `SocialSourceNetworkID` UInt8,
        `SocialSourcePage` String,
        `ParamPrice` Int64,
        `ParamOrderID` String,
        `ParamCurrency` FixedString(3),
        `ParamCurrencyID` UInt16,
        `GoalsReached` Array(UInt32),
        `OpenstatServiceName` String,
        `OpenstatCampaignID` String,
        `OpenstatAdID` String,
        `OpenstatSourceID` String,
        `UTMSource` String,
        `UTMMedium` String,
        `UTMCampaign` String,
        `UTMContent` String,
        `UTMTerm` String,
        `FromTag` String,
        `HasGCLID` UInt8,
        `RefererHash` UInt64,
        `URLHash` UInt64,
        `CLID` UInt32,
        `YCLID` UInt64,
        `ShareService` String,
        `ShareURL` String,
        `ShareTitle` String,
        `ParsedParams` Nested(Key1 String,Key2 String,Key3 String,Key4 String,Key5 String,ValueDouble Float64),
        `IslandID` FixedString(16),
        `RequestNum` UInt32,
        `RequestTry` UInt8
    )
    ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/hits_local', '{replica}')
    PARTITION BY toYYYYMM(EventDate)
    ORDER BY (CounterID, EventDate, intHash32(UserID))
    SAMPLE BY intHash32(UserID);
    Catatan

    {shard} dan {replica} adalah makro yang secara otomatis dihasilkan oleh Alibaba Cloud E-MapReduce (EMR) untuk kluster ClickHouse. Anda dapat menggunakannya secara langsung.

  • Jalankan perintah berikut untuk membuat tabel terdistribusi:

    Tabel terdistribusi tidak menyimpan data, melainkan berfungsi sebagai tampilan dari tabel dasar yang memungkinkan Anda menjalankan kueri terdistribusi di beberapa server. Contoh ini menggunakan fungsi rand() untuk menulis data secara acak ke tabel lokal di setiap node.

    CREATE TABLE demo.hits_all on CLUSTER cluster_emr AS demo.hits_local 
    ENGINE = Distributed(cluster_emr, demo, hits_local, rand());
  • Keluar dari client ClickHouse, lalu jalankan perintah berikut di direktori dataset sampel untuk mengimpor data:

    clickhouse-client -h core-1-1 --query "INSERT INTO demo.hits_all FORMAT TSV" --max_insert_block_size=100000 < hits_v1.tsv;
  • Mulai ulang client ClickHouse untuk melihat data.

    Karena data ditulis secara acak, jumlah data di setiap node mungkin berbeda.

    • Periksa volume data demo.hits_all di node core-1-1.

      select count(*) from demo.hits_all;
    • Lihat jumlah data di demo.hits_local di node core-1-1.

      select count(*) from demo.hits_local;
    • Periksa jumlah data di demo.hits_local di node core-1-2.

      Catatan

      Untuk node lainnya, Anda juga dapat memeriksa volume data demo.hits_local. Nama node dapat dilihat di halaman Nodes di Konsol E-MapReduce.

      1. Jalankan perintah berikut untuk login ke client ClickHouse:

        clickhouse-client -h core-1-2 -m
      2. Di client ClickHouse, jalankan perintah berikut untuk memeriksa volume data demo.hits_local.

        select count(*) from demo.hits_local;