ClickHouse 表引擎介紹

表引擎介紹:

ClickHouse表引擎決定了如下幾個(gè)方面:

怎樣存儲(chǔ)數(shù)據(jù) -將數(shù)據(jù)寫(xiě)到哪里, 怎樣讀取數(shù)據(jù).

支持何種查詢(xún)以及怎樣支持.

并發(fā)數(shù)據(jù)訪問(wèn).

索引的使用.

是否多線程的請(qǐng)求執(zhí)行是可以的.

數(shù)據(jù)如何同步.

當(dāng)讀取數(shù)據(jù)時(shí), 引擎只需要抽取必要的列簇. 然而龟梦,在一些場(chǎng)景下,查詢(xún)可能在表引擎中是半處理狀態(tài).

在大多數(shù)場(chǎng)景中, 我們所使用的引擎主要是 MergeTree 家族.

AggregatingMergeTree

Buffer

CollapsingMergeTree

Distributed

External data for query processing

File(InputFormat)

Join

Kafka

Log

MaterializedView

Memory

Merge

Virtual columns

MergeTree

Null

ReplacingMergeTree

Data replication

ReplicatedMergeTree

ReplicatedCollapsingMergeTree

ReplicatedAggregatingMergeTree

ReplicatedSummingMergeTree

Creating replicated tables

Recovery after failures

Recovery after complete data loss

Converting from MergeTree to ReplicatedMergeTree

Converting from ReplicatedMergeTree to MergeTree

Recovery when metadata in the ZooKeeper cluster is lost or damaged

Resharding

Set

SummingMergeTree

### TinyLog引擎

TinyLog 是最簡(jiǎn)單的表引擎, 它將數(shù)據(jù)保存到磁盤(pán). 每個(gè)字段都以單獨(dú)壓縮文件形式保存. 當(dāng)寫(xiě)入數(shù)據(jù)時(shí), 數(shù)據(jù)追加到文件的末尾.

并發(fā)數(shù)據(jù)訪問(wèn)不限制任何形式:

如果你同時(shí)對(duì)此表進(jìn)行讀寫(xiě),如從表中讀取數(shù)據(jù)的同時(shí)寫(xiě)入數(shù)據(jù)到此表噩峦,那么讀操作將會(huì)報(bào)錯(cuò).

如果同時(shí)并行往表里寫(xiě)入數(shù)據(jù)特铝,那么數(shù)據(jù)將損壞.


使用此表的標(biāo)準(zhǔn)方式是一次寫(xiě)入:一寫(xiě)多讀的應(yīng)用場(chǎng)景镊掖。查詢(xún)?cè)趩蝹€(gè)流中執(zhí)行缎除。換句話說(shuō)膝但,本引擎適合很多小表操作(100萬(wàn)行左右的表)。如果你有很多小表策泣,那么適合于使用本引擎衙傀,它比Log更簡(jiǎn)單(使用文件更小)。當(dāng)你有大量小表的時(shí)候萨咕,你可以使用 TinyLog 引擎來(lái)存儲(chǔ)這些數(shù)據(jù)差油,和進(jìn)行下一步查詢(xún)服務(wù)。另外任洞,索引不支持 TinyLog 引擎

TinyLog 表經(jīng)常作為中間表蓄喇,用于數(shù)據(jù)的微批量處理.

### Log引擎

Log 區(qū)別于 TinyLog ,小文件的標(biāo)記 "marks" 保留在列文件中. 這些標(biāo)記寫(xiě)到每個(gè)數(shù)據(jù)塊中 交掏,包含偏移量妆偏,在哪開(kāi)始讀文件,跳過(guò)特定的行數(shù). 此機(jī)制可以多線程并行讀取表中的數(shù)據(jù). 對(duì)于并發(fā)數(shù)據(jù)訪問(wèn), 讀操作能夠同時(shí)執(zhí)行盅弛,而寫(xiě)操作將阻塞讀操作钱骂,或者讀寫(xiě)操作互相阻塞.? Log 引擎不支持索引. 與之類(lèi)似的是, 如果寫(xiě)入到數(shù)據(jù)表失敗, 則表將損壞, 從表中讀取數(shù)據(jù)將返回錯(cuò)誤. Log 引擎適合存儲(chǔ)臨時(shí)數(shù)據(jù), 一次寫(xiě)入表, 或者用于測(cè)試環(huán)境.

### Memory引擎

