ααααα·αααΎα’αααααααΆααααααΎα ααα»α αααααΆαααααααΆαααΎααααΈααΎααααααα ααα» αααα’ααααααα ααααΆααΆαααααααααΆααααΈααααααα ααΆααααααΆ α ααα»α αααααΆααααΆαααααααΆαααΆαααααΆα α αΎα (ααΆααΉαααΆαα) αα·αααΆααααα½α αα·αααααΎαααα α’αααβααααβα’αΆα βααααΎβααΆα ααααβαα·αβααΆβα’αΆαααααβααΆαα ααα»ααααβααΆβα αΆααβααΌα βααΆβαααα»αβααΆβα ααα»ααβααβαααα αΆβααΆααβα’ααβααΊβααΆβααΎαβαα·αβαα·αβαα·α αα ααΆαβααβααΆαβααΎαβαααααβα ααα»βαα·αβααααΉαααααΌαα ααΎαβααααΆααΆαβαααααΎαβα ααα»α βαααααΆααβαααααΆαβααα CLI (α ααα»α βαααααΆααβαααααΆααβααΆαααβαααααΆ) ααααΎαααΆαααΆαααααααααΎαα αααα»αααααΆααααΆαααΆαα»αααΆαααΆαααααα»αααΆαααααΎααΆαααΆαα½α tail, grep, awk αα·ααααααααα ααΌα ααααα αΎααααααΆαααααα»α α ααα»α αααααΆααααααα’αααααΆααααααΎααΆαααΆαα½ααααααα ααα»ααΉαααΆα’αααΈαα½αααααααααααα ααΉα tail αα·α grep ααα»ααααααΆααα’αΆα ααααΌαααΆαααααΎααΎααααΈα’αΆααααααα ααα»αααααΆαααααΈαααΆαααΈαααααΆα αααΎαα αααααΊααΆααΆααα·αααΆαα α’αΆααα½αααΆααΈ ClickHouse!
* ααααα
ααΆααααα·αααααΆαααααα½αααααα’αααααααΎ habra
αα½α logscli
αααα»ααα·αααΆααααααΎαααααααααααΆααα
ααα»α
αααααΆαααααααααα»ααα α αΎααα·ααΆαα±ααααααααα
ααΆααΆαααααααααΆααααΌ ααα»ααααααααα·αααΎα’αααα
ααααΎαααΌααααααααααΆααααα α’αααααααΌαααΆαααααΆααααα
αααααααα·ααα
ααααα αααααααα»αααΊααΎααααΈαααααΎαα ααα»α αααααΆαααα½ααααα αΆααααΌα ααΆαααΆαααΉαα’ααααααααααΆααααααΎααΎααααΈααααα»α / grep αααααΊααΎααααΈααΆααααα’αααΈαααΌα ααΆααααααα
- ααΎααααααα ααα»ααΆααα’αα ααααα·αα αΆαααΆα αααααα
- αα»ααααααΆαααααααΆαααααα’ααααααααα (ααα
-F
Ρgrep
). - αα»ααααααΆαααααααααΌαααΉαααααααααααααΆ (ααα
-E
Ρgrep
). - ααΆαααααΆαααΎα ααΆαααΎαααΊαααα·ααα αααα»αααααΆααααααααααα αααΆαα αααααΆααααααα ααα»ααααΈαααΆαα αααΎααααααα αΆααα’αΆααααααααΆαα»ααα·αα
- αααα αΆαααα·αααα
ααΆααααΉααααααΆααααΈαα½αα (αααααΎα
-A
,-B
ΠΈ-C
Ρgrep
ααααα»ααα N αααααΆαααα»α αααααααα αα·ααα»ααα·ααααααΆαααααααααΌαααααΆαααααααα½α)α - ααΎαβαααααα ααα»βα
αΌαβαααα»αβαααβαα·αβααααΆααβαααβααΆαβα¬βααααΆαβααΆαβαααα (ααααΆαα
tail -f | grep
). - α
ααα»α
αααααΆααααααΌαααααααΌαααααΆααΆαα½α
less
,head
,tail
αα·αα’ααααααααααα - ααΆαααααΆαααΎα αααααααα½ααααααααααααα·ααααααααΆαααΆαααΉααααααΉαααΎααααααααα½αααα αααααΆααααααΌαααΆαααααα»αααααΆααααααΈααααΆαααΆα’αααααααΎααααΆααα αΆααα’αΆαααααααααα»αααΆαααα½ααα½αααα αααααΆSIGPIPE
αα½αααααααΆαααΆαααααααΈααααααα ααα»ααααααααααααΆαα ααΌα αα½αααααααtail
,grep
αα·αα§αααααααααΎααααΆααααΌααΈαααααααααα
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
αααα»αααΉαααααααααΆα’αααααΉαααΈαααααααααΌααααααα ααα»αα
ClickHouse αα½α
α αΎαα ααΎαα·αααΌα
αααααααααα»αααΌαααααΆαα±ααααΆαααααααΆα
ααααΌαα’αααααααΌααααααα α α·αααααΎαααααααΆαααααΌαααααΆαα αααααΆαααΆααααααΆα’αααα ααααα½ααααααα ααα»αααααααααααΆααααααααΆ ααΆα αΆααααΌα ααΆααα ααα»αααααα»αααΆααααααΆαα»αααΆααΆααααααααα ααααα·αααΎααΆααααααααααααα ααα»ααΆα αααΎα α αΎααα½αααΆαα»αααααααΆααααααααΌα ααααΆ αααα’αααα’αΆα αααααΎααααααααααααα ααα»ααΆαα½αααΈαα½αααααα αααα - ααΆααΉαα’αα»ααααΆαα±ααα’αααααΆαααΆααΆααα½ααααα½αα±ααα ααα½αααΆα αααΎα αααααΆααΉαααΆααΆαααΌααααα ααα ααΆααααα αΌααα αααα»α ClickHouse (αα ααΎαααΆαααΈααααααααΆαααααΆαααααΉα ααΆααααΌαααΆαααααΆαα±αααααα αΌααα·αααααααα·αααΎαααΈ ~ 1 αααααα»ααα½ααα·ααΆααΈ αααααΆαααααΆαααΈαααααΆααααΌα).
αααααΊααΎαααααΌαααΆααααααααΆαααααΆααΆαααΌα ααΆαααααα:
CREATE TABLE logs(
category LowCardinality(String), -- ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ Π»ΠΎΠ³ΠΎΠ² (ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ)
time DateTime, -- Π²ΡΠ΅ΠΌΡ ΡΠΎΠ±ΡΡΠΈΡ
millis UInt16, -- ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Ρ (ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈ ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄Ρ, ΠΈ Ρ.Π΄.): ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Ρ
ΡΠ°Π½ΠΈΡΡ, Π΅ΡΠ»ΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΌΠ½ΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π±ΡΠ»ΠΎ Π»Π΅Π³ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡ ΡΠΎΠ±ΡΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ
..., -- Π²Π°ΡΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΏΠΎΠ»Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΡΠΎΠ²Π΅Π½Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅
message String -- ΡΠ΅ΠΊΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
) ENGINE=MergeTree()
ORDER BY (category, time, millis)
ααΆα’αα»αα αααα»ααα·αα’αΆα
ααααΆαααααΆααααΌααααααααΎαα
αα αααααΆααααααα ααα»ααΆαααααααααααααα»αα’αΆα
ααΆααα αα·αααΆαααααΆααα ααΌα
αααααααα»αααΆαααααΆααααααΎααΆα§ααΆα ααααααα½ααα·αα
ααΆαααααΆααααααΆααααΆααααα ααααΆααα·αα·αααααΎα Amazon αα ClickHouse
ααααααααΎαααΆααΆαα
CREATE TABLE amazon(
review_date Date,
time DateTime DEFAULT toDateTime(toUInt32(review_date) * 86400 + rand() % 86400),
millis UInt16 DEFAULT rand() % 1000,
marketplace LowCardinality(String),
customer_id Int64,
review_id String,
product_id LowCardinality(String),
product_parent Int64,
product_title String,
product_category LowCardinality(String),
star_rating UInt8,
helpful_votes UInt32,
total_votes UInt32,
vine FixedString(1),
verified_purchase FixedString(1),
review_headline String,
review_body String
)
ENGINE=MergeTree()
ORDER BY (time, millis)
SETTINGS index_granularity=8192
αα αααα»ααααα»ααα·αααααα Amazon ααΆαααααΆαααα·α αααααααααΆααααΆααα·αα·αααα‘αΎααα·α ααα»αααααα·αααΆααααααααΆα αααΆααααΆαααα ααΌα ααααααΌαααααααα·αααααααααααα randon α
α’ααααα·αα αΆαααΆα αααΆαααα―αααΆα tsv ααΆααα’αα α αΎαααΆααααααα·ααααα½αα―αααααΉα ~10-20 ααααΌαα‘αΎα ααΎααααΈααα½αααΆααααα»ααα·αααααααααααααααααΉααα·αααααΉα RAM ααα α 16 GB αααααα ααΎααααΈαααα»αα‘αΎαα―αααΆα TSV αααα»αααΆαααααΎααΆααααααααΆααΆααααααα
for i in *.tsv; do
echo $i;
tail -n +2 $i | pv |
clickhouse-client --input_format_allow_errors_ratio 0.5 --query='INSERT INTO amazon(marketplace,customer_id,review_id,product_id,product_parent,product_title,product_category,star_rating,helpful_votes,total_votes,vine,verified_purchase,review_headline,review_body,review_date) FORMAT TabSeparated'
done
αα ααΎαααααααΆα Persistent Disk (αααααΆ HDD) αα αααα»α Google Cloud αααααΆαααα α 1000 GB (αααα»αααΆαααααα ααααααΆα ααααααΎααααΈα±ααααααΏααααααααΆαααααα·α ααΎαααααΈααΆ SSD ααααα ααααααααΌαααΆαααΉαααΆαααααααααααΆαααααα) ααΆαα’αΆααα‘αΌα ααααΏαααΊαααα αα ~ 75 MB / αα·ααΆααΈαα ααΎ 4 cores α
- αααα»αααααΌαααααααΎααΆαααααα»αααααααα»αααααΎααΆααα Google ααα»αααααααα»αααΆαααααΎααααΈααααΆαααααα½α α αΎαα’αααααααααα·αααΆαααΆαααααααααΉαααΆαααΆααααααααα»ααα αααα»αα αα»ααα
αααα»αααΉαααα·αααΌαααΆαααΆααα’ααααΆαα½αααΉααααα»ααα·αααααααα·αααααα ααααααααααΆα’αααΈααααααα»αααΆααα αααα»αααα
αααα αΆαααααΎαααΆαααααααα·αααααα
αααααΆααα
αααα»α ClickHouse ααΎαααΉαααααΎααΆαααααααααααααα
ααΎαα»αααααΆααααααα ααα» α αΎαααααα·ααααα·ααΆααααα’αΆα
α
αααΆααααα
αααΎα α αΎααααα ααααΆαα·ααααααΎαααααααααΆαα½ααααα»αααααααααΌα ααααα·αααΎααΆαααααΌααααααΈαααΈααααΌαααΆαααααΎα ααΆαα½αααα’αΆα
αααα αΆα ααααΎαααΆααααααα½ααα αΌαααααα½αααΈαα½ααααααΆαααααααααααΌαααΆαααα½αα ααΎααααΈααααΎααΌα
αααααΆααααΆαααΆαααααααα
αααα»αα
ααα»α
αααααΆαα HTTP αααα’αα»ααααΆαα±ααα’αααααααΎαααααααΆααα
αααα»αααααααΆ HTTPα send_progress_in_http_headers=1
. ααΆα’αα»αα αααααΆααα Go αααααααΆααα·αα’αΆα
α’αΆαααααααΆααΌα
ααααα½αααααααΌαααΆαααα½ααα ααα»ααααα
ααα»α
αααααΆαα HTTP 1.0 (αα·αααααΌαα
ααα‘αααΆαα½α 1.1!) ααααΌαααΆαααΆααααααα ClickHouse ααΌα
ααααα’αααα’αΆα
ααΎαααΆααααααΆαα TCP αα
αα
ClickHouse α αΎαααααΎααΆαα
ααΈαααα GET /?query=... HTTP/1.0nn
α αΎαααα½αααΆαααααααΆ αα·ααα½ααααΆαααααΎαααααααα·αααΆαααΆαααα
α
αα α¬ααΆαα’αα·αααααΈαααΆαα½αα‘αΎα ααΌα
αααααααα»αααααΈααα ααΎααα·αα
αΆαααΆα
αααααΎαααααΆααααααααααΆαααα
ααΆαααααΆααααααα ααα»ααΈ ClickHouse
ClickHouse ααΆαααΆααααααΎαααααα·αααααΆααααααΆαααααα½αααΆαα½α ORDER BY α’ααααααααααΆααΌαααα αΎα (α αΆααααΆααααΈααααΆα 2019?) ααΌα αααααααα½αααΌα ααΆ
SELECT time, millis, message
FROM logs
WHERE message LIKE '%something%'
ORDER BY time DESC, millis DESC
ααΆααΉαα αΆααααααΎααααα‘αααααααΆαααααααΆαααααα’αααααα "α’αααΈαα½α" αα αααα»αααΆαααααΆαα ααααα·αα αΆαααΆα ααααα αΆαααΆαααααααααα αααααααα
ααΌα
ααααΆααααααααααΆααΉαααΆαααΆαααΆααααα½αααααα·αααΎ ClickHouse αααα½αααΆαα»αα
ααααααΎαα
ααααααααΆααααααΆαααα
ααΆααααΌαααΆααα·α ααα»ααααααααα·ααααααΆα₯αα·ααΆααααααΆαααΎααααααα ααΆααα»αα
ααααααΎαααααααααααααααα·α’αΆα
ααααΌαααΆαααΎααααααααΎαααααΎα cancel_http_readonly_queries_on_client_close=1
.
ααΆααααααααααααααΉαααααΌααα SIGPIPE αα αααα»α Go
αα
αααα’αααααααα·ααααα·ααΆααααααααΆ some_cmd | head -n 10
αααααααααΆααααααααΆ some_cmd
ααααααααΆαααααα·ααααα·αα
αααααΆ head
αα α‘α αα½α? α
ααααΎαααΊααΆααααα αααααΆ head
α
α»ααααα
αα αααααααΉααα·α α αΎα stdout ααααΆααααααααΆ some_cmd α
αΆααααααΎαα
ααα’α»αααΆααααααααα "αα
ααααααααΆ"α αααααΆβ some_cmd
ααααΆααΆαααααααα
ααααααα·α
αα αααα»α Go ααΆααΎαα‘αΎαααΆαααααΆαααΎα ααα»ααααα§ααααααααααααΆααααααΆ SIGPIPE ααααααα»ααα "αααααΆ: SIGPIPE" α¬ααΆαααααααααααΆαα α α»ααααα αα α αΎαααΎααααΈαα»αααΆαααα ααΎαααααΆααααααααΌαααΆααααααααΆα SIGPIPE αααα½αααΎαααΆααα·ααΈαααααΎαα ααααΆα αααααΊααααΆααααααααΆααααα»αααααα α ααα
ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGPIPE)
go func() {
<-ch
os.Exit(0)
}()
αααα αΆαααα·ααααΆα
ααΆααΉαααΆααα’αααα
ααααΎαααα·αααααααα α»ααα½αα
ααα½αααΆαααΎαα‘αΎα (α§ααΆα ααα ααααΎααααααααΆαα±ααααΆαααΆααααααααααααα α¬αααα αΆαααααΆαααααααααααΌαααΆαααΎαααΎααα»ααααααΆαα) αα·ααα
αααα»α grep
αααααααΌαααΆαααααΎαααααααΎαααααΎα -A, -B, αα·α -C ααααααα αΆαα
ααα½ααααααΆαααααααΆααααααΆαααααααΆααααΈ αα»α αα·ααα»ααα·αααΆααααααααα½αα
ααΆα’αα»αα αααα»ααα·αααΆαααααΎααα·ααΈααΆααααα½ααααα»αααΆαααααΎααΌα ααααΆααααα αααα»α ClickHouse αα ααΌα ααααααΎααααΈαααα αΆαααα·αα ααααΎααααααααααααααααΌαααΆαααααΎαα ααΆαααααααΆααααΈαα½αααααααααα (ααααααΆααααα’α·αα’αΆαααααααΎααΆααααααα αα·αααΆααΎααα·ααααααΌαααΆααααα αΆαααΈαα»αα¬α’ααα α¬αααααΆααααΈ):
SELECT time,millis,review_body FROM amazon
WHERE (time = 'ΠΠ ΠΠΠ―_Π‘ΠΠΠ«Π’ΠΠ―' AND millis < ΠΠΠΠΠΠ‘ΠΠΠ£ΠΠΠ«_Π‘ΠΠΠ«Π’ΠΠ―) OR (time < 'ΠΠ ΠΠΠ―_Π‘ΠΠΠ«Π’ΠΠ―')
ORDER BY time DESC, millis DESC
LIMIT ΠΠΠΠΠ§ΠΠ‘Π’ΠΠ_Π‘Π’Π ΠΠ_ΠΠΠΠ’ΠΠΠ‘Π’Π
SETTINGS max_threads=1
αααααΆαααααΎααααΌαααΆαααααΎααααΎαααααααΆαααααααΆααααΈ ClickHouse αααα‘αααααααΆαααααααααΌαααααΆ ααΆαααα αααα αααα»αααααΆαααααααΆαα α αΎαααΆααΌαα ααααΎααααΌαααΆαααααα·ααααα·αααΆαααΏα α αΎαααααΎααααΆαααααΈααΈααΌαα·α αα½α (ααΆααααααΆααααΎααααΌαα αααΆαααααααα αα ~ 6 ms αα ααΎαααΆαααΈααα·αααα·ααααααααα»α)α
αααα αΆαααΆαααααΈαααα»ααααααΆααααααα
ααΎααααΈαααα αΆαααΆαα αΌααααααα»α (ααααΎααα) αααααααΆαα·α ααΎαααααΆααααα’αα»ααααααααΎαααααααααΆααααΈαααΈαα·ααΆααΈαααα αααα αα αΆαααααΆαααααααΆα α»αααααααααααΎαααΆααα½ααααααααΈαα»αα
α§ααΆα αααααΆααααααααΆ
ααΎααΆααααααααΆ logscli ααααααΆααΎααα ααΌα α’αααΈαα αααα»αααΆαα’αα»αααα?
ααααα·αααΎα’αααααΆαααΆααααααα»ααα·αααααα Amazon ααααααα»αααΆαααΎαα‘αΎααα ααΎαα’ααααα α’αααα’αΆα ααααΎαααΆαααΆααααααααΆααΌα ααΆααααααα
# ΠΠΎΠΊΠ°Π·Π°ΡΡ ΡΡΡΠΎΠΊΠΈ, Π³Π΄Π΅ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ ΡΠ»ΠΎΠ²ΠΎ walmart
$ logscli -F 'walmart' | less
# ΠΠΎΠΊΠ°Π·Π°ΡΡ ΡΠ°ΠΌΡΠ΅ ΡΠ²Π΅ΠΆΠΈΠ΅ 10 ΡΡΡΠΎΠΊ, Π³Π΄Π΅ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ "terrible"
$ logscli -F terrible -limit 10
# Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π±Π΅Π· -limit:
$ logscli -F terrible | head -n 10
# ΠΠΎΠΊΠ°Π·Π°ΡΡ Π²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ, ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈΠ΅ ΠΏΠΎΠ΄ /times [0-9]/, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π΄Π»Ρ vine ΠΈ Ρ ΠΊΠΎΡΠΎΡΡΡ
Π²ΡΡΠΎΠΊΠΈΠΉ ΡΠ΅ΠΉΡΠΈΠ½Π³
$ logscli -E 'times [0-9]' -where="vine='Y' AND star_rating>4" | less
# ΠΠΎΠΊΠ°Π·Π°ΡΡ Π²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΡΠΎ ΡΠ»ΠΎΠ²ΠΎΠΌ "panic" ΠΈ 3 ΡΡΡΠΎΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π²ΠΎΠΊΡΡΠ³
$ logscli -F 'panic' -C 3 | less
# ΠΠ΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΡΠΎ ΡΠ»ΠΎΠ²ΠΎΠΌ "5-star"
$ logscli -F '5-star' -tailf
ααα ααααΈααα
αααααΌαα§αααααααααΎααααΆαα (αααααααΆαα―αααΆα) ααΆααα
ααΎ github αα
ααααα: www.habr.com