Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Высокая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ β€” ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с большими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. ΠœΡ‹ Π² ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π‘Π±Π΅Ρ€Π΅ занимаСмся ΠΏΡ€ΠΎΠΊΠ°Ρ‡ΠΊΠΎΠΉ практичСски всСх Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² нашС Облако Π”Π°Π½Π½Ρ‹Ρ… Π½Π° Π±Π°Π·Π΅ Hadoop ΠΈ поэтому ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ с Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ большими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. ЕстСствСнно, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ всС врСмя ΠΈΡ‰Π΅ΠΌ способы ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΡ€ΠΎΠΏΠ°Ρ‚Ρ‡ΠΈΡ‚ΡŒ RegionServer HBase ΠΈ HDFS-ΠΊΠ»ΠΈΠ΅Π½Ρ‚, благодаря Ρ‡Π΅ΠΌΡƒ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния.
Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Однако, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ сути Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΎΠΊ, стоит ΠΏΡ€ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎ ограничСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ, Ссли ΡΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° HDD.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ HDD ΠΈ быстрыС Random Access чтСния нСсовмСстимы
Как извСстно, HBase, Π΄Π° ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π‘Π”, хранят Π΄Π°Π½Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ, Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π² нСсколько дСсятков ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это порядка 64 Кб. Π’Π΅ΠΏΠ΅Ρ€ΡŒ прСдставим сСбС, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŒ всСго 100 Π±Π°ΠΉΡ‚ ΠΈ ΠΌΡ‹ просим HBase Π²Ρ‹Π΄Π°Ρ‚ΡŒ Π½Π°ΠΌ эти Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ Π½Π΅ΠΊΠΎΠ΅ΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° Π² HFiles Ρ€Π°Π²Π΅Π½ 64 Кб Ρ‚ΠΎ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π² 640 Ρ€Π°Π· большС (Π½Π° ΠΌΠΈΠ½ΡƒΡ‚ΠΎΡ‡ΠΊΡƒ!) Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ.

Π”Π°Π»Π΅Π΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ запрос ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· HDFS ΠΈ Π΅Π³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ShortCircuitCache (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ прямой доступ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ), Ρ‚ΠΎ это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ ΡƒΠΆΠ΅ 1 Мб с диска. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ это ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ dfs.client.read.shortcircuit.buffer.size ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄ΠΎ 126 Кб.

Допустим ΠΌΡ‹ сдСлаСм это, Π½ΠΎ ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· java api, Ρ‚Π°ΠΊΠΈΠΌ функциями ΠΊΠ°ΠΊ FileChannel.read ΠΈ просим ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ объСм Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ½Π° Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Β«Π½Π° всякий случай» Π² 2 Ρ€Π°Π·Π° большС, Ρ‚.Π΅. Π² 256 Кб Π² нашСм случаС. Π­Ρ‚ΠΎ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π² java Π½Π΅Ρ‚ простой возмоТности Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ FADV_RANDOM, ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

Π’ ΠΈΡ‚ΠΎΠ³Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ наши 100 Π±Π°ΠΉΡ‚, ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ вычитываСтся Π² 2600 Ρ€Π°Π· большС. Казалось Π±Ρ‹ β€” Π²Ρ‹Ρ…ΠΎΠ΄ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° Π΄ΠΎ ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚Π°, выставим упомянутый Ρ„Π»Π°Π³ ΠΈ ΠΎΠ±Ρ€Π΅Ρ‚Π΅ΠΌ Π²Π΅Π»ΠΈΠΊΠΎΠ΅ просвСтлСниС ускорСниС. Но Π±Π΅Π΄Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° Π² 2 Ρ€Π°Π·Π°, ΠΌΡ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ ΠΈ количСство Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ Π² 2 Ρ€Π°Π·Π°.

НСкоторый Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ ΠΎΡ‚ выставлСния Ρ„Π»Π°Π³Π° FADV_RANDOM ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ большой многопоточности ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° ΠΎΡ‚ 128 Кб, Π½ΠΎ это максимум ΠΏΠ°Ρ€Π° дСсятков ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ²:

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

ВСсты ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π½Π° 100 Ρ„Π°ΠΉΠ»Π°Ρ…, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π² 1 Π“Π± ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Ρ… Π½Π° 10 дисках HDD.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посчитаСм, Π½Π° Ρ‡Ρ‚ΠΎ ΠΌΡ‹ с Ρ‚Π°ΠΊΠΎΠΉ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ ΠΌΠΎΠΆΠ΅ΠΌ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ:
Допустим ΠΌΡ‹ Ρ‡ΠΈΡ‚Π°Π΅ΠΌ с 10 дисков со ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ 280 ΠœΠ‘/сСк, Ρ‚.Π΅. 3 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° Ρ€Π°Π· ΠΏΠΎ 100 Π±Π°ΠΉΡ‚. Но ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠΌΠ½ΠΈΠΌ, Π½ΡƒΠΆΠ½Ρ‹ Π½Π°ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π² 2600 Ρ€Π°Π· мСньшС, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ 3 ΠΌΠ»Π½. Π΄Π΅Π»ΠΈΠΌ Π½Π° 2600 ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ 1100 записСй Π² сСкунду.

Π£Π΄Ρ€ΡƒΡ‡Π°ΡŽΡ‰Π΅, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ? Π’Π°ΠΊΠΎΠ²Π° ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π° Random Access доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π½Π° HDD β€” Π²Π½Π΅ зависимости ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±Π»ΠΎΠΊΠ°. Π­Ρ‚ΠΎ физичСский ΠΏΡ€Π΅Π΄Π΅Π» случайного доступа ΠΈ большСго Π² Ρ‚Π°ΠΊΠΈΡ… условиях Π½Π΅ смоТСт Π²Ρ‹ΠΆΠ°Ρ‚ΡŒ Π½ΠΈ ΠΎΠ΄Π½Π° Π‘Π”.

Как ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π° Π±Π°Π·Π°ΠΌ получаСтся Π΄ΠΎΡΡ‚ΠΈΠ³Π°Ρ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ? Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° этот вопрос Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, Ρ‡Ρ‚ΠΎ происходит Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅:

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Π’ΡƒΡ‚ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ нСсколько ΠΌΠΈΠ½ΡƒΡ‚ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ порядка тысячи записСй Π² сСкунду. Однако Π΄Π°Π»Π΅Π΅, благодаря Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ вычитываСтся Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС Ρ‡Π΅ΠΌ Π±Ρ‹Π»ΠΎ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½ΠΎ, Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡΠ΅Π΄Π°ΡŽΡ‚ Π² buff/cache ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы (linux) ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ растСт Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½Ρ‹Ρ… 60 тыс. Π² сСкунду

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΄Π°Π»Π΅Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ с ускорСниСм доступа Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Ρ‚Π΅ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Π² кэшС ОБ ΠΈΠ»ΠΈ находятся Π² сравнимых ΠΏΠΎ скорости доступа Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰ Ρ‚ΠΈΠΏΠ° SSD/NVMe.