內(nèi)存表引擎保存在內(nèi)存中, 數(shù)據(jù)處于未壓縮狀態(tài). 數(shù)據(jù)保存格式與讀取數(shù)據(jù)的格式相同. 換句話說(shuō), 從本表中讀取數(shù)據(jù)是完全相同的. 并發(fā)數(shù)據(jù)訪問(wèn)是同步的. 無(wú)鎖訪問(wèn): 讀寫(xiě)數(shù)據(jù)操作互相不受影響. 但數(shù)據(jù)索引不支持. 讀取數(shù)據(jù)是并行執(zhí)行的. 因?yàn)闊o(wú)磁盤(pán)讀寫(xiě), 壓縮/解壓縮, 和序列化/反序列化操作,因此單個(gè)SQL語(yǔ)句查詢(xún)可達(dá)到 10 GB/秒. (在大多數(shù)情況下, Memory 引擎的數(shù)據(jù)處理效率和 MergeTree 的引擎相差無(wú)幾). 當(dāng)重啟服務(wù)器后, 數(shù)據(jù)會(huì)在表中清空挪鹏,不存在. 正常情況下, 內(nèi)存表引擎不經(jīng)常使用. 它可用于小數(shù)據(jù)量(1億條左右)的高速讀取數(shù)據(jù)場(chǎng)景或用于測(cè)試環(huán)境.

內(nèi)存引擎也可用于外部數(shù)據(jù)的臨時(shí)表查詢(xún)和實(shí)現(xiàn) GLOBAL IN 操作.

### MergeTree引擎

MergeTree 引擎支持索引见秽,通過(guò)主鍵和日期來(lái)構(gòu)建索引, 同時(shí)提供 數(shù)據(jù)的實(shí)時(shí)更新能力. 這是目前 ClickHouse處理能力最好的引擎. 注意:不要和 Merge 引擎相混淆.

此引擎接收下面的參數(shù): 包含日期的 Date 類(lèi)型字段, 一個(gè)樣本表達(dá)式 (可選), 一個(gè)元組定義了表的主鍵和索引粒度.

無(wú)樣本支持示例語(yǔ)句.

MergeTree(EventDate, (CounterID, EventDate), 8192)

有樣本支持示例語(yǔ)句.

MergeTree(EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID)), 8192)

一個(gè)合并樹(shù)(MergeTree)表必須有一個(gè)單獨(dú)的字段包含日期. 因此, 它是 EventDate 列. 此日期列必須有 'Date' 類(lèi)型 (不是 'DateTime' 類(lèi)型).

主鍵可能是一個(gè)元組,任意的表達(dá)式 (字段的組合), 或者是一個(gè)單獨(dú)的表達(dá)式.

樣本表達(dá)式可以是任意表達(dá)式. 它也必須用主鍵來(lái)表示. 本示例使用了用戶(hù) IDs 的哈希偽隨機(jī)在表中分布數(shù)據(jù). 換句話說(shuō), 當(dāng)使用 SAMPLE 語(yǔ)句時(shí), 你可以為用戶(hù)的子集數(shù)據(jù)獲得一個(gè)偽隨機(jī)樣本數(shù)據(jù).

表作為一個(gè)數(shù)據(jù)分片的集合. 每個(gè)數(shù)據(jù)分片通過(guò)主鍵來(lái)篩選. 另外讨盒,每個(gè)數(shù)據(jù)分片有最小和最大的日期指定. 當(dāng)插入數(shù)據(jù)到表中時(shí), 一個(gè)新的篩選分片被創(chuàng)建. 合并進(jìn)程周期性地初始化背景執(zhí)行. 當(dāng)數(shù)據(jù)合并時(shí), 一些數(shù)據(jù)分片被選擇 (通常是最小的部分) 解取,然后 合并進(jìn)入更大的篩選分片.

換句話說(shuō), 當(dāng)插入表中時(shí),將進(jìn)行遞增篩選. 因此表通常由一些篩選分區(qū)組成, 合并本身并不做太多工作.

當(dāng)插入數(shù)據(jù)時(shí), 數(shù)據(jù)不同月份的數(shù)據(jù)被拆分成不同的數(shù)據(jù)分片. 不同月份的數(shù)據(jù)分片不會(huì)互相組合在一起. 這么做的目的就是提供本地?cái)?shù)據(jù)修改 (易于備份).

數(shù)據(jù)分片組合有一個(gè)大小閾值限制返顺,因此數(shù)據(jù)分片太長(zhǎng)禀苦,不會(huì)有任何的合并。

