Si quando interventus interretiatus ad tigna videnda usus es, tunc probabiliter animadvertisti quomodo hae interfaces gravia et (saepe) non admodum commoda et responsura sint. Quaedam consuescere potes, quaedam valde terribilia sunt, sed causa omnium problematum mihi videtur esse quod accedimus ad negotium recte spectandi: conamur interfaciem creare telam ubi CLI (mandati linea interface) meliora operatur. Ego personaliter valde commodus operando cum cauda, grep, awk et aliis, et ideo mihi specimen interface ad operandum cum lignis simile esset caudae et grep, sed quod etiam utendum erat ut legerem tigna quae a multis servientibus oriebantur. Hoc est, sane lege eas de ClickHouse!
* Secundum personalis sententia habra user
Occursum logscli
Nomen meum non accessi interfaciei, et, ut honestum est, magis est in forma prototypi, sed si vis statim videre fontem codici, tunc es gratus;
occasiones
Propositum erat interfaciem facere, ut familiare videretur iis qui cauda/grep, id est, sequentia sustinerent:
- Omnes trabes sine eliquare.
- Relinquere lineas quibus certum substring (vexillum
-F
уgrep
). - Relinquere lineas quae aequant expressionem regularem (vexillum
-E
уgrep
). - Defaltam, intuitus est ordine praepostero chronologico, cum recentiores tigna plerumque de usuris primi sint.
- Monstra contextum iuxta lineam quamque (optiones
-A
,-B
и-C
уgrep
, typis N lineis ante, post, et circa singulas lineas congruentes, respective). - View ineuntes omnia in reali tempore, cum aut sine eliquare (se
tail -f | grep
). - Interface compatible cum
less
,head
,tail
et alii per defaltam redditi proventuum suorum sine restrictione; lineae impressae sunt ut rivulus dum recipiendis utentis interest; signumSIGPIPE
tacite interrumpunt stipes effusis sicut faciunttail
,grep
et aliis Unix utilitatibus.
Реализация
Ponam te iam aliquo modo scire quomodo ligna strepita tradas. Sin minus, commendare conatur
Primum opus est de turpi ratione diiudicare. Cum plerumque vis accipere acta tempore digesta, logicum videtur eas illo modo condere. Si multae categoriae stipes sunt et omnes eiusdem generis sunt, tunc potes categoriam facere sicut prima columna clavis primariae - hoc licebit tibi habere unam mensam pro pluribus, quod magnum erit cum plus. ClickHouse inserentes (in servientibus duris agitationibus commendatur inserere data non plus quam ~ 1 vicibus secundo nam tota server).
Hoc est, proxime sequenti schemate indigemus;
CREATE TABLE logs(
category LowCardinality(String), -- категория логов (опционально)
time DateTime, -- время события
millis UInt16, -- миллисекунды (могут быть и микросекунды, и т.д.): рекомендуется хранить, если событий много, чтобы было легче различать события между собой
..., -- ваши собственные поля, например имя сервера, уровень логирования, и так далее
message String -- текст сообщения
) ENGINE=MergeTree()
ORDER BY (category, time, millis)
Infeliciter, fontes apertos nullos reperire statim potui cum lignis realisticis quos arripere et extrahere potui, hoc loco exemplum cepi.
mandatis uploading Amazon recensiones ad ClickHouse
Faciamus mensam
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
In Amazonibus dataset dies recensionis tantum est, sed tempus exactum non est, ut hac notitia randon impleamus.
Quae omnia tsv imagini deponendi non habes et te primo ~10-20 finire in ut maiusculas notitias quae in 16 GB ipsius RAM non aptas capias. Ad upload lima TSV usus sum hoc mandatum:
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
In signo Orbis Pertinax (quod est HDD) in Google Cloud cum magnitudine 1000 GB (magnitudinem hanc maxime cepi ut celeritas paulo altior esset, quamvis fortasse SSD quantitatis inquisitae vilior fuisset) onerationis celeritas circiter 75 MB/sec in 4 coros erat.
- Reservationem facere debeam quam apud Google laboro, sed ratione personali usus sum et hic articulus nihil habet quod cum labore meo in societate
Exempla omnia proferam cum hoc particulari dataset, cum haec omnia mihi ad manum sint.
Ostende notitia progressio intuens
Cum in crypta strepita utemur ad mensam plenam cum lignis, et haec operatio notabile temporis spatium sumere potest nec aliquem eventum diu producere, si paucae par inveniantur, opportune demonstrare possimus. investigationis progressum donec primos ordines cum effectu recipiantur. Ad hoc efficiendum modulus est in instrumento HTTP quod permittit ut progressus in HTTP capitis mittere possis; send_progress_in_http_headers=1
. Infeliciter, vexillum Go bibliotheca non potest legere capita ut recipiuntur, sed HTTP 1.0 interfacies (non confundenda cum 1.1!) sustentatur per ClickHouse, ut nexum crudum TCP aperire possis ad ClickHouse et ibi mitte GET /?query=... HTTP/1.0nn
et responsionem capitis et corpus sine ulla effugia vel encryption accipimus, in hoc casu etiam bibliotheca norma uti necesse est.
Tigna ex ClickHouse streaming
ClickHouse Optimization pro queries cum ordine per longum tempus habuit (ex quo MMXIX?), ut quaesitum est sicut
SELECT time, millis, message
FROM logs
WHERE message LIKE '%something%'
ORDER BY time DESC, millis DESC
Statim incipiunt lineas redeuntes quae substringunt "aliquid" in nuntio suo, non expectato scan ad perficiendum.
Commodissimum etiam esset si ipsam petitionem ClickHouse resignavit cum connexio ad eam clausa erat, sed hoc non est habitus defalta. Automatic petitionem indultum, optione uti possit cancel_http_readonly_queries_on_client_close=1
.
Recta pertractatio SIGPIPE in Go
Cum feceritis, dicite, mandatum some_cmd | head -n 10
exacte quomodo mandatum some_cmd
sistit supplicium cum head
detractis 10 lineis? Responsum est simplex: cum head
desinit, fistula claudit, et firmus alicuius imperii _cmd incipit sub condicione, "nusquam" designare. cum some_cmd
conatur scribere tibia clausa;
In Go hoc quoque per defaltam accidit, sed signum SIGPIPE tracto etiam imprimit "signum: SIGPIPE" vel simile nuntium in fine, et ut hunc nuntium expurget quod modo opus est nobis tractandi SIGPIPE viam quam volumus, id est, modo tacite. exitus;
ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGPIPE)
go func() {
<-ch
os.Exit(0)
}()
Monstrare nuntius contextus
Saepe videre vis contextus in quo aliquis error incidit (exempli gratia, quae petitio terrorem attulit, vel problemata cognata ante fragorem apparebant), et in. grep
Hoc fit utentes optiones -A, -B, -C, quae numerorum linearum post, ante et circa nuntium relativum demonstrant.
Infeliciter, non inveni viam facilem ad idem faciendum in ClickHouse, ut ad contextum ostendendum, adiectio postulationis huius modi ad singulas lineas effectus mittitur (singula pendent a voluptua et an contextus ante monstratur. vel post);
SELECT time,millis,review_body FROM amazon
WHERE (time = 'ВРЕМЯ_СОБЫТИЯ' AND millis < МИЛЛИСЕКУНДЫ_СОБЫТИЯ) OR (time < 'ВРЕМЯ_СОБЫТИЯ')
ORDER BY time DESC, millis DESC
LIMIT КОЛИЧЕСТВО_СТРОК_КОНТЕКСТА
SETTINGS max_threads=1
Cum petitio emissa fere statim post ClickHouse redit ad debitam lineam, desinit in cella et generatim petitio satis cito conficitur et paululum CPU consumit (plerumque petitio de 6 ms in machina virtuali meo sumit).
Monstrare novas nuntios in real time
Ut epistulas advenientes in tempore reali ostenderemus, simpliciter instantiam exequimur semel in brevi tempore, memores ultimi indicationis quam ante congressi sumus.
Exempla imperium
Quid typicam logscli praecepta simile in usu?
Si Amazonem dataset quas in principio articuli rettuli, sequentia mandata currere potes:
# Показать строки, где встречается слово 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
References
Utilitas in codice (sine documento) est available in github at
Source: www.habr.com