Π’ нашСм случаС ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ тСсты Π½Π° стСндС ΠΈΠ· 4Ρ… сСрвСров, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… заряТСн ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

CPU: Xeon E5-2680 v4 @ 2.40GHz 64 threads.
ΠŸΠ°ΠΌΡΡ‚ΡŒ: 730 Π“Π±.
java version: 1.8.0_111

И Ρ‚ΡƒΡ‚ собствСнно ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ β€” объСм Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ трСбуСтся Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, которая Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² кэш HBase, Ρ‚ΠΎ Π΄ΠΎ чтСния ΠΈΠ· buff/cache ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½ΠΊΠΈ Π΄Π΅Π»ΠΎ Π΄Π°ΠΆΠ΅ Π½Π΅ Π΄ΠΎΠΉΠ΄Π΅Ρ‚. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ HBase ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ выдСляСт 40% памяти ΠΏΠΎΠ΄ структуру которая называСтся BlockCache. По сути это ConcurrentHashMap, Π³Π΄Π΅ ΠΊΠ»ΡŽΡ‡ это имя Ρ„Π°ΠΉΠ»Π°+offset Π±Π»ΠΎΠΊΠ°, Π° value собствСнно Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ этому ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· этой структуры, ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½ΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ, Π²Ρ€ΠΎΠ΄Π΅ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° запросов Π² сСкунду. Но Π΄Π°Π²Π°ΠΉΡ‚Π΅ прСдставим сСбС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ сотни Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚ памяти Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄ Π½ΡƒΠΆΠ΄Ρ‹ Π‘Π”, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π° этих сСрвСрах крутится ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π΅Π³ΠΎ Π΅Ρ‰Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ.

НапримСр Π² нашСм случаС объСм BlockCache Π½Π° ΠΎΠ΄Π½ΠΎΠΌ RS это порядка 12 Π“Π±. ΠœΡ‹ высадили Π΄Π²Π° RS Π½Π° ΠΎΠ΄Π½Ρƒ Π½ΠΎΠ΄Ρƒ, Ρ‚.Π΅. ΠΏΠΎΠ΄ BlockCache Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ 96 Π“Π± Π½Π° всСх Π½ΠΎΠ΄Π°Ρ…. А Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ этом Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π· большС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡƒΡΡ‚ΡŒ это Π±ΡƒΠ΄Π΅Ρ‚ 4 Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΏΠΎ 130 Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„Π°ΠΉΠ»Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΠΎ 800 Мб, ΠΏΠΎΠΆΠ°Ρ‚Ρ‹Π΅ FAST_DIFF, Ρ‚.Π΅. Π² суммС 410 Π“Π± (это чистыС Π΄Π°Π½Π½Ρ‹Π΅, Ρ‚.Π΅. Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° Ρ„Π°ΠΊΡ‚ΠΎΡ€Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ).

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, BlockCache составляСт лишь ΠΎΠΊΠΎΠ»ΠΎ 23% ΠΎΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ объСма Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ это Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±Π»ΠΈΠΆΠ΅ ΠΊ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ условиям Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ называСтся BigData. И Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚ начинаСтся самоС интСрСсноС β€” вСдь ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Π΅ΠΌ мСньшС ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠΉ Π² кэш, Ρ‚Π΅ΠΌ Ρ…ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π’Π΅Π΄ΡŒ Π² случаС ΠΏΡ€ΠΎΠΌΠ°Ρ…Π° придСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΡƒΡ‡Ρƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ β€” Ρ‚.Π΅. ΡΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° систСмных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Однако этого Π½Π΅ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΈ поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим совсСм Π΄Ρ€ΡƒΠ³ΠΎΠΉ аспСкт β€” Π° Ρ‡Ρ‚ΠΎ происходит с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ кэша?

Упростим ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΈ допустим, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ кэш Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ помСщаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 1 ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с объСмом Π΄Π°Π½Π½Ρ‹Ρ… Π² 3 Ρ€Π°Π·Π° большС Ρ‡Π΅ΠΌ кэш, Π½Π°ΠΌ придСтся:

1. ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ 1 Π² кэш
2. Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ 1 ΠΈΠ· кэша
3. ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ 2 Π² кэш
4. Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ 2 ΠΈΠ· кэша
5. ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ 3 Π² кэш

ΠŸΡ€ΠΎΠ΄Π΅Π»Π°Π½ΠΎ 5 дСйствий! Однако Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ этой ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊ нСльзя, ΠΏΠΎ сути ΠΌΡ‹ заставляСм HBase ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΡƒΡ‡Ρƒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ бСсполСзной Ρ€Π°Π±ΠΎΡ‚Ρ‹. Он постоянно Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· кэша ОБ, ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ сСбС Π² BlockCache, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π²Ρ‹ΠΊΠΈΠ½ΡƒΡ‚ΡŒ Π΅Π³ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ΅Ρ…Π°Π»Π° новая порция Π΄Π°Π½Π½Ρ‹Ρ…. Анимация Π² Π½Π°Ρ‡Π°Π»Π΅ поста ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ β€” Garbage Collector Π·Π°ΡˆΠΊΠ°Π»ΠΈΠ²Π°Π΅Ρ‚, атмосфСра грССтся, малСнькая Π“Ρ€Π΅Ρ‚Π° Π² Π΄Π°Π»Π΅ΠΊΠΎΠΉ ΠΈ ΠΆΠ°Ρ€ΠΊΠΎΠΉ Π¨Π²Π΅Ρ†ΠΈΠΈ расстраиваСтся. А ΠΌΡ‹ Π°ΠΉΡ‚ΠΈΡˆΠ½ΠΈΠΊΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ любим, ΠΊΠΎΠ³Π΄Π° грустят Π΄Π΅Ρ‚ΠΈ, поэтому Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ с этим ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ.