對(duì)于每個(gè)數(shù)據(jù)分片, 都有一個(gè)索引文件. 索引文件包含主鍵遂鹊,和每個(gè)'索引粒度'?行的值. 換句話說(shuō), 這個(gè)是篩選數(shù)據(jù)的簡(jiǎn)短索引.

對(duì)于字段, "marks" 也可以寫(xiě)到每個(gè) '索引粒度' 行振乏,因此數(shù)據(jù)能夠在特定的范圍內(nèi)讀取.

當(dāng)從一個(gè)表讀取數(shù)據(jù)時(shí), SELECT 語(yǔ)句將分析是否索引能夠使用. 如果 WHERE 或者 PREWHERE語(yǔ)句有一個(gè)表達(dá)式,此表達(dá)式代表一個(gè)等于或者不等于比較操作秉扑,或者有IN or LIKE 的列前綴和主鍵慧邮、分區(qū)鍵表達(dá)式,則將使用索引.

下面方式將使用主鍵進(jìn)行范圍檢索舟陆,如為特定的跟蹤標(biāo)簽執(zhí)行查詢(xún)误澳;為特定的跟蹤標(biāo)簽和日期范圍執(zhí)行查詢(xún);為特定的跟蹤標(biāo)簽和日期執(zhí)行查詢(xún)吨娜;為帶有日期范圍的多個(gè)跟蹤標(biāo)簽執(zhí)行查詢(xún)脓匿,等等;

SELECT count() FROM table WHERE EventDate=toDate(now()) AND CounterID=34

SELECT count() FROM table WHERE EventDate = toDate(now()) AND (CounterID = 34 OR CounterID = 42)

SELECT count() FROM table WHERE ((EventDate >= toDate('2014-01-01') AND EventDate <= toDate('2014-01-31')) OR EventDate = toDate('2014-05-01')) AND CounterID IN (101500, 731962, 160656) AND (CounterID = 101500 OR EventDate != toDate('2014-05-01'))

在上面的情況下宦赠,將通過(guò)日期和主鍵來(lái)使用索引陪毡。此索引也可用于復(fù)雜的表達(dá)式米母。因此,利用索引從表中讀取數(shù)據(jù)的查詢(xún)速度也十分高效毡琉,和全表掃描的速度相差無(wú)幾铁瞒。

下面的示例,將不使用索引.

SELECT count() FROM table WHERE CounterID = 34 OR URL LIKE '%www.baidu.com%'


當(dāng)執(zhí)行查詢(xún)過(guò)程中桅滋,為了檢查ClickHouse是否使用索引慧耍,可以使用下面兩個(gè)設(shè)置強(qiáng)制使用索引,?force_index_by_date 和 force_primary_key.

通過(guò)日期進(jìn)行索引僅可以讀取包含日期的特定范圍的數(shù)據(jù)分片. 然而, 一個(gè)數(shù)據(jù)分區(qū)可能包含多個(gè)日期的數(shù)據(jù) (整月份數(shù)據(jù)), 在單個(gè)數(shù)據(jù)分片中數(shù)據(jù)通過(guò)主鍵來(lái)排序, 可能不包含日期作為第一個(gè)列. 因此, 使用一個(gè)僅有日期條件的查詢(xún)丐谋,不指定主鍵芍碧,將導(dǎo)致更多的數(shù)據(jù)被查詢(xún)出來(lái).

對(duì)于并發(fā)表訪問(wèn), 我們將使用多版本方式. 換句話說(shuō), 當(dāng)一個(gè)表同時(shí)進(jìn)行讀寫(xiě)操作時(shí),數(shù)據(jù)將從數(shù)據(jù)分片中讀取,? 讀寫(xiě)操作是無(wú)鎖機(jī)制的号俐,數(shù)據(jù)插入操作不影響數(shù)據(jù)讀取操作.

在表中的數(shù)據(jù)讀取是自動(dòng)并行處理的泌豆。

支持?OPTIMIZE?查詢(xún), 它可調(diào)用一個(gè)外部合并步驟.

你可以使用一張大表,持續(xù)添加數(shù)據(jù)到大表中? –那么 MergeTree 是適合的.

數(shù)據(jù)同步可用于 MergeTree 引擎的所有表類(lèi)型.


View

Kafka

表引擎的后臺(tái)為Kafka吏饿,Kafka 作為流數(shù)據(jù)平臺(tái)具備三中關(guān)鍵能力:

