
表引擎介紹:
ClickHouse表引擎決定了如下幾個(gè)方面:
怎樣存儲(chǔ)數(shù)據(jù) -將數(shù)據(jù)寫到哪里, 怎樣讀取數(shù)據(jù).
支持何種查詢以及怎樣支持.
并發(fā)數(shù)據(jù)訪問(wèn).
索引的使用.
是否多線程的請(qǐng)求執(zhí)行是可以的.
數(shù)據(jù)如何同步.
當(dāng)讀取數(shù)據(jù)時(shí), 引擎只需要抽取必要的列簇. 然而,在一些場(chǎng)景下,查詢可能在表引擎中是半處理狀態(tài).
在大多數(shù)場(chǎng)景中, 我們所使用的引擎主要是 MergeTree 家族.
External data for query processing
ReplicatedAggregatingMergeTree
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
### TinyLog引擎
TinyLog 是最簡(jiǎn)單的表引擎, 它將數(shù)據(jù)保存到磁盤. 每個(gè)字段都以單獨(dú)壓縮文件形式保存. 當(dāng)寫入數(shù)據(jù)時(shí), 數(shù)據(jù)追加到文件的末尾.
并發(fā)數(shù)據(jù)訪問(wèn)不限制任何形式:
如果你同時(shí)對(duì)此表進(jìn)行讀寫,如從表中讀取數(shù)據(jù)的同時(shí)寫入數(shù)據(jù)到此表,那么讀操作將會(huì)報(bào)錯(cuò).
如果同時(shí)并行往表里寫入數(shù)據(jù),那么數(shù)據(jù)將損壞.
使用此表的標(biāo)準(zhǔn)方式是一次寫入:一寫多讀的應(yīng)用場(chǎng)景。查詢?cè)趩蝹€(gè)流中執(zhí)行。換句話說(shuō),本引擎適合很多小表操作(100萬(wàn)行左右的表)。如果你有很多小表,那么適合于使用本引擎,它比Log更簡(jiǎn)單(使用文件更小)。當(dāng)你有大量小表的時(shí)候,你可以使用 TinyLog 引擎來(lái)存儲(chǔ)這些數(shù)據(jù),和進(jìn)行下一步查詢服務(wù)。另外,索引不支持 TinyLog 引擎
TinyLog 表經(jīng)常作為中間表,用于數(shù)據(jù)的微批量處理.
### Log引擎
Log 區(qū)別于 TinyLog ,小文件的標(biāo)記 "marks" 保留在列文件中. 這些標(biāo)記寫到每個(gè)數(shù)據(jù)塊中 ,包含偏移量,在哪開始讀文件,跳過(guò)特定的行數(shù). 此機(jī)制可以多線程并行讀取表中的數(shù)據(jù). 對(duì)于并發(fā)數(shù)據(jù)訪問(wèn), 讀操作能夠同時(shí)執(zhí)行,而寫操作將阻塞讀操作,或者讀寫操作互相阻塞.? Log 引擎不支持索引. 與之類似的是, 如果寫入到數(shù)據(jù)表失敗, 則表將損壞, 從表中讀取數(shù)據(jù)將返回錯(cuò)誤. Log 引擎適合存儲(chǔ)臨時(shí)數(shù)據(jù), 一次寫入表, 或者用于測(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): 讀寫數(shù)據(jù)操作互相不受影響. 但數(shù)據(jù)索引不支持. 讀取數(shù)據(jù)是并行執(zhí)行的. 因?yàn)闊o(wú)磁盤讀寫, 壓縮/解壓縮, 和序列化/反序列化操作,因此單個(gè)SQL語(yǔ)句查詢可達(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í)表查詢和實(shí)現(xiàn) GLOBAL IN 操作.
### MergeTree引擎
MergeTree 引擎支持索引,通過(guò)主鍵和日期來(lái)構(gòu)建索引, 同時(shí)提供 數(shù)據(jù)的實(shí)時(shí)更新能力. 這是目前 ClickHouse處理能力最好的引擎. 注意:不要和 Merge 引擎相混淆.
此引擎接收下面的參數(shù): 包含日期的 Date 類型字段, 一個(gè)樣本表達(dá)式 (可選), 一個(gè)元組定義了表的主鍵和索引粒度.
無(wú)樣本支持示例語(yǔ)句.
MergeTree(EventDate, (CounterID, EventDate), 8192)
有樣本支持示例語(yǔ)句.
MergeTree(EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID)), 8192)
一個(gè)合并樹(MergeTree)表必須有一個(gè)單獨(dú)的字段包含日期. 因此, 它是 EventDate 列. 此日期列必須有 'Date' 類型 (不是 'DateTime' 類型).
主鍵可能是一個(gè)元組,任意的表達(dá)式 (字段的組合), 或者是一個(gè)單獨(dú)的表達(dá)式.
樣本表達(dá)式可以是任意表達(dá)式. 它也必須用主鍵來(lái)表示. 本示例使用了用戶 IDs 的哈希偽隨機(jī)在表中分布數(shù)據(jù). 換句話說(shuō), 當(dāng)使用 SAMPLE 語(yǔ)句時(shí), 你可以為用戶的子集數(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" 也可以寫到每個(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í)行查詢;為特定的跟蹤標(biāo)簽和日期范圍執(zhí)行查詢;為特定的跟蹤標(biāo)簽和日期執(zhí)行查詢;為帶有日期范圍的多個(gè)跟蹤標(biāo)簽執(zhí)行查詢,等等;
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ù)的查詢速度也十分高效,和全表掃描的速度相差無(wú)幾。
下面的示例,將不使用索引.
SELECT count() FROM table WHERE CounterID = 34 OR URL LIKE '%www.baidu.com%'
當(dāng)執(zhí)行查詢過(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è)僅有日期條件的查詢,不指定主鍵,將導(dǎo)致更多的數(shù)據(jù)被查詢出來(lái).
對(duì)于并發(fā)表訪問(wèn), 我們將使用多版本方式. 換句話說(shuō), 當(dāng)一個(gè)表同時(shí)進(jìn)行讀寫操作時(shí),數(shù)據(jù)將從數(shù)據(jù)分片中讀取,? 讀寫操作是無(wú)鎖機(jī)制的,數(shù)據(jù)插入操作不影響數(shù)據(jù)讀取操作.
在表中的數(shù)據(jù)讀取是自動(dòng)并行處理的。
支持?OPTIMIZE?查詢, 它可調(diào)用一個(gè)外部合并步驟.
你可以使用一張大表,持續(xù)添加數(shù)據(jù)到大表中? –那么 MergeTree 是適合的.
數(shù)據(jù)同步可用于 MergeTree 引擎的所有表類型.
Kafka
表引擎的后臺(tái)為Kafka,Kafka 作為流數(shù)據(jù)平臺(tái)具備三中關(guān)鍵能力:
它讓你發(fā)布和訂閱記錄數(shù)據(jù)流。它類似消息隊(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)者群組名稱(group1).
每個(gè)消費(fèi)者群組的偏移量被追蹤,如果你想要跨集群一次性消費(fèi)消息,你應(yīng)該使用相同的群組名稱
format - 格式的名稱,用于反序列化消息. 它接受了相同的值作為 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)程中開始消費(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ù)寫入到內(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ù)名稱不同,你能夠使用常量表達(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 中刷新,寫入到目標(biāo)表,如果所有的‘min’條件或者最少一個(gè)‘max’條件組合時(shí)。
min_time, max_time - 從第一次寫入到 buffer 的時(shí)間。
min_rows, max_rows - 在 buffer 中的行數(shù)。
min_bytes, max_bytes - 在 buffer 中字節(jié)的數(shù)量。
在寫入操作的過(guò)程中,數(shù)據(jù)寫入到一個(gè)‘num_layers’數(shù)的隨機(jī) buffers 中。或者,如果插入的數(shù)據(jù)部分足夠大(大于 ‘max_rows’ 或者 ‘max_bytes’),它被直接寫入到目標(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ì)值. 示例如回話更新日志, 或者用戶歷史更新日志.在 Yandex.Metrica回話是不斷在變化的. 例如, 每個(gè)回話點(diǎn)擊數(shù)的增加. 我們引用任意對(duì)象的變化作為一個(gè)變更對(duì)兒 (?old values, ?new values). 如果對(duì)象是創(chuàng)建的, 舊的值可能會(huì)丟失. 如果對(duì)象被刪除,新的值可能被丟失. 如果對(duì)象發(fā)生變化, 但是之前存在的沒有被刪除,也則兩個(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í),唯一訪客并沒有被刪除.
這是讓Yandex.Metrica實(shí)時(shí)工作的關(guān)鍵技術(shù)點(diǎn)。
CollapsingMergeTree接受一個(gè)額外的參數(shù) -?Int8-type類型列的名稱包含了行的標(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ù)行匹配,則寫入第一個(gè)負(fù)行和最后一個(gè)正數(shù)行。 如果還有一個(gè)正數(shù)行比負(fù)數(shù)行多,則只寫入最后一個(gè)正數(shù)行。 如果負(fù)數(shù)的行比正數(shù)行多,只有第一個(gè)負(fù)數(shù)行被寫入。 否則,將會(huì)出現(xiàn)邏輯錯(cuò)誤,并且不會(huì)寫入任何行。 (如果日志的同一部分意外插入了多次,則會(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ù)編寫一個(gè)查詢來(lái)解釋符號(hào)。 例如,要計(jì)算數(shù)量,請(qǐng)寫'sum(Sign)'而不是'count()'。 要計(jì)算一些東西的總和,寫下'sum(Sign * x)'而不是'sum(x)',等等,并且加上'HAVING sum(Sign)> 0'。 并非所有金額都可以這樣計(jì)算。 例如,集合函數(shù)“min”和“max”不能被重寫。
2.如果您必須提取數(shù)據(jù)而不進(jìn)行聚合(例如,要檢查是否存在行的最新值符合某些條件),則可以對(duì)FROM子句使用FINAL修飾符。 這種方法效率顯著較低。
分布式引擎
分布式引擎本身不存儲(chǔ)數(shù)據(jù),但允許在多個(gè)服務(wù)器上進(jìn)行分布式查詢處理。 讀取是自動(dòng)并行的。 在讀取數(shù)據(jù)期間,使用遠(yuǎn)程服務(wù)器上的表索引(如果有的話)。 分布式引擎接受參數(shù):服務(wù)器配置文件中的集群名稱,遠(yuǎn)程數(shù)據(jù)庫(kù)的名稱,遠(yuǎn)程表的名稱以及(可選)分片鍵。 例:
Distributed(logs, default, hits[, sharding_key])
從位于群集中每個(gè)服務(wù)器上的“default.hits”表中的“l(fā)ogs”群集中的所有服務(wù)器讀取數(shù)據(jù)。 數(shù)據(jù)不僅被讀取,而且在遠(yuǎn)程服務(wù)器上被部分處理。 例如,對(duì)于使用GROUP BY的查詢,將在遠(yuǎn)程服務(wù)器上聚合數(shù)據(jù),聚合函數(shù)的中間狀態(tài)將發(fā)送到請(qǐng)求者服務(wù)器。 那么數(shù)據(jù)將被進(jìn)一步聚合。
您可以使用返回字符串的常量表達(dá)式來(lái)代替數(shù)據(jù)庫(kù)名稱。 例如,currentDatabase()。
logs - 服務(wù)器配置文件中的群集名稱。
集群被設(shè)置如下:

在這里,一個(gè)集群被定義為由兩個(gè)分片組成的名稱“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ī)”,“端口”和可選:“用戶”,“密碼”。
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 - 用戶名連接到遠(yuǎn)程服務(wù)器。 默認(rèn)情況下,用戶是“默認(rèn)”。 該用戶必須具有訪問(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ù)器的連接沒有建立,則會(huì)嘗試一個(gè)短超時(shí)的連接。 如果連接失敗,下一個(gè)副本將被選中,以此類推。 如果所有副本的連接嘗試失敗,嘗試將以相同的方式重復(fù)幾次。 這有利于彈性伸縮,但不提供完整的容錯(cuò)能力:遠(yuǎn)程服務(wù)器可能會(huì)接受連接,但可能無(wú)法正常工作或工作不正常。
查詢外部數(shù)據(jù)
ClickHouse允許向服務(wù)器發(fā)送處理查詢所需的數(shù)據(jù)以及SELECT查詢。 這些數(shù)據(jù)放在一個(gè)臨時(shí)表中(請(qǐng)參見“臨時(shí)表”一節(jié)),并可以在查詢中使用(例如,在IN操作符中)。
例如,如果您的文本文件包含重要的用戶標(biāo)識(shí)符,則可以將其與使用此列表過(guò)濾的查詢一起上傳到服務(wù)器。如果您需要使用大量外部數(shù)據(jù)運(yùn)行多個(gè)查詢,請(qǐng)不要使用此功能。 提前將數(shù)據(jù)上傳到數(shù)據(jù)庫(kù)最好。
可以使用命令行客戶端(非交互模式)或使用HTTP接口上傳外部數(shù)據(jù)。
在命令行客戶端中,可以使用格式指定參數(shù)部分。
--external --file=...[--name=...][--format=...][--types=...|--structure=...]
對(duì)于正在傳輸?shù)谋頂?shù)量,您可能有多個(gè)這樣的部分。
-?external - 標(biāo)記節(jié)的開始。 -file - 使用表轉(zhuǎn)儲(chǔ)的文件路徑,或 - 引用stdin的路徑只能從stdin中查詢單個(gè)表。
以下參數(shù)是可選的:-name - 表的名稱。 如果省略,則使用_data。 -format - 文件中的數(shù)據(jù)格式。 如果省略,則使用TabSeparated。
文件通過(guò)file進(jìn)行指定,通過(guò)format解析成特定的格式, 使用類型或結(jié)構(gòu)中指定的數(shù)據(jù)類型。表將被上傳到服務(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)的表的名稱。 參數(shù)的含義與使用命令行客戶端時(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ì)于分布式查詢處理, 臨時(shí)表被發(fā)送到所有的遠(yuǎn)程服務(wù)器.
版權(quán)聲明:本文版權(quán)歸@神州云聯(lián)科技有限公司所有,未經(jīng)允許任何單位或個(gè)人不得轉(zhuǎn)載,復(fù)制或以任何其他方式使用本文全部或部分,侵權(quán)必究。