全部产品
Search
文档中心

E-MapReduce:Gunakan ClickHouse

更新时间:Jul 02, 2025

Topik ini menjelaskan cara menulis data secara cepat ke tabel lokal pada setiap node dalam cluster ClickHouse dalam mode acak.

Prasyarat

Cluster ClickHouse telah dibuat. Untuk informasi lebih lanjut, lihat Buat cluster ClickHouse.

Prosedur

  1. Masuk ke cluster ClickHouse dalam mode SSH. Untuk informasi lebih lanjut, lihat Masuk ke 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 klien ClickHouse:

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

    Dalam contoh perintah, core-1-1 menunjukkan nama node inti yang Anda masuki. Jika Anda memiliki beberapa node inti, Anda dapat masuk ke salah satu node tersebut.

  4. Jalankan perintah berikut untuk membuat database.

    Anda dapat menjalankan perintah berikut yang berisi parameter on CLUSTER untuk membuat database untuk semua node dalam cluster. Secara default, cluster diberi nama cluster_emr.

    CREATE DATABASE IF NOT EXISTS demo on CLUSTER cluster_emr;

    Keluaran berikut akan dikembalikan. Create Database

  5. Buat tabel replikasi untuk semua node dalam cluster.

    Tabel replikasi menghasilkan jumlah salinan data yang sama dengan jumlah replika tabel untuk setiap node dalam cluster, dan data konsisten di seluruh semua replika tabel.

    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

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

  6. Jalankan perintah berikut untuk membuat tabel terdistribusi.

    Tabel terdistribusi tidak menyimpan data. Ini hanya merupakan tampilan dari tabel dasar. Anda dapat menggunakan tabel terdistribusi untuk melakukan query terdistribusi pada beberapa server. Dalam contoh ini, fungsi acak rand() digunakan. Fungsi ini memastikan bahwa data dapat ditulis secara acak ke tabel lokal setiap node.

    CREATE TABLE demo.hits_all on CLUSTER cluster_emr AS demo.hits_local 
    ENGINE = Distributed(cluster_emr, demo, hits_local, rand());
  7. Keluar dari klien ClickHouse dan jalankan perintah berikut di direktori tempat data sampel disimpan 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;
  8. Mulai ulang klien ClickHouse dan lihat data.

    Data ditulis secara acak. Oleh karena itu, jumlah data mungkin bervariasi di setiap node.

    • Jalankan perintah berikut untuk melihat jumlah data dalam tabel demo.hits_all pada node core-1-1:

      select count(*) from demo.hits_all;
    • Jalankan perintah berikut untuk melihat jumlah data dalam tabel demo.hits_local pada node core-1-1:

      select count(*) from demo.hits_local;
    • Lihat jumlah data dalam tabel demo.hits_local pada node core-1-2.

      Catatan

      Anda dapat melakukan operasi berikut untuk melihat jumlah data dalam tabel demo.hits_local pada node lainnya. Anda dapat melihat nama node pada tab Nodes cluster di konsol E-MapReduce.

      1. Jalankan perintah berikut untuk masuk ke klien ClickHouse:

        clickhouse-client -h core-1-2 -m
      2. Jalankan perintah berikut di klien ClickHouse untuk melihat jumlah data dalam tabel demo.hits_local:

        select count(*) from demo.hits_local;