它讓你發(fā)布和訂閱記錄數(shù)據(jù)流踪危。它類(lèi)似消息隊(duì)列或者企業(yè)級(jí)消息總線。

它讓你以容錯(cuò)的方式來(lái)存儲(chǔ)記錄數(shù)據(jù)流猪落。

它讓你以流式的方式處理記錄數(shù)據(jù)流贞远。

Kafka(broker_list, topic_list, group_name, format[, schema])

引擎參數(shù):

broker_list - 一個(gè) brokers 列表((localhost:9092).

topic_list - Kafka隊(duì)列列表用于消費(fèi)(my_topic).

group_name -Kafka 消費(fèi)者群組名稱(chēng)(group1).

每個(gè)消費(fèi)者群組的偏移量被追蹤,如果你想要跨集群一次性消費(fèi)消息笨忌,你應(yīng)該使用相同的群組名稱(chēng)

format - 格式的名稱(chēng)蓝仲,用于反序列化消息. 它接受了相同的值作為 FORMATSQL 語(yǔ)句, 例如 JSONEachRow.

schema - 可選的 schema 值,需要一個(gè) schema 來(lái)中斷所消費(fèi)的消息, 例如 Cap’n Proto 格式需要一個(gè) schema 文件的路徑和根對(duì)象(root object) -schema.capnp:Message. 自描述格式, 例如 JSON 不需要任何的 Schema.

例如:


CREATE TABLE queue (timestamp UInt64, level String, message String) ENGINE = Kafka('localhost:9092', 'topic', 'group1', 'JSONEachRow');


SELECT * FROM queue LIMIT 5


已消費(fèi)的消息自動(dòng)在后臺(tái)被追蹤蜜唾,這樣每個(gè)消息都能夠在一個(gè)消費(fèi)者組中被讀一次杂曲。如果你想要二次消費(fèi)相同的消息,你能夠創(chuàng)建一個(gè)帶有不同組名的表的拷貝袁余。消費(fèi)者組是彈性的,跨集群同步的咱揍,因此颖榜,如果你有10個(gè)話題/分區(qū)(topic/partitions)和5個(gè)表的實(shí)例(instances),它將為每個(gè)實(shí)例自動(dòng)分配2個(gè)話題/分區(qū)(topic/partitions)煤裙。如果你卸載一個(gè)表或者添加新的實(shí)例掩完,它將自動(dòng)重新平衡話題/分區(qū)(topic/partitions)分配。詳情查看http://kafka.apache.org/intro硼砰。

然而直接讀取消息并不是太有用且蓬,表引擎被用于構(gòu)建實(shí)時(shí)攝取Pipeline, 使用MATERIALIZED VIEW。如果一個(gè)MATERIALIZED VIEW被掛載到一個(gè) Kafka 表引擎题翰,它將在后臺(tái)進(jìn)程中開(kāi)始消費(fèi)消息恶阴,推送到掛載的視圖诈胜。它允許你從 Kafka 持續(xù)攝取消息,同時(shí)使用SELECT語(yǔ)句來(lái)轉(zhuǎn)換這些數(shù)據(jù)到合適的格式冯事。

示例:


CREATE TABLE queue (timestamp UInt64, level String, message String) ENGINE = Kafka('localhost:9092', 'topic', 'group1', 'JSONEachRow');


CREATE MATERIALIZED VIEW daily ENGINE = SummingMergeTree(day, (day, level), 8192) AS


SELECT toDate(toDateTime(timestamp)) AS day, level, count() as totalFROM queue GROUP BY day, level;


SELECT level, sum(total) FROM daily GROUP BY level;


當(dāng)INSERT插入數(shù)據(jù)時(shí)焦匈,消息立即流入到掛載的視圖中。為了提升處理性能昵仅,已消費(fèi)的消息以批量的方式進(jìn)行壓縮 - max_insert_block_size缓熟。如果此批量消息不能被完成,刷新周期為 stream_flush_interval_ms (默認(rèn)為7500ms)摔笤,它將刷新來(lái)保證插入時(shí)間間隔够滑。

Buffer

Buffers 將數(shù)據(jù)寫(xiě)入到內(nèi)存中,周期性刷新數(shù)據(jù)到另外的表中吕世。在讀取操作的過(guò)程中版述,數(shù)據(jù)從 Buffer 和另外的表中同時(shí)讀取。

Buffer(database, table, num_layers, min_time, max_time, min_rows, max_rows, min_bytes, max_bytes)

引擎參數(shù):database, table - 表刷新數(shù)據(jù)寞冯。與數(shù)據(jù)庫(kù)名稱(chēng)不同渴析,你能夠使用常量表達(dá)式返回字符串。

num_layers - 并行水平吮龄。

物理上看俭茧,表能夠用獨(dú)立 buffers 的‘num_layers’代表。默認(rèn)值為16漓帚,min_time, max_time, min_rows, max_rows, min_bytes母债,同時(shí)max_bytes是從 buffer 刷新數(shù)據(jù)的條件。

數(shù)據(jù)從buffer 中刷新尝抖,寫(xiě)入到目標(biāo)表毡们,如果所有的‘min’條件或者最少一個(gè)‘max’條件組合時(shí)。

min_time, max_time - 從第一次寫(xiě)入到 buffer 的時(shí)間昧辽。

min_rows, max_rows - 在 buffer 中的行數(shù)衙熔。

min_bytes, max_bytes - 在 buffer 中字節(jié)的數(shù)量。

在寫(xiě)入操作的過(guò)程中搅荞,數(shù)據(jù)寫(xiě)入到一個(gè)‘num_layers’數(shù)的隨機(jī) buffers 中红氯。或者咕痛,如果插入的數(shù)據(jù)部分足夠大(大于 ‘max_rows’ 或者 ‘max_bytes’),它被直接寫(xiě)入到目標(biāo)表痢甘,忽略此 buffer。

刷新數(shù)據(jù)被單獨(dú)計(jì)算為每個(gè)‘num_layers’buffers茉贡。例如塞栅,如果num_layers = 16 and max_bytes = 100000000,最大的內(nèi)存消耗是1.6 GB腔丧。

例如:

CREATE TABLE merge.hits_buffer AS merge.hits ENGINE = Buffer(merge, hits, 16, 10, 100, 10000, 1000000, 10000000, 100000000)

CollapsingMergeTree

此引擎不同于其他的MergeTree放椰,可以允許自動(dòng)化刪除作烟,或者‘collapsing’ 行的特定部分,當(dāng)執(zhí)行merge時(shí).

Yandex.Metrica 有大量的點(diǎn)擊日志 (例如hit logs) 和變更日志. 變更日志用于增量計(jì)算數(shù)據(jù)的統(tǒng)計(jì)值. 示例如回話更新日志, 或者用戶(hù)歷史更新日志.在 Yandex.Metrica回話是不斷在變化的. 例如, 每個(gè)回話點(diǎn)擊數(shù)的增加. 我們引用任意對(duì)象的變化作為一個(gè)變更對(duì)兒 (?old values, ?new values). 如果對(duì)象是創(chuàng)建的, 舊的值可能會(huì)丟失. 如果對(duì)象被刪除庄敛,新的值可能被丟失. 如果對(duì)象發(fā)生變化, 但是之前存在的沒(méi)有被刪除俗壹,也則兩個(gè)值同時(shí)存在. 在更新日志中,兩份數(shù)據(jù)都存在. Each entry 每一份都包含對(duì)象的所有屬性, 加一個(gè)特定的屬性來(lái)區(qū)分老值和新值.當(dāng)對(duì)象更新時(shí)藻烤, 只有新的對(duì)象添加到更新日志中, 已經(jīng)存在的值不發(fā)生變化.

更新日志使增量計(jì)算任意的數(shù)據(jù)統(tǒng)計(jì)任務(wù)成為可能. 為了達(dá)到這個(gè)目標(biāo), 我們需要考慮給一個(gè) “new” rows 添一個(gè)+標(biāo)識(shí)位, 一個(gè) “old” rows 添一個(gè)-標(biāo)識(shí)位. 換句話說(shuō), 增量計(jì)算所有統(tǒng)計(jì)是可能的绷雏, 同時(shí)我們也能計(jì)算 “idempotent” 統(tǒng)計(jì), 例如唯一訪客的數(shù)量, 當(dāng)回話更新時(shí),唯一訪客并沒(méi)有被刪除.

這是讓Yandex.Metrica實(shí)時(shí)工作的關(guān)鍵技術(shù)點(diǎn)怖亭。

CollapsingMergeTree接受一個(gè)額外的參數(shù) -?Int8-type類(lèi)型列的名稱(chēng)包含了行的標(biāo)識(shí)涎显。例如:

CollapsingMergeTree(EventDate,(CounterID,EventDate,intHash32(UniqID),VisitID),8192,Sign)

在這里,“Sign”是一個(gè)包含-1表示“舊”值和1表示“新”值的列兴猩。

當(dāng)合并時(shí)期吓,每組連續(xù)相同的主鍵值(用于排序數(shù)據(jù)的列)被減少到不超過(guò)一行,列值為'sign_column = -1'(“負(fù)行”)倾芝,并且不超過(guò)一行 列值'sign_column = 1'(“正行”)讨勤。 換句話說(shuō),來(lái)自更新日志的條目是折疊的晨另。

如果正數(shù)行和負(fù)數(shù)行匹配潭千,則寫(xiě)入第一個(gè)負(fù)行和最后一個(gè)正數(shù)行。 如果還有一個(gè)正數(shù)行比負(fù)數(shù)行多借尿,則只寫(xiě)入最后一個(gè)正數(shù)行刨晴。 如果負(fù)數(shù)的行比正數(shù)行多,只有第一個(gè)負(fù)數(shù)行被寫(xiě)入路翻。 否則狈癞,將會(huì)出現(xiàn)邏輯錯(cuò)誤,并且不會(huì)寫(xiě)入任何行茂契。 (如果日志的同一部分意外插入了多次蝶桶,則會(huì)發(fā)生邏輯錯(cuò)誤,錯(cuò)誤只會(huì)記錄在服務(wù)器日志中账嚎,并繼續(xù)進(jìn)行合并莫瞬。

因此,折疊不應(yīng)該改變計(jì)算統(tǒng)計(jì)的結(jié)果郭蕉。 更新逐漸折疊,最后只剩下每個(gè)對(duì)象的最后一個(gè)值喂江。?與MergeTree相比召锈,CollapsingMergeTree引擎可以使數(shù)據(jù)量成倍減少。

有幾種方法可以從CollapsingMergeTree表中獲取完全“折疊”的數(shù)據(jù):

1.使用GROUP BY和聚合函數(shù)編寫(xiě)一個(gè)查詢(xún)來(lái)解釋符號(hào)获询。 例如涨岁,要計(jì)算數(shù)量拐袜,請(qǐng)寫(xiě)'sum(Sign)'而不是'count()'。 要計(jì)算一些東西的總和梢薪,寫(xiě)下'sum(Sign * x)'而不是'sum(x)'蹬铺,等等,并且加上'HAVING sum(Sign)> 0'秉撇。 并非所有金額都可以這樣計(jì)算甜攀。 例如,集合函數(shù)“min”和“max”不能被重寫(xiě)琐馆。

2.如果您必須提取數(shù)據(jù)而不進(jìn)行聚合(例如规阀,要檢查是否存在行的最新值符合某些條件),則可以對(duì)FROM子句使用FINAL修飾符瘦麸。 這種方法效率顯著較低谁撼。

分布式引擎

分布式引擎本身不存儲(chǔ)數(shù)據(jù),但允許在多個(gè)服務(wù)器上進(jìn)行分布式查詢(xún)處理滋饲。 讀取是自動(dòng)并行的厉碟。 在讀取數(shù)據(jù)期間,使用遠(yuǎn)程服務(wù)器上的表索引(如果有的話)屠缭。 分布式引擎接受參數(shù):服務(wù)器配置文件中的集群名稱(chēng)箍鼓,遠(yuǎn)程數(shù)據(jù)庫(kù)的名稱(chēng),遠(yuǎn)程表的名稱(chēng)以及(可選)分片鍵勿她。 例:

Distributed(logs, default, hits[, sharding_key])

從位于群集中每個(gè)服務(wù)器上的“default.hits”表中的“l(fā)ogs”群集中的所有服務(wù)器讀取數(shù)據(jù)袄秩。 數(shù)據(jù)不僅被讀取,而且在遠(yuǎn)程服務(wù)器上被部分處理逢并。 例如之剧,對(duì)于使用GROUP BY的查詢(xún),將在遠(yuǎn)程服務(wù)器上聚合數(shù)據(jù)砍聊,聚合函數(shù)的中間狀態(tài)將發(fā)送到請(qǐng)求者服務(wù)器背稼。 那么數(shù)據(jù)將被進(jìn)一步聚合。

您可以使用返回字符串的常量表達(dá)式來(lái)代替數(shù)據(jù)庫(kù)名稱(chēng)玻蝌。 例如蟹肘,currentDatabase()。

logs - 服務(wù)器配置文件中的群集名稱(chēng)俯树。

集群被設(shè)置如下:

在這里帘腹,一個(gè)集群被定義為由兩個(gè)分片組成的名稱(chēng)“l(fā)ogs”,每個(gè)分片包含兩個(gè)副本许饿。 分片是指包含數(shù)據(jù)不同部分的服務(wù)器(為了讀取所有數(shù)據(jù)阳欲,您必須訪問(wèn)所有分片)。 副本正在復(fù)制服務(wù)器(為了讀取所有數(shù)據(jù),您可以訪問(wèn)任何一個(gè)副本上的數(shù)據(jù))球化。

對(duì)于每個(gè)服務(wù)器秽晚,有幾個(gè)參數(shù):強(qiáng)制:“主機(jī)”,“端口”和可選:“用戶(hù)”筒愚,“密碼”赴蝇。

host - 遠(yuǎn)程服務(wù)器的地址。 可以指定為域名或IPv4或IPv6地址巢掺。 如果指定域句伶,服務(wù)器將在啟動(dòng)時(shí)執(zhí)行DNS查找,并且結(jié)果將被緩存直到服務(wù)器關(guān)閉址遇。 如果DNS請(qǐng)求失敗熄阻,服務(wù)器將無(wú)法啟動(dòng)。 如果您要更改DNS記錄倔约,請(qǐng)重新啟動(dòng)服務(wù)器以使新記錄生效秃殉。

port?- TCP-端口 用于服務(wù)器之間的通信 (tcp_port 在配置文件中, 通常為 9000). 不要與 http_port混淆.

user - 用戶(hù)名連接到遠(yuǎn)程服務(wù)器。 默認(rèn)情況下浸剩,用戶(hù)是“默認(rèn)”钾军。 該用戶(hù)必須具有訪問(wèn)權(quán)才能連接到遠(yuǎn)程服務(wù)器。 訪問(wèn)權(quán)限在users.xml配置文件中進(jìn)行管理绢要。 有關(guān)其他信息吏恭,請(qǐng)考慮“訪問(wèn)權(quán)限”部分。

password - 以明文登錄到遠(yuǎn)程服務(wù)器的密碼重罪。 默認(rèn)是空字符串樱哼。

指定副本時(shí),讀取時(shí)將為每個(gè)分片選擇一個(gè)可用副本剿配。 您可以配置負(fù)載均衡算法(副本訪問(wèn)的首選項(xiàng)) - 請(qǐng)參閱“負(fù)載平衡”設(shè)置搅幅。 如果與服務(wù)器的連接沒(méi)有建立,則會(huì)嘗試一個(gè)短超時(shí)的連接呼胚。 如果連接失敗茄唐,下一個(gè)副本將被選中,以此類(lèi)推蝇更。 如果所有副本的連接嘗試失敗沪编,嘗試將以相同的方式重復(fù)幾次。 這有利于彈性伸縮年扩,但不提供完整的容錯(cuò)能力:遠(yuǎn)程服務(wù)器可能會(huì)接受連接蚁廓,但可能無(wú)法正常工作或工作不正常。



查詢(xún)外部數(shù)據(jù)

ClickHouse允許向服務(wù)器發(fā)送處理查詢(xún)所需的數(shù)據(jù)以及SELECT查詢(xún)厨幻。 這些數(shù)據(jù)放在一個(gè)臨時(shí)表中(請(qǐng)參見(jiàn)“臨時(shí)表”一節(jié))纳令,并可以在查詢(xún)中使用(例如挽荠,在IN操作符中)克胳。

例如平绩,如果您的文本文件包含重要的用戶(hù)標(biāo)識(shí)符,則可以將其與使用此列表過(guò)濾的查詢(xún)一起上傳到服務(wù)器漠另。如果您需要使用大量外部數(shù)據(jù)運(yùn)行多個(gè)查詢(xún)捏雌,請(qǐng)不要使用此功能。 提前將數(shù)據(jù)上傳到數(shù)據(jù)庫(kù)最好笆搓。

可以使用命令行客戶(hù)端(非交互模式)或使用HTTP接口上傳外部數(shù)據(jù)性湿。

在命令行客戶(hù)端中,可以使用格式指定參數(shù)部分满败。

--external --file=...[--name=...][--format=...][--types=...|--structure=...]

對(duì)于正在傳輸?shù)谋頂?shù)量肤频,您可能有多個(gè)這樣的部分。

