Aptissimum interface in mundo* explicamus omnia videndi

Aptissimum interface in mundo* explicamus omnia videndi 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 yourROCK

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; https://github.com/YuriyNasretdinov/logscli (350 lineas ex codice Go excerpsit).

occasiones

Propositum erat interfaciem facere, ut familiare videretur iis qui cauda/grep, id est, sequentia sustinerent:

  1. Omnes trabes sine eliquare.
  2. Relinquere lineas quibus certum substring (vexillum -F у grep).
  3. Relinquere lineas quae aequant expressionem regularem (vexillum -E у grep).
  4. Defaltam, intuitus est ordine praepostero chronologico, cum recentiores tigna plerumque de usuris primi sint.
  5. Monstra contextum iuxta lineam quamque (optiones -A, -B и -C у grep, typis N lineis ante, post, et circa singulas lineas congruentes, respective).
  6. View ineuntes omnia in reali tempore, cum aut sine eliquare (se tail -f | grep).
  7. Interface compatible cum less, head, tail et alii per defaltam redditi proventuum suorum sine restrictione; lineae impressae sunt ut rivulus dum recipiendis utentis interest; signum SIGPIPE tacite interrumpunt stipes effusis sicut faciunt tail, grep et aliis Unix utilitatibus.

Реализация

Ponam te iam aliquo modo scire quomodo ligna strepita tradas. Sin minus, commendare conatur Libra и catulusEt hunc articulum de iniuriarum traditio.

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. recognitiones res de Amazon usque ad MMXV. Utique eorum structura non prorsus eadem est ac materiarum textuum, sed ad illustrationem proposita haec non magni momenti sunt.

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 10exacte 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; signum SIGPIPE accipit, quod programmata tacite terminat per defaltam.

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 https://github.com/YuriyNasretdinov/logscli. Libenter libenter audias cogitationes tuas de idea mea pro solacio interface ad videndi omnia innixa in ClickHouse.

Source: www.habr.com

Add a comment