ΠΡΡΠΎΠΊΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ β ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΊΠ»ΡΡΠ΅Π²ΡΡ
ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ. ΠΡ Π² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π΄Π°Π½Π½ΡΡ
Π² Π‘Π±Π΅ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡΡ ΠΏΡΠΎΠΊΠ°ΡΠΊΠΎΠΉ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅Ρ
ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π² Π½Π°ΡΠ΅ ΠΠ±Π»Π°ΠΊΠΎ ΠΠ°Π½Π½ΡΡ
Π½Π° Π±Π°Π·Π΅ Hadoop ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ. ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΡΡΠΎ ΠΌΡ Π²ΡΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΠ΅ΠΌ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Ρ
ΠΎΡΠΈΠΌ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊ ΡΠ΄Π°Π»ΠΎΡΡ ΠΏΡΠΎΠΏΠ°ΡΡΠΈΡΡ RegionServer HBase ΠΈ HDFS-ΠΊΠ»ΠΈΠ΅Π½Ρ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠ΅ΠΌΡ ΡΠ΄Π°Π»ΠΎΡΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΡΠΊΠΎΡΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ.
ΠΠ΄Π½Π°ΠΊΠΎ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ ΡΡΡΠΈ Π΄ΠΎΡΠ°Π±ΠΎΡΠΎΠΊ, ΡΡΠΎΠΈΡ ΠΏΡΠΎΠ³ΠΎΠ²ΠΎΡΠΈΡΡ ΠΏΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡΠΈ, Π΅ΡΠ»ΠΈ ΡΠΈΠ΄Π΅ΡΡ Π½Π° 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 ΠΠ±, Π½ΠΎ ΡΡΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ ΠΏΠ°ΡΠ° Π΄Π΅ΡΡΡΠΊΠΎΠ² ΠΏΡΠΎΡΠ΅Π½ΡΠΎΠ²:
Π’Π΅ΡΡΡ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΠ»ΠΈΡΡ Π½Π° 100 ΡΠ°ΠΉΠ»Π°Ρ
, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ Π² 1 ΠΠ± ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΡΡ
Π½Π° 10 Π΄ΠΈΡΠΊΠ°Ρ
HDD.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΡΠΈΡΠ°Π΅ΠΌ, Π½Π° ΡΡΠΎ ΠΌΡ Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠΊΠΎΡΠΎΡΡΡΡ ΠΌΠΎΠΆΠ΅ΠΌ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°ΡΡ:
ΠΠΎΠΏΡΡΡΠΈΠΌ ΠΌΡ ΡΠΈΡΠ°Π΅ΠΌ Ρ 10 Π΄ΠΈΡΠΊΠΎΠ² ΡΠΎ ΡΠΊΠΎΡΠΎΡΡΡΡ 280 ΠΠ/ΡΠ΅ΠΊ, Ρ.Π΅. 3 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° ΡΠ°Π· ΠΏΠΎ 100 Π±Π°ΠΉΡ. ΠΠΎ ΠΊΠ°ΠΊ ΠΌΡ ΠΏΠΎΠΌΠ½ΠΈΠΌ, Π½ΡΠΆΠ½Ρ Π½Π°ΠΌ Π΄Π°Π½Π½ΡΠ΅ Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ Π² 2600 ΡΠ°Π· ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ ΠΏΡΠΎΡΠΈΡΠ°Π½ΠΎ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ 3 ΠΌΠ»Π½. Π΄Π΅Π»ΠΈΠΌ Π½Π° 2600 ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ 1100 Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ.
Π£Π΄ΡΡΡΠ°ΡΡΠ΅, Π½Π΅ ΡΠ°ΠΊ Π»ΠΈ? Π’Π°ΠΊΠΎΠ²Π° ΠΏΡΠΈΡΠΎΠ΄Π° Random Access Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΄Π°Π½Π½ΡΠΌ Π½Π° HDD β Π²Π½Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π±Π»ΠΎΠΊΠ°. ΠΡΠΎ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠ΅Π΄Π΅Π» ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΈ Π±ΠΎΠ»ΡΡΠ΅Π³ΠΎ Π² ΡΠ°ΠΊΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΡΡ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΆΠ°ΡΡ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΠ.
ΠΠ°ΠΊ ΠΆΠ΅ ΡΠΎΠ³Π΄Π° Π±Π°Π·Π°ΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π΄ΠΎΡΡΠΈΠ³Π°ΡΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΡΡ ΡΠΊΠΎΡΠΎΡΡΡ? Π§ΡΠΎΠ±Ρ ΠΎΡΠ²Π΅ΡΠΈΡΡ Π½Π° ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ΅:
Π’ΡΡ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΠΏΠ΅ΡΠ²ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠΈΠ½ΡΡ ΡΠΊΠΎΡΠΎΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΡΡΡΡΡΠΈ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π°Π»Π΅Π΅, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠΎΠΌΡ, ΡΡΠΎ Π²ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ΅ΠΌ Π±ΡΠ»ΠΎ Π·Π°ΠΏΡΠΎΡΠ΅Π½ΠΎ, ΡΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΎΡΠ΅Π΄Π°ΡΡ Π² 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 ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ:
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π½Π°Π»ΠΈΡΠΎ. ΠΠ° Π³ΡΠ°ΡΠΈΠΊΠ°Ρ
Π½ΠΈΠΆΠ΅ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, Π·Π° ΡΡΠ΅Ρ ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ β ΠΌΡ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΠΌ ΠΊΡΡΡ ΡΠ΅ΡΡΡΡΠΎΠ² GC Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°ΡΡΡ ΡΠΈΠ·ΠΈΡΠΎΠ²ΡΠΌ ΡΡΡΠ΄ΠΎΠΌ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΊ ΠΊΡΡΠ΅ Π»ΠΈΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΡΡ ΠΆΠ΅ Π²ΡΠ±ΡΠΎΡΠΈΡΡ ΠΈΡ
Π² ΠΌΠ°ΡΡΠΈΠ°Π½ΡΠΊΠΈΠΌ ΠΏΡΠ°ΠΌ ΠΏΠΎΠ΄ Ρ
Π²ΠΎΡΡ:
Π£ΡΠΈΠ»ΠΈΠ·Π°ΡΠΈΡ CPU ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ°ΡΡΠ΅Ρ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΡΠΈΠ»ΡΠ½ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ ΡΠ΅ΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ:
Π’ΡΡ Π΅ΡΠ΅ ΡΡΠΎΠΈΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΡΠΎΡΡΠ΅ Ρ
ΡΠ°Π½ΡΡΡΡ Π² BlockCache Π±ΡΠ²Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅. ΠΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ, ΠΏΠΎΡΡΠ΄ΠΊΠ° 95% ΡΡΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Π΄Π°Π½Π½ΡΠ΅. Π ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΡΠΎ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
, ΡΠΈΠΏΠ° Bloom ΡΠΈΠ»ΡΡΡΠΎΠ² ΠΈΠ»ΠΈ LEAF_INDEX ΠΈ
ΠΠΎΡΡΠΎΠΌΡ Π² ΠΊΠΎΠ΄Π΅ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ buf.getBlockType().isData() ΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΠΌΠ΅ΡΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΎΡΡΠ°Π²Π»ΡΡΡ Π² ΠΊΡΡΠ΅ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅.
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈΠΌ Π½Π°Π³ΡΡΠ·ΠΊΡ ΠΈ Π·Π° ΠΎΠ΄Π½ΠΎ ΡΠ»Π΅Π³ΠΊΠ° Π·Π°ΡΡΠ½ΠΈΠΌ ΡΠΈΡΡ. Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ΅ΡΡΠ΅ ΠΌΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΠΏΡΠΎΡΠ΅Π½Ρ ΠΎΡΡΠ΅ΡΠ΅Π½ΠΈΡ = 20 ΠΈ BlockCache Π±ΡΠ» Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅Π΄ΠΎΠ·Π°Π³ΡΡΠΆΠ΅Π½. Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΡΡΠ°Π²ΠΈΠΌ 23% ΠΈ Π±ΡΠ΄Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΏΠΎ 100 ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΊΠ°ΠΆΠ΄ΡΠ΅ 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, ΡΠ΅ΠΌ ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ ΠΊΠ΅ΡΠΈΡΡΠ΅ΡΡΡ Π±Π»ΠΎΠΊΠΎΠ².
ΠΠΎΠ΄ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ
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;
}
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΠ΅ ΡΡΠΎ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅. ΠΠΌΠ΅Π΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΡΡΠ΅Π½Π°ΡΠΈΠΉ:
- ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ Π΄Π΅Π»Π°ΡΡ Scan (25 threads, batch = 100)
- Π§Π΅ΡΠ΅Π· 5 ΠΌΠΈΠ½ΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ multi-gets (25 threads, batch = 100)
- Π§Π΅ΡΠ΅Π· 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 Ρ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΠΎΡΡΡΠΎΡΠΊΠΎΠΉ Π½Π°ΡΠ°Π»Π° ΡΠ°Π±ΠΎΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π½Π° 5 ΠΌΠΈΠ½ΡΡ (30 ΡΠΈΠΊΠ»ΠΎΠ² Π²ΡΡΠ΅Π»Π΅Π½ΠΈΡ).
ΠΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² Pull Request
ΠΠ΄Π½Π°ΠΊΠΎ 300 ΡΡΡ. ΡΡΠ΅Π½ΠΈΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ ΡΡΠΎ Π½Π΅ Π²ΡΠ΅, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΆΠ°ΡΡ Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΠΆΠ΅Π»Π΅Π·Π΅ Π² ΡΡΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΡΡ . ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ Π΄Π°Π½Π½ΡΠΌ ΡΠ΅ΡΠ΅Π· HDFS, ΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ShortCircuitCache (Π΄Π°Π»Π΅Π΅ SSC), ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π΄Π°Π½Π½ΡΠΌ Π½Π°ΠΏΡΡΠΌΡΡ, ΠΈΠ·Π±Π΅Π³Π°Ρ ΡΠ΅ΡΠ΅Π²ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠΉ.
ΠΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²ΠΊΠ° ΠΏΠΎΠΊΠ°Π·Π°Π»Π°, ΡΡΠΎ ΡΡΠΎΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Ρ ΠΎΡΡ ΠΈ Π΄Π°Π΅Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ Π²ΡΠΈΠ³ΡΡΡ, Π½ΠΎ ΡΠ°ΠΌ ΡΠ°ΠΊΠΆΠ΅ Π² ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ·ΠΊΠΈΠΌ Π³ΠΎΡΠ»ΡΡΠΊΠΎΠΌ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅ ΡΡΠΆΠ΅Π»ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ Π²Π½ΡΡΡΠΈ lock, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°ΠΌ Π±ΠΎΠ»ΡΡΡΡ ΡΠ°ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΡΠΎΠ·Π½Π°Π² ΡΡΠΎ ΠΌΡ ΠΏΠΎΠ½ΡΠ»ΠΈ, ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡΠΈ, Π΅ΡΠ»ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΠΌΠ°ΡΡΠΈΠ² Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ
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 ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ»ΡΡΠ°Ρ ΠΊΠΎΠ³Π΄Π° ΠΊΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½.
ΠΠ°ΠΊ ΡΠΈΡΠ°ΡΡ Π³ΡΠ°ΡΠΈΠΊ: Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ 100 ΡΡΡΡΡ ΡΡΠ΅Π½ΠΈΠΉ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ ΠΏΠΎ 64 ΠΠ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΊΡΡΠΎΠΌ ΡΡΠ΅Π±ΡΠ΅Ρ 78 ΡΠ΅ΠΊΡΠ½Π΄. Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Ρ 5 ΠΊΡΡΠ°ΠΌΠΈ ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π·Π° 16 ΡΠ΅ΠΊΡΠ½Π΄. Π’.Π΅. ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΡΠΎ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ ~5 ΡΠ°Π·. ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π³ΡΠ°ΡΠΈΠΊΠ°, Π½Π° ΠΌΠ°Π»Π΅Π½ΡΠΊΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ
ΡΡΠ΅Π½ΠΈΠΉ ΡΡΡΠ΅ΠΊΡ Π½Π΅ ΠΎΡΠ΅Π½Ρ Π·Π°ΠΌΠ΅ΡΠ½ΡΠΉ, ΡΡΠΎ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΈΠ³ΡΠ°ΡΡ Π·Π°ΠΌΠ΅ΡΠ½ΡΡ ΡΠΎΠ»Ρ ΠΊΠΎΠ³Π΄Π° ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π±ΠΎΠ»ΡΡΠ΅ 50. Π’Π°ΠΊΠΆΠ΅ Π·Π°ΠΌΠ΅ΡΠ½ΠΎ, ΡΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° SSC ΠΎΡ 6 ΠΈ Π²ΡΡΠ΅ Π΄Π°Π΅Ρ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ ΠΏΡΠΈΡΠΎΡΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ 1: ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²ΠΎΠ»Π°ΡΠΈΠ»ΡΠ½Ρ (ΡΠΌ. Π½ΠΈΠΆΠ΅), Π±ΡΠ»ΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½ΠΎ 3 Π·Π°ΠΏΡΡΠΊΠ° ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π±ΡΠ»ΠΈ ΡΡΡΠ΅Π΄Π½Π΅Π½Ρ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ 2: ΠΡΠΈΡΠΎΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΎΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π΄Π»Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅, Ρ ΠΎΡΡ ΡΠ°ΠΌ Π΄ΠΎΡΡΡΠΏ ΡΡΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅.
ΠΠ΄Π½Π°ΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠΎΡΠ½ΠΈΡΡ, ΡΡΠΎ Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΡΠ»ΡΡΠ°Ρ Ρ HBase ΡΡΠΎ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΎΠ΅. Π’ΡΡ ΠΌΡ Π±ΠΎΠ»ΡΡΠ΅ Β«ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΒ» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ CPU Π΄Π΅Π»Π°ΡΡ ΡΠ°Π±ΠΎΡΡ, Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΎΡΠ²ΠΈΡΠ°ΡΡ Π½Π° Π»ΠΎΠΊΠ°Ρ .
Π’ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Π»ΡΠ΄Π°ΡΡ, ΡΡΠΎ Π² ΡΠ΅Π»ΠΎΠΌ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΊΡΡΠ΅ΠΉ Π΄Π°Π΅Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΠΏΡΠΎΠΏΠΎΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΡΠΎΡΡ ΡΡΠΈΠ»ΠΈΠ·Π°ΡΠΈΠΈ Π¦ΠΠ£. ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±ΠΎΠ»Π΅Π΅ Π²ΡΠΈΠ³ΡΡΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΡΠΌΠΎΡΡΠΈΠΌΡΡ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½Π΅Π΅ ΠΊ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ SSC = 3. Π ΠΎΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠΊΠΎΠ»ΠΎ 3.3 ΡΠ°Π·. ΠΠΈΠΆΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π²ΡΠ΅Ρ ΡΡΠ΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π·Π°ΠΏΡΡΠΊΠΎΠ².
Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ CPU ΡΠ°ΡΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π² 2.8 ΡΠ°Π·. Π Π°Π·Π½ΠΈΡΠ° Π½Π΅ ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠ°Ρ, Π½ΠΎ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΎΠΉ ΠΡΠ΅ΡΠ΅ ΡΠΆΠ΅ ΡΠ°Π΄ΠΎΡΡΡ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠ²ΠΈΡΡΡ Π²ΡΠ΅ΠΌΡ Π΄Π»Ρ ΠΏΠΎΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΊΠΎΠ»Ρ ΠΈ ΡΡΠΎΠΊΠΎΠ².
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΠ²Π½ΡΠΉ ΡΡΡΠ΅ΠΊΡ Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅Π³ΠΎ ΠΌΠ°ΡΡΠΎΠ²ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ HDFS (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Spark ΠΈ Ρ.Π΄.), ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΈ ΡΡΠΎ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ ΠΊΠΎΠ΄ Π»Π΅Π³ΠΊΠΈΠΉ (Ρ.Π΅. Π·Π°ΡΡΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° HDFS) ΠΈ Π΅ΡΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠ΅ ΠΌΠΎΡΠ½ΠΎΡΡΠΈ CPU. ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌ ΠΊΠ°ΠΊΠΎΠΉ ΡΡΡΠ΅ΠΊΡ Π΄Π°ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ BlockCache ΠΈ ΡΡΠ½ΠΈΠ½Π³Π° SSC Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ· HBase.
Π’ΡΡ Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π² ΡΠ°ΠΊΠΈΡ
ΡΡΠ»ΠΎΠ²ΠΈΡΡ
ΡΡΡΠ΅ΠΊΡ Π½Π΅ ΡΠ°ΠΊΠΎΠΉ Π±ΠΎΠ»ΡΡΠΎΠΉ, ΠΊΠ°ΠΊ Π² ΡΠ°ΡΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΡΠ΅ΡΡΠ°Ρ
(ΡΡΠ΅Π½ΠΈΠ΅ Π±Π΅Π· Π²ΡΡΠΊΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ), ΠΎΠ΄Π½Π°ΠΊΠΎ Π²ΡΠΆΠ°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ 80Π ΡΡΡ Π²ΠΏΠΎΠ»Π½Π΅ ΡΠ΅Π±Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ. Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΎΠ±Π΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π΄Π°ΡΡ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎ 4Ρ
ΡΠ°Π·.
Π’Π°ΠΊ ΠΆΠ΅ ΠΏΠΎ ΡΡΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π±ΡΠ» ΡΠ΄Π΅Π»Π°Π½ PR
ΠΡ ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ Π±ΡΠ»ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΡΡΠ°Π²Π½ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ 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:
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ, Π΄Π°Π½Π½ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΡΠ°Π²Π½ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΡΠΈΡ
ΠΠ Π² ΡΡΠΈΡ
ΡΡΠ»ΠΎΠ²ΠΈΡΡ
ΠΈ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΡ 450 ΡΡΡ. ΡΡΠ΅Π½ΠΈΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ.
ΠΠ°Π΄Π΅Π΅ΠΌΡΡ ΡΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΠΎΠΌΡ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π² Ρ
ΠΎΠ΄Π΅ ΡΠ²Π»Π΅ΠΊΠ°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±ΠΎΡΡΠ±Ρ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com