-?external - 標(biāo)記節(jié)的開(kāi)始算墨。 -file - 使用表轉(zhuǎn)儲(chǔ)的文件路徑宵荒,或 - 引用stdin的路徑只能從stdin中查詢(xún)單個(gè)表。

以下參數(shù)是可選的:-name - 表的名稱(chēng)净嘀。 如果省略报咳,則使用_data。 -format - 文件中的數(shù)據(jù)格式挖藏。 如果省略暑刃,則使用TabSeparated。

文件通過(guò)file進(jìn)行指定膜眠,通過(guò)format解析成特定的格式, 使用類(lèi)型或結(jié)構(gòu)中指定的數(shù)據(jù)類(lèi)型岩臣。表將被上傳到服務(wù)器上,作為臨時(shí)表來(lái)訪問(wèn).

echo-ne"1\n2\n3\n"|clickhouse-client --query="SELECT count() FROM test.visits WHERE TraficSourceID IN _data"--external --file=- --types=Int8

849897

cat /etc/passwd|sed's/:/\t/g'|clickhouse-client --query="SELECT shell, count() AS c FROM passwd GROUP BY shell ORDER BY c DESC"--external --file=- --name=passwd --structure='login String, unused String, uid UInt16, gid UInt16, comment String, home String, shell String'