А Ρ‡Ρ‚ΠΎ Ссли ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π² кэш Π½Π΅ всС Π±Π»ΠΎΠΊΠΈ, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ΠΈΠ· Π½ΠΈΡ…, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎΠ±Ρ‹ кэш Π½Π΅ пСрСполнялся? Π”Π°Π²Π°ΠΉΡ‚Π΅ для Π½Π°Ρ‡Π°Π»Π° просто Π΄ΠΎΠ±Π°Π²ΠΈΠΌ всСго нСсколько строк ΠΊΠΎΠ΄Π° Π² Π½Π°Ρ‡Π°Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ помСщСния Π΄Π°Π½Π½Ρ‹Ρ… Π² BlockCache:

  public void cacheBlock(BlockCacheKey cacheKey, Cacheable buf, boolean inMemory) {
    if (cacheDataBlockPercent != 100 && buf.getBlockType().isData()) {
      if (cacheKey.getOffset() % 100 >= cacheDataBlockPercent) {
        return;
      }
    }
...

Бмысл Ρ‚ΡƒΡ‚ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ, оффсСт β€” это ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠ° Π² Ρ„Π°ΠΉΠ»Π΅ ΠΈ послСдниС Ρ†ΠΈΡ„Ρ€Ρ‹ Π΅Π³ΠΎ случайно ΠΈ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ распрСдСлСны ΠΎΡ‚ 00 Π΄ΠΎ 99. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π½Π°ΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½.

НапримСр выставим cacheDataBlockPercent = 20 ΠΈ посмотрим Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚:

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π°Π»ΠΈΡ†ΠΎ. На Π³Ρ€Π°Ρ„ΠΈΠΊΠ°Ρ… Π½ΠΈΠΆΠ΅ становится понятно, Π·Π° счСт Ρ‡Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ускорСниС β€” ΠΌΡ‹ экономим ΠΊΡƒΡ‡Ρƒ рСсурсов GC Π½Π΅ занимаясь сизифовым Ρ‚Ρ€ΡƒΠ΄ΠΎΠΌ размСщСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΊ кэшС лишь для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΈΡ… Π² марсианским псам ΠΏΠΎΠ΄ хвост:

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Утилизация CPU ΠΏΡ€ΠΈ этом растСт, ΠΎΠ΄Π½Π°ΠΊΠΎ сильно мСньшС Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ:

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Π’ΡƒΡ‚ Π΅Ρ‰Π΅ стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранятся Π² BlockCache Π±Ρ‹Π²Π°ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅. Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ, порядка 95% это собствСнно Π΄Π°Π½Π½Ρ‹Π΅. А ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ это ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΈΠΏΠ° Bloom Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² ΠΈΠ»ΠΈ LEAF_INDEX ΠΈ Ρ‚.Π΄.. Π­Ρ‚ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ°Π»ΠΎ, Π½ΠΎ ΠΎΠ½ΠΈ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ нСпосрСдствСнно ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, HBase обращаСтся ΠΊ ΠΌΠ΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ‚ΡƒΡ‚ дальшС ΠΈ Ссли Π΄Π°, Ρ‚ΠΎ Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ находится ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠΉ Π΅Π³ΠΎ Π±Π»ΠΎΠΊ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ условиС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ buf.getBlockType().isData() ΠΈ благодаря этому ΠΌΠ΅Ρ‚Ρƒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² кэшС Π² любом случаС.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠΌ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈ Π·Π° ΠΎΠ΄Π½ΠΎ слСгка Π·Π°Ρ‚ΡŽΠ½ΠΈΠΌ Ρ„ΠΈΡ‡Ρƒ. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ тСстС ΠΌΡ‹ сдСлали ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ отсСчСния = 20 ΠΈ BlockCache Π±Ρ‹Π» Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅Π΄ΠΎΠ·Π°Π³Ρ€ΡƒΠΆΠ΅Π½. Π’Π΅ΠΏΠ΅Ρ€ΡŒ поставим 23% ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎ 100 ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 5 ΠΌΠΈΠ½ΡƒΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ происходит насыщСниС:

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Π’ΡƒΡ‚ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ исходная вСрсия практичСски сразу упираСтся Π² ΠΏΠΎΡ‚ΠΎΠ»ΠΎΠΊ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠΊΠΎΠ»ΠΎ 100 тыс запросов Π² сСкунду. Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΏΠ°Ρ‚Ρ‡ Π΄Π°Π΅Ρ‚ ускорСниС Π΄ΠΎ 300 тысяч. ΠŸΡ€ΠΈ этом понятно, Ρ‡Ρ‚ΠΎ дальнСйшСС ускорСниС ΡƒΠΆΠ΅ Π½Π΅ Ρ‚Π°ΠΊΠΎΠ΅ «бСсплатноС», утилизация CPU ΠΏΡ€ΠΈ этом Ρ‚ΠΎΠΆΠ΅ растСт.

Однако это Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ изящноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π΅ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ² Π±Π»ΠΎΠΊΠΎΠ² Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, это зависит ΠΎΡ‚ профиля Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ автоматичСской подстройки этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² зависимости ΠΎΡ‚ активности ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния.

Для управлСния этим Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

hbase.lru.cache.heavy.eviction.count.limit β€” устанавливаСт, сколько Ρ€Π°Π· Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ процСсс высСлСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· кСша, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ (Ρ‚.Π΅. ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈ). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ΠΎ Ρ€Π°Π²Π½ΠΎ MAX_INT = 2147483647 ΠΈ фактичСски ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ„ΠΈΡ‡Π° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π½Π°Ρ‡Π½Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ процСсс высСлСния запускаСтся ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 5 β€” 10 сСкунд (это зависит ΠΎΡ‚ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ) ΠΈ 2147483647 * 10 / 60 / 60 / 24 / 365 = 680 Π»Π΅Ρ‚. Однако ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π²Π½Ρ‹ΠΌ 0 ΠΈ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„ΠΈΡ‡Ρƒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ сразу ΠΆΠ΅ послС старта.

Однако Π΅ΡΡ‚ΡŒ ΠΈ полСзная Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π² этом ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅. Если Ρƒ нас Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ‚Π°ΠΊΠΎΠΉ, Ρ‡Ρ‚ΠΎ постоянно ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΠΆΠ°ΡŽΡ‚ΡΡ краткосрочныС чтСния (допустим Π΄Π½Π΅ΠΌ) ΠΈ долгосрочныС (ΠΏΠΎ Π½ΠΎΡ‡Π°ΠΌ), Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Ρ„ΠΈΡ‡Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΈΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния.

НапримСр ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ краткосрочныС чтСния длятся ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 1 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹. На Π½Π΅ Π½Π°Π΄ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ Π²Ρ‹ΠΊΠΈΠ΄Ρ‹Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈ, кСш Π½Π΅ успССт ΡƒΡΡ‚Π°Ρ€Π΅Ρ‚ΡŒ ΠΈ Ρ‚ΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π²Π½Ρ‹ΠΌ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 10. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ оптимизация Π½Π°Ρ‡Π½Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Π½Π°Ρ‡Π°Π»ΠΎΡΡŒ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, Ρ‚.Π΅. Ρ‡Π΅Ρ€Π΅Π· 100 сСкунд. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ссли ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ краткосрочноС Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ всС Π±Π»ΠΎΠΊΠΈ ΠΏΠΎΠΏΠ°Π΄ΡƒΡ‚ Π² кСш ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ доступны (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π΅Ρ… Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ высСлСны стандартным Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ). А ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ долгосрочныС чтСния, Ρ„ΠΈΡ‡Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΈ Π±Ρ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

hbase.lru.cache.heavy.eviction.mb.size.limit β€” устанавливаСт, ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚ Π½Π°ΠΌ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π² кСш (ΠΈ СстСствСнно Π²Ρ‹ΡΠ΅Π»ΡΡ‚ΡŒ) Π·Π° 10 сСкунд. Π€ΠΈΡ‡Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π΄ΠΎΡΡ‚ΠΈΠ³Π½ΡƒΡ‚ΡŒ этого значСния ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. Бмысл Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ, Ссли ΠΌΡ‹ ΠΏΠΈΡ…Π°Π΅ΠΌ Π² кСш Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚Ρ‹, Ρ‚ΠΎ ΠΈ Π²Ρ‹ΡΠ΅Π»ΡΡ‚ΡŒ придСтся Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚Ρ‹, Π° это, ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π²Ρ‹ΡˆΠ΅, вСсьма Π½Π°ΠΊΠ»Π°Π΄Π½ΠΎ. Однако Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ слишком малСньким, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌΡƒ Π²Ρ‹Ρ…ΠΎΠ΄Ρƒ ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° пропуска Π±Π»ΠΎΠΊΠΎΠ². Для ΠΌΠΎΡ‰Π½Ρ‹Ρ… сСрвСров (порядка 20-40 физичСских ядСр) ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ Π²Ρ‹ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠΊΠΎΠ»ΠΎ 300-400 ΠœΠ‘. Для срСднСго класса (~10 ядСр) 200-300 ΠœΠ‘. Для слабых систСм (2-5 ядра) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ 50-100 ΠœΠ‘ (Π½Π° Ρ‚Π°ΠΊΠΈΡ… Π½Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ).

Рассмотрим, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚: допустим ΠΌΡ‹ выставили hbase.lru.cache.heavy.eviction.mb.size.limit = 500, ΠΈΠ΄Π΅Ρ‚ какая-Ρ‚ΠΎ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° (чтСния) ΠΈ Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ ~10 сСкунд ΠΌΡ‹ вычисляСм, сколько Π±Π°ΠΉΡ‚ Π±Ρ‹Π»ΠΎ высСлСно ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅:

Overhead = Freed Bytes Sum (MB) * 100 / Limit (MB) β€” 100;

Если ΠΏΠΎ Ρ„Π°ΠΊΡ‚Ρƒ Π±Ρ‹Π»ΠΎ высСлСно 2000 MB, Ρ‚ΠΎ Overhead получаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ:

2000 * 100 / 500 β€” 100 = 300%

Алгоритмы ΠΆΠ΅ ΡΡ‚Π°Ρ€Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ большС Ρ‡Π΅ΠΌ нСсколько дСсятков ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ², Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ„ΠΈΡ‡Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ΠΊΠ΅ΡˆΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ², Ρ‚Π΅ΠΌ самым рСализуя ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π°Π²Ρ‚ΠΎ-Ρ‚ΡŽΠ½ΠΈΠ½Π³Π°.

Однако Ссли Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΡƒΠΏΠ°Π»Π°, допустим высСлСно всСго 200 ΠœΠ‘ ΠΈ Overhead стал ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ (Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ overshooting):

200 * 100 / 500 β€” 100 = -60%

Π’ΠΎ Ρ„ΠΈΡ‡Π° Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ΠΊΠ΅ΡˆΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Overhead Π½Π΅ станСт ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

НиТС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°ΠΊ это выглядит Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. НС Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π΄ΠΎΡΡ‚ΠΈΠ³Π½ΡƒΡ‚ΡŒ 0%, это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π’Π΅ΡΡŒΠΌΠ° Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ³Π΄Π° ΠΎΠΊΠΎΠ»ΠΎ 30 β€” 100%, это ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ краткосрочных всплСсках.

hbase.lru.cache.heavy.eviction.overhead.coefficient β€” устанавливаСт, ΠΊΠ°ΠΊ быстро ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Если ΠΌΡ‹ Ρ‚Π²Π΅Ρ€Π΄ΠΎ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ наши чтСния Π² основном Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ этот коэффициСнт ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ быстрСС.

НапримСр, ΠΌΡ‹ установили этот коэффициСнт = 0.01. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ Overhead (см. Π²Ρ‹ΡˆΠ΅) Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ Π½Π° это число Π½Π° Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ΠΊΠ΅ΡˆΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ². Допустим, Ρ‡Ρ‚ΠΎ Overhead = 300%, Π° коэффициСнт = 0.01, Ρ‚ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ΠΊΠ΅ΡˆΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ Π½Π° 3%.

Подобная Π»ΠΎΠ³ΠΈΠΊΠ° Β«BackpressureΒ» β€” Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΈ для ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Overhead (overshooting). Π’Π°ΠΊ ΠΊΠ°ΠΊ всСгда Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ краткосрочныС колСбания объСма Ρ‡Ρ‚Π΅Π½ΠΈΠΉ-высСлСний, Ρ‚ΠΎ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ позволяСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Backpressure ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ: Ρ‡Π΅ΠΌ сильнСС overshooting, Ρ‚Π΅ΠΌ Ρ‚Π΅ΠΌ большС ΠΊΠ΅ΡˆΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π±Π»ΠΎΠΊΠΎΠ².

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Код Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

        LruBlockCache cache = this.cache.get();
        if (cache == null) {
          break;
        }
        freedSumMb += cache.evict()/1024/1024;
        /*
        * Sometimes we are reading more data than can fit into BlockCache
        * and it is the cause a high rate of evictions.
        * This in turn leads to heavy Garbage Collector works.
        * So a lot of blocks put into BlockCache but never read,
        * but spending a lot of CPU resources.
        * Here we will analyze how many bytes were freed and decide
        * decide whether the time has come to reduce amount of caching blocks.
        * It help avoid put too many blocks into BlockCache
        * when evict() works very active and save CPU for other jobs.
        * More delails: https://issues.apache.org/jira/browse/HBASE-23887
        */

        // First of all we have to control how much time
        // has passed since previuos evict() was launched
        // This is should be almost the same time (+/- 10s)
        // because we get comparable volumes of freed bytes each time.
        // 10s because this is default period to run evict() (see above this.wait)
        long stopTime = System.currentTimeMillis();
        if ((stopTime - startTime) > 1000 * 10 - 1) {
          // Here we have to calc what situation we have got.
          // We have the limit "hbase.lru.cache.heavy.eviction.bytes.size.limit"
          // and can calculte overhead on it.
          // We will use this information to decide,
          // how to change percent of caching blocks.
          freedDataOverheadPercent =
            (int) (freedSumMb * 100 / cache.heavyEvictionMbSizeLimit) - 100;
          if (freedSumMb > cache.heavyEvictionMbSizeLimit) {
            // Now we are in the situation when we are above the limit
            // But maybe we are going to ignore it because it will end quite soon
            heavyEvictionCount++;
            if (heavyEvictionCount > cache.heavyEvictionCountLimit) {
              // It is going for a long time and we have to reduce of caching
              // blocks now. So we calculate here how many blocks we want to skip.
              // It depends on:
             // 1. Overhead - if overhead is big we could more aggressive
              // reducing amount of caching blocks.
              // 2. How fast we want to get the result. If we know that our
              // heavy reading for a long time, we don't want to wait and can
              // increase the coefficient and get good performance quite soon.
              // But if we don't sure we can do it slowly and it could prevent
              // premature exit from this mode. So, when the coefficient is
              // higher we can get better performance when heavy reading is stable.
              // But when reading is changing we can adjust to it and set
              // the coefficient to lower value.
              int change =
                (int) (freedDataOverheadPercent * cache.heavyEvictionOverheadCoefficient);
              // But practice shows that 15% of reducing is quite enough.
              // We are not greedy (it could lead to premature exit).
              change = Math.min(15, change);
              change = Math.max(0, change); // I think it will never happen but check for sure
              // So this is the key point, here we are reducing % of caching blocks
              cache.cacheDataBlockPercent -= change;
              // If we go down too deep we have to stop here, 1% any way should be.
              cache.cacheDataBlockPercent = Math.max(1, cache.cacheDataBlockPercent);
            }
          } else {
            // Well, we have got overshooting.
            // Mayby it is just short-term fluctuation and we can stay in this mode.
            // It help avoid permature exit during short-term fluctuation.
            // If overshooting less than 90%, we will try to increase the percent of
            // caching blocks and hope it is enough.
            if (freedSumMb >= cache.heavyEvictionMbSizeLimit * 0.1) {
              // Simple logic: more overshooting - more caching blocks (backpressure)
              int change = (int) (-freedDataOverheadPercent * 0.1 + 1);
              cache.cacheDataBlockPercent += change;
              // But it can't be more then 100%, so check it.
              cache.cacheDataBlockPercent = Math.min(100, cache.cacheDataBlockPercent);
            } else {
              // Looks like heavy reading is over.
              // Just exit form this mode.
              heavyEvictionCount = 0;
              cache.cacheDataBlockPercent = 100;
            }
          }
          LOG.info("BlockCache evicted (MB): {}, overhead (%): {}, " +
            "heavy eviction counter: {}, " +
            "current caching DataBlock (%): {}",
            freedSumMb, freedDataOverheadPercent,
            heavyEvictionCount, cache.cacheDataBlockPercent);

          freedSumMb = 0;
          startTime = stopTime;
       }

Рассмотрим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ всС это Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. ИмССм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ тСстовый сцСнарий:

  1. НачинаСм Π΄Π΅Π»Π°Ρ‚ΡŒ Scan (25 threads, batch = 100)
  2. Π§Π΅Ρ€Π΅Π· 5 ΠΌΠΈΠ½ΡƒΡ‚ добавляСм multi-gets (25 threads, batch = 100)
  3. Π§Π΅Ρ€Π΅Π· 5 ΠΌΠΈΠ½ΡƒΡ‚ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ multi-gets (остаСтся ΠΎΠΏΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ scan)

Π”Π΅Π»Π°Π΅ΠΌ Π΄Π²Π° ΠΏΡ€ΠΎΠ³ΠΎΠ½Π°, сначала hbase.lru.cache.heavy.eviction.count.limit = 10000 (Ρ‡Ρ‚ΠΎ фактичСски Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ„ΠΈΡ‡Ρƒ), Π° Π·Π°Ρ‚Π΅ΠΌ ставим limit = 0 (Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚).

Π’ Π»ΠΎΠ³Π°Ρ… Π½ΠΈΠΆΠ΅ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ„ΠΈΡ‡Π°, сбрасываСт Overshooting Π΄ΠΎ 14-71%. ВрСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° сниТаСтся, Ρ‡Ρ‚ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Backpressure ΠΈ HBase вновь ΠΊΠ΅ΡˆΠΈΡ€ΡƒΠ΅Ρ‚ большС Π±Π»ΠΎΠΊΠΎΠ².

Π›ΠΎΠ³ RegionServer
evicted (MB): 0, ratio 0.0, overhead (%): -100, heavy eviction counter: 0, current caching DataBlock (%): 100
evicted (MB): 0, ratio 0.0, overhead (%): -100, heavy eviction counter: 0, current caching DataBlock (%): 100
evicted (MB): 2170, ratio 1.09, overhead (%): 985, heavy eviction counter: 1, current caching DataBlock (%): 91 < start
evicted (MB): 3763, ratio 1.08, overhead (%): 1781, heavy eviction counter: 2, current caching DataBlock (%): 76
evicted (MB): 3306, ratio 1.07, overhead (%): 1553, heavy eviction counter: 3, current caching DataBlock (%): 61
evicted (MB): 2508, ratio 1.06, overhead (%): 1154, heavy eviction counter: 4, current caching DataBlock (%): 50
evicted (MB): 1824, ratio 1.04, overhead (%): 812, heavy eviction counter: 5, current caching DataBlock (%): 42
evicted (MB): 1482, ratio 1.03, overhead (%): 641, heavy eviction counter: 6, current caching DataBlock (%): 36
evicted (MB): 1140, ratio 1.01, overhead (%): 470, heavy eviction counter: 7, current caching DataBlock (%): 32
evicted (MB): 913, ratio 1.0, overhead (%): 356, heavy eviction counter: 8, current caching DataBlock (%): 29
evicted (MB): 912, ratio 0.89, overhead (%): 356, heavy eviction counter: 9, current caching DataBlock (%): 26
evicted (MB): 684, ratio 0.76, overhead (%): 242, heavy eviction counter: 10, current caching DataBlock (%): 24
evicted (MB): 684, ratio 0.61, overhead (%): 242, heavy eviction counter: 11, current caching DataBlock (%): 22
evicted (MB): 456, ratio 0.51, overhead (%): 128, heavy eviction counter: 12, current caching DataBlock (%): 21
evicted (MB): 456, ratio 0.42, overhead (%): 128, heavy eviction counter: 13, current caching DataBlock (%): 20
evicted (MB): 456, ratio 0.33, overhead (%): 128, heavy eviction counter: 14, current caching DataBlock (%): 19
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 15, current caching DataBlock (%): 19
evicted (MB): 342, ratio 0.32, overhead (%): 71, heavy eviction counter: 16, current caching DataBlock (%): 19
evicted (MB): 342, ratio 0.31, overhead (%): 71, heavy eviction counter: 17, current caching DataBlock (%): 19
evicted (MB): 228, ratio 0.3, overhead (%): 14, heavy eviction counter: 18, current caching DataBlock (%): 19
evicted (MB): 228, ratio 0.29, overhead (%): 14, heavy eviction counter: 19, current caching DataBlock (%): 19
evicted (MB): 228, ratio 0.27, overhead (%): 14, heavy eviction counter: 20, current caching DataBlock (%): 19
evicted (MB): 228, ratio 0.25, overhead (%): 14, heavy eviction counter: 21, current caching DataBlock (%): 19
evicted (MB): 228, ratio 0.24, overhead (%): 14, heavy eviction counter: 22, current caching DataBlock (%): 19
evicted (MB): 228, ratio 0.22, overhead (%): 14, heavy eviction counter: 23, current caching DataBlock (%): 19
evicted (MB): 228, ratio 0.21, overhead (%): 14, heavy eviction counter: 24, current caching DataBlock (%): 19
evicted (MB): 228, ratio 0.2, overhead (%): 14, heavy eviction counter: 25, current caching DataBlock (%): 19
evicted (MB): 228, ratio 0.17, overhead (%): 14, heavy eviction counter: 26, current caching DataBlock (%): 19
evicted (MB): 456, ratio 0.17, overhead (%): 128, heavy eviction counter: 27, current caching DataBlock (%): 18 < added gets (but table the same)
evicted (MB): 456, ratio 0.15, overhead (%): 128, heavy eviction counter: 28, current caching DataBlock (%): 17
evicted (MB): 342, ratio 0.13, overhead (%): 71, heavy eviction counter: 29, current caching DataBlock (%): 17
evicted (MB): 342, ratio 0.11, overhead (%): 71, heavy eviction counter: 30, current caching DataBlock (%): 17
evicted (MB): 342, ratio 0.09, overhead (%): 71, heavy eviction counter: 31, current caching DataBlock (%): 17
evicted (MB): 228, ratio 0.08, overhead (%): 14, heavy eviction counter: 32, current caching DataBlock (%): 17
evicted (MB): 228, ratio 0.07, overhead (%): 14, heavy eviction counter: 33, current caching DataBlock (%): 17
evicted (MB): 228, ratio 0.06, overhead (%): 14, heavy eviction counter: 34, current caching DataBlock (%): 17
evicted (MB): 228, ratio 0.05, overhead (%): 14, heavy eviction counter: 35, current caching DataBlock (%): 17
evicted (MB): 228, ratio 0.05, overhead (%): 14, heavy eviction counter: 36, current caching DataBlock (%): 17
evicted (MB): 228, ratio 0.04, overhead (%): 14, heavy eviction counter: 37, current caching DataBlock (%): 17
evicted (MB): 109, ratio 0.04, overhead (%): -46, heavy eviction counter: 37, current caching DataBlock (%): 22 < back pressure
evicted (MB): 798, ratio 0.24, overhead (%): 299, heavy eviction counter: 38, current caching DataBlock (%): 20
evicted (MB): 798, ratio 0.29, overhead (%): 299, heavy eviction counter: 39, current caching DataBlock (%): 18
evicted (MB): 570, ratio 0.27, overhead (%): 185, heavy eviction counter: 40, current caching DataBlock (%): 17
evicted (MB): 456, ratio 0.22, overhead (%): 128, heavy eviction counter: 41, current caching DataBlock (%): 16
evicted (MB): 342, ratio 0.16, overhead (%): 71, heavy eviction counter: 42, current caching DataBlock (%): 16
evicted (MB): 342, ratio 0.11, overhead (%): 71, heavy eviction counter: 43, current caching DataBlock (%): 16
evicted (MB): 228, ratio 0.09, overhead (%): 14, heavy eviction counter: 44, current caching DataBlock (%): 16
evicted (MB): 228, ratio 0.07, overhead (%): 14, heavy eviction counter: 45, current caching DataBlock (%): 16
evicted (MB): 228, ratio 0.05, overhead (%): 14, heavy eviction counter: 46, current caching DataBlock (%): 16
evicted (MB): 222, ratio 0.04, overhead (%): 11, heavy eviction counter: 47, current caching DataBlock (%): 16
evicted (MB): 104, ratio 0.03, overhead (%): -48, heavy eviction counter: 47, current caching DataBlock (%): 21 < interrupt gets
evicted (MB): 684, ratio 0.2, overhead (%): 242, heavy eviction counter: 48, current caching DataBlock (%): 19
evicted (MB): 570, ratio 0.23, overhead (%): 185, heavy eviction counter: 49, current caching DataBlock (%): 18
evicted (MB): 342, ratio 0.22, overhead (%): 71, heavy eviction counter: 50, current caching DataBlock (%): 18
evicted (MB): 228, ratio 0.21, overhead (%): 14, heavy eviction counter: 51, current caching DataBlock (%): 18
evicted (MB): 228, ratio 0.2, overhead (%): 14, heavy eviction counter: 52, current caching DataBlock (%): 18
evicted (MB): 228, ratio 0.18, overhead (%): 14, heavy eviction counter: 53, current caching DataBlock (%): 18
evicted (MB): 228, ratio 0.16, overhead (%): 14, heavy eviction counter: 54, current caching DataBlock (%): 18
evicted (MB): 228, ratio 0.14, overhead (%): 14, heavy eviction counter: 55, current caching DataBlock (%): 18
evicted (MB): 112, ratio 0.14, overhead (%): -44, heavy eviction counter: 55, current caching DataBlock (%): 23 < back pressure
evicted (MB): 456, ratio 0.26, overhead (%): 128, heavy eviction counter: 56, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.31, overhead (%): 71, heavy eviction counter: 57, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 58, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 59, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 60, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 61, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 62, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 63, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.32, overhead (%): 71, heavy eviction counter: 64, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 65, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 66, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.32, overhead (%): 71, heavy eviction counter: 67, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 68, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.32, overhead (%): 71, heavy eviction counter: 69, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.32, overhead (%): 71, heavy eviction counter: 70, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 71, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 72, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 73, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 74, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 75, current caching DataBlock (%): 22
evicted (MB): 342, ratio 0.33, overhead (%): 71, heavy eviction counter: 76, current caching DataBlock (%): 22
evicted (MB): 21, ratio 0.33, overhead (%): -90, heavy eviction counter: 76, current caching DataBlock (%): 32
evicted (MB): 0, ratio 0.0, overhead (%): -100, heavy eviction counter: 0, current caching DataBlock (%): 100
evicted (MB): 0, ratio 0.0, overhead (%): -100, heavy eviction counter: 0, current caching DataBlock (%): 100

Π‘ΠΊΠ°Π½Ρ‹ Π½ΡƒΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ этот ΠΆΠ΅ процСсс Π² Π²ΠΈΠ΄Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠ° ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Ρ€Π°Π·Π΄Π΅Π»Π°ΠΌΠΈ кСша β€” single (ΠΊΡƒΠ΄Π° ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Ρ‰Π΅ Π½ΠΈΠΊΡ‚ΠΎ Π½ΠΈ Ρ€Π°Π·Ρƒ Π½Π΅ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π») ΠΈ multi (Ρ‚ΡƒΡ‚ хранятся «вострСбованныС» хотя Π±Ρ‹ Ρ€Π°Π· Π΄Π°Π½Π½Ρ‹Π΅):

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Ну ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† ΠΊΠ°ΠΊ выглядит Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Π²ΠΈΠ΄Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠ°. Для сравнСния кСш Π±Ρ‹Π» совсСм Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² Π½Π°Ρ‡Π°Π»Π΅, Π·Π°Ρ‚Π΅ΠΌ Π±Ρ‹Π» запуск HBase с ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ отсрочкой Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° 5 ΠΌΠΈΠ½ΡƒΡ‚ (30 Ρ†ΠΈΠΊΠ»ΠΎΠ² высСлСния).

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Pull Request HBASE 23887 Π½Π° github.

Однако 300 тыс. Ρ‡Ρ‚Π΅Π½ΠΈΠΉ Π² сСкунду это Π½Π΅ всС, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΆΠ°Ρ‚ΡŒ Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΠΆΠ΅Π»Π΅Π·Π΅ Π² этих условиях. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Ρ‡Π΅Ρ€Π΅Π· HDFS, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ShortCircuitCache (Π΄Π°Π»Π΅Π΅ SSC), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, избСгая сСтСвых взаимодСйствий.

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎΠΊΠ°Π·Π°Π»Π°, Ρ‡Ρ‚ΠΎ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ…ΠΎΡ‚ΡŒ ΠΈ Π΄Π°Π΅Ρ‚ большой Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ, Π½ΠΎ сам Ρ‚Π°ΠΊΠΆΠ΅ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ становится ΡƒΠ·ΠΊΠΈΠΌ Π³ΠΎΡ€Π»Ρ‹ΡˆΠΊΠΎΠΌ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ практичСски всС тяТСлыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ происходят Π²Π½ΡƒΡ‚Ρ€ΠΈ lock, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Осознав это ΠΌΡ‹ поняли, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ, Ссли ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ массив нСзависимых SSC:

private final ShortCircuitCache[] shortCircuitCache;
...
shortCircuitCache = new ShortCircuitCache[this.clientShortCircuitNum];
for (int i = 0; i < this.clientShortCircuitNum; i++)
  this.shortCircuitCache[i] = new ShortCircuitCache(…);

И Π΄Π°Π»Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ, ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ пСрСсСчСния Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΠΎ послСднСй Ρ†ΠΈΡ„Ρ€Π΅ оффсСта:

public ShortCircuitCache getShortCircuitCache(long idx) {
    return shortCircuitCache[(int) (idx % clientShortCircuitNum)];
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊ тСстам. Для этого Π±ΡƒΠ΄Π΅ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· HDFS простым ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. ВыставляСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

conf.set("dfs.client.read.shortcircuit", "true");
conf.set("dfs.client.read.shortcircuit.buffer.size", "65536"); // ΠΏΠΎ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Ρƒ = 1 ΠœΠ‘ ΠΈ это сильно замСдляСт Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, поэтому Π»ΡƒΡ‡ΡˆΠ΅ привСсти Π² соотвСтствиС ΠΊ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Π½ΡƒΠΆΠ΄Π°ΠΌ
conf.set("dfs.client.short.circuit.num", num); // ΠΎΡ‚ 1 Π΄ΠΎ 10

И просто Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Ρ„Π°ΠΉΠ»Ρ‹:

FSDataInputStream in = fileSystem.open(path);
for (int i = 0; i < count; i++) {
    position += 65536;
    if (position > 900000000)
        position = 0L;
    int res = in.read(position, byteBuffer, 0, 65536);
}

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ выполняСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… ΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Ρ€Π°Ρ‰ΠΈΠ²Π°Ρ‚ΡŒ количСство ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (ΠΎΡ‚ 10 Π΄ΠΎ 200 β€” Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ось) ΠΈ количСство кэшСй (ΠΎΡ‚ 1 Π΄ΠΎ 10 β€” Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ). Π’Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Π°Ρ оси ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ускорСниС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄Π°Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ SSC ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ случая ΠΊΠΎΠ³Π΄Π° кСш Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½.

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Как Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊ: врСмя выполнСния 100 тысяч Ρ‡Ρ‚Π΅Π½ΠΈΠΉ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ ΠΏΠΎ 64 ΠšΠ‘ с ΠΎΠ΄Π½ΠΈΠΌ кэшом Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ 78 сСкунд. Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ с 5 кэшами это выполняСтся Π·Π° 16 сСкунд. Π’.Π΅. ΠΈΠΌΠ΅Π΅Ρ‚ мСсто ускорСниС ~5 Ρ€Π°Π·. Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π³Ρ€Π°Ρ„ΠΈΠΊΠ°, Π½Π° малСньком числС ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‡Ρ‚Π΅Π½ΠΈΠΉ эффСкт Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΉ, это Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‚Π½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ ΠΊΠΎΠ³Π΄Π° чтСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² большС 50. Π’Π°ΠΊΠΆΠ΅ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ количСства SSC ΠΎΡ‚ 6 ΠΈ Π²Ρ‹ΡˆΠ΅ Π΄Π°Π΅Ρ‚ сущСствСнно мСньшС прироста ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ 1: Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстирования достаточно Π²ΠΎΠ»Π°Ρ‚ΠΈΠ»ΡŒΠ½Ρ‹ (см. Π½ΠΈΠΆΠ΅), Π±Ρ‹Π»ΠΎ осущСствлСно 3 запуска ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ значСния Π±Ρ‹Π»ΠΈ усрСднСны.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ 2: ΠŸΡ€ΠΈΡ€ΠΎΡΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΡ‚ настройки для случайного доступа Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, хотя сам доступ Ρ‡ΡƒΡ‚ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅.

Однако Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ случая с HBase это ускорСниС Π½Π΅ всСгда бСсплатноС. Π’ΡƒΡ‚ ΠΌΡ‹ большС Β«Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΒ» возмоТности CPU Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ, вмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²ΠΈΡΠ°Ρ‚ΡŒ Π½Π° Π»ΠΎΠΊΠ°Ρ….

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Π’ΡƒΡ‚ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Ρ†Π΅Π»ΠΎΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ количСства кэшСй Π΄Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ рост ΡƒΡ‚ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΠΈ ЦПУ. Однако Π΅ΡΡ‚ΡŒ нСсколько Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ.

НапримСр присмотримся Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Π΅Π΅ ΠΊ настройкС SSC = 3. Рост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ составляСт ΠΎΠΊΠΎΠ»ΠΎ 3.3 Ρ€Π°Π·. НиТС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ всСх Ρ‚Ρ€Π΅Ρ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… запусков.

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ CPU растСт ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 2.8 Ρ€Π°Π·. Π Π°Π·Π½ΠΈΡ†Π° Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ большая, Π½ΠΎ малСнькой Π“Ρ€Π΅Ρ‚Π΅ ΡƒΠΆΠ΅ Ρ€Π°Π΄ΠΎΡΡ‚ΡŒ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ появится врСмя для посСщСния ΡˆΠΊΠΎΠ»Ρ‹ ΠΈ ΡƒΡ€ΠΎΠΊΠΎΠ².

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ эффСкт для любого инструмСнта ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ массовый доступ ΠΊ HDFS (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Spark ΠΈ Ρ‚.Π΄.), ΠΏΡ€ΠΈ условии Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ ΠΊΠΎΠ΄ Π»Π΅Π³ΠΊΠΈΠΉ (Ρ‚.Π΅. Π·Π°Ρ‚Ρ‹ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° HDFS) ΠΈ Π΅ΡΡ‚ΡŒ свободныС мощности CPU. Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄Π°Π²Π°ΠΉΡ‚Π΅ протСстируСм ΠΊΠ°ΠΊΠΎΠΉ эффСкт даст совмСстноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ BlockCache ΠΈ Ρ‚ΡŽΠ½ΠΈΠ½Π³Π° SSC для чтСния ΠΈΠ· HBase.

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Π’ΡƒΡ‚ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°ΠΊΠΈΡ… условиях эффСкт Π½Π΅ Ρ‚Π°ΠΊΠΎΠΉ большой, ΠΊΠ°ΠΊ Π² Ρ€Π°Ρ„ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… тСстах (Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π±Π΅Π· всякой ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ), ΠΎΠ΄Π½Π°ΠΊΠΎ Π²Ρ‹ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ 80К Ρ‚ΡƒΡ‚ Π²ΠΏΠΎΠ»Π½Π΅ сСбС получаСтся. БовмСстно ΠΎΠ±Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°ΡŽΡ‚ ускорСниС Π΄ΠΎ 4Ρ… Ρ€Π°Π·.

Π’Π°ΠΊ ΠΆΠ΅ ΠΏΠΎ этой ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Ρ‹Π» сдСлан PR [HDFS-15202], ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π²ΠΌΠ΅Ρ€ΠΆΠ΅Π½ ΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π±ΡƒΠ΄Π΅Ρ‚ доступСн Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π΅Π»ΠΈΠ·Π°Ρ….

Ну ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† Π±Ρ‹Π»ΠΎ интСрСсно ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ чтСния ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ wide-column Π‘Π” Cassandra ΠΈ HBase.

Для этого Π·Π°ΠΏΡƒΡΠΊΠ°Π»ΠΈΡΡŒ экзСмпляры стандартной ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Π½Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠ³ΠΎ тСстирования YCSB с Π΄Π²ΡƒΡ… хостов (800 threads суммарно). На сСрвСрной сторонС β€” ΠΏΠΎ 4 экзСмпляра RegionServer ΠΈ Cassandra Π½Π° 4 хостах (Π½Π΅ Ρ‚Π΅Ρ…, Π³Π΄Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΈΡ… влияния). ЧтСния шли ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ† Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ:

HBase β€” 300 GB on HDFS (100 GB чистых Π΄Π°Π½Π½Ρ‹Ρ…)

Cassandra β€” 250 GB (replication factor = 3)

Π’.Π΅. объСм Π±Ρ‹Π» ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ (Π² HBase Π½Π΅ΠΌΠ½ΠΎΠΆΠΊΠΎ большС).

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ HBase:

dfs.client.short.circuit.num = 5 (оптимизация ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° HDFS)

hbase.lru.cache.heavy.eviction.count.limit = 30 β€” это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΏΠ°Ρ‚Ρ‡ Π½Π°Ρ‡Π½Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· 30 высСлСний (~5 ΠΌΠΈΠ½ΡƒΡ‚)

hbase.lru.cache.heavy.eviction.mb.size.limit = 300 β€” Ρ†Π΅Π»Π΅Π²ΠΎΠΉ объСм ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ высСлСния

Π›ΠΎΠ³ΠΈ YCSB Π±Ρ‹Π»ΠΈ распарсСны ΠΈ свСдСны Π² Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Excel:

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния ΠΈΠ· HBase Π΄ΠΎ 3 Ρ€Π°Π· ΠΈ с HDFS Π΄ΠΎ 5 Ρ€Π°Π·

Как Π²ΠΈΠ΄Π½ΠΎ, Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΡ€Π°Π²Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ этих Π‘Π” Π² этих условиях ΠΈ Π΄ΠΎΡΡ‚ΠΈΠ³Π½ΡƒΡ‚ΡŒ 450 тыс. Ρ‡Ρ‚Π΅Π½ΠΈΠΉ Π² сСкунду.

НадССмся эта информация ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠΌΡƒ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π² Ρ…ΠΎΠ΄Π΅ ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π±ΠΎΡ€ΡŒΠ±Ρ‹ Π·Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com