/bin/sh20

/bin/false5

/bin/bash4

/usr/sbin/nologin1

/bin/sync1

當(dāng)使用HTTP接口時(shí)宵膨,外部數(shù)據(jù)以multipart / form-data格式傳遞架谎。 每個(gè)表作為一個(gè)單獨(dú)的文件傳輸。 表名取自文件名柄驻。 'query_string'傳遞參數(shù)'name_format'狐树,'name_types'和'name_structure',其中name是這些參數(shù)對(duì)應(yīng)的表的名稱(chēng)鸿脓。 參數(shù)的含義與使用命令行客戶(hù)端時(shí)相同抑钟。


cat /etc/passwd|sed's/:/\t/g'> passwd.tsv

curl -F'passwd=@passwd.tsv;''http://localhost:8123/?query=SELECT+shell,+count()+AS+c+FROM+passwd+GROUP+BY+shell+ORDER+BY+c+DESC&passwd_structure=login+String,+unused+String,+uid+UInt16,+gid+UInt16,+comment+String,+home+String,+shell+String'

/bin/sh20

/bin/false5

/bin/bash4

/usr/sbin/nologin1

/bin/sync1

對(duì)于分布式查詢(xún)處理, 臨時(shí)表被發(fā)送到所有的遠(yuǎn)程服務(wù)器.

版權(quán)聲明:本文版權(quán)歸@神州云聯(lián)科技有限公司所有,未經(jīng)允許任何單位或個(gè)人不得轉(zhuǎn)載野哭,復(fù)制或以任何其他方式使用本文全部或部分在塔,侵權(quán)必究。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拨黔,一起剝皮案震驚了整個(gè)濱河市蛔溃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖贺待,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徽曲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡麸塞,警方通過(guò)查閱死者的電腦和手機(jī)秃臣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哪工,“玉大人奥此,你說(shuō)我怎么就攤上這事⊙惚龋” “怎么了稚虎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)偎捎。 經(jīng)常有香客問(wèn)我蠢终,道長(zhǎng),這世上最難降的妖魔是什么鸭限? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任蜕径,我火速辦了婚禮,結(jié)果婚禮上败京,老公的妹妹穿的比我還像新娘兜喻。我一直安慰自己,他們只是感情好赡麦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布朴皆。 她就那樣靜靜地躺著,像睡著了一般泛粹。 火紅的嫁衣襯著肌膚如雪遂铡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天晶姊,我揣著相機(jī)與錄音扒接,去河邊找鬼。 笑死们衙,一個(gè)胖子當(dāng)著我的面吹牛钾怔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒙挑,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宗侦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了忆蚀?” 一聲冷哼從身側(cè)響起矾利,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤姑裂,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后男旗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體舶斧,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年剑肯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了穴吹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片典蝌。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡皱蹦,死狀恐怖堡纬,靈堂內(nèi)的尸體忽然破棺而出望忆,到底是詐尸還是另有隱情轧房,我是刑警寧澤丑婿,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布称龙,位于F島的核電站胰坟,受9級(jí)特大地震影響因篇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笔横,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一竞滓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吹缔,春花似錦商佑、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至晚碾,卻和暖如春抓半,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背格嘁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工笛求, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糕簿。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓探入,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親冶伞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子新症,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容