๊ณ ์ฑ๋ฅ์ ๋น
๋ฐ์ดํฐ ์์
์ ์ค์ํ ์๊ตฌ ์ฌํญ ์ค ํ๋์
๋๋ค. Sberbank์ ๋ฐ์ดํฐ ๋ก๋ฉ ๋ถ์์์๋ ๊ฑฐ์ ๋ชจ๋ ๊ฑฐ๋๋ฅผ Hadoop ๊ธฐ๋ฐ ๋ฐ์ดํฐ ํด๋ผ์ฐ๋๋ก ํํํ์ฌ ๋งค์ฐ ๋ง์ ์์ ์ ๋ณด ํ๋ฆ์ ์ฒ๋ฆฌํฉ๋๋ค. ๋น์ฐํ ์ฐ๋ฆฌ๋ ํญ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ผ๋ฉฐ ์ด์ ์ฝ๊ธฐ ์์
์๋๋ฅผ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์๋ ๋๋ถ์ RegionServer HBase ๋ฐ HDFS ํด๋ผ์ด์ธํธ๋ฅผ ํจ์นํ ์ ์์๋ ๋ฐฉ๋ฒ์ ์๋ ค ๋๋ฆฌ๊ณ ์ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ์ ์ฌํญ์ ๋ณธ์ง์ ๋ค๋ฃจ๊ธฐ ์ ์ ์์น์ ์ผ๋ก HDD๋ฅผ ์ฌ์ฉํ๋ฉด ํผํ ์ ์๋ ์ ํ ์ฌํญ์ ๋ํด ์ด์ผ๊ธฐํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
HDD์ ๋น ๋ฅธ ๋๋ค ์ก์ธ์ค ์ฝ๊ธฐ๊ฐ ํธํ๋์ง ์๋ ์ด์
์์๋ค์ํผ HBase ๋ฐ ๊ธฐํ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์์ญ ํฌ๋ก๋ฐ์ดํธ ํฌ๊ธฐ์ ๋ธ๋ก์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฝ 64KB์
๋๋ค. ์ด์ 100๋ฐ์ดํธ๋ง ๊ฐ์ ธ์์ผ ํ๊ณ HBase์ ํน์ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋๋ก ์์ฒญํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. HFiles์ ๋ธ๋ก ํฌ๊ธฐ๊ฐ 64KB์ด๋ฏ๋ก ์์ฒญ์ ํ์ํ ๊ฒ๋ณด๋ค 640๋ฐฐ(๋จ XNUMX๋ถ!) ๋ ์ปค์ง๋๋ค.
๋ค์์ผ๋ก ์์ฒญ์ HDFS์ ํด๋น ๋ฉํ๋ฐ์ดํฐ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ๊ฑฐ์น๊ฒ ๋๋ฏ๋ก ShortCircuit์บ์ (ํ์ผ์ ์ง์ ์ก์ธ์คํ ์ ์์) ์ด๋ก ์ธํด ๋์คํฌ์์ ์ด๋ฏธ 1MB๋ฅผ ์ฝ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์กฐ์ ํ ์ ์์ต๋๋ค. dfs.client.read.shortcircuit.buffer.size ๋ง์ ๊ฒฝ์ฐ ์ด ๊ฐ์ ์๋ฅผ ๋ค์ด 126KB๋ก ์ค์ด๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ํ์ง๋ง ์ถ๊ฐ์ ์ผ๋ก FileChannel.read์ ๊ฐ์ ํจ์ ๋ฑ Java API๋ฅผ ํตํด ๋ฐ์ดํฐ ์ฝ๊ธฐ๋ฅผ ์์ํ๊ณ ์ด์ ์ฒด์ ์ ์ง์ ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ก ์์ฒญํ๋ฉด โjust in ifโ๋ฅผ 2๋ฐฐ ๋ ์ฝ์ต๋๋ค. , ์ฆ. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ 256KB์ ๋๋ค. ์ด๋ Java์ ์ด ๋์์ ๋ฐฉ์งํ๊ธฐ ์ํด FADV_RANDOM ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก 100๋ฐ์ดํธ๋ฅผ ์ป์ผ๋ ค๋ฉด ๋ด๋ถ์ ์ผ๋ก 2600๋ฐฐ ๋ ๋ง์ ๋ด์ฉ์ ์ฝ์ด์ผ ํฉ๋๋ค. ํด๊ฒฐ์ฑ ์ ๋ถ๋ช ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ธ๋ก ํฌ๊ธฐ๋ฅผ 2ํฌ๋ก๋ฐ์ดํธ๋ก ์ค์ด๊ณ , ์ธ๊ธ๋ ํ๋๊ทธ๋ฅผ ์ค์ ํ๊ณ ํฐ ๊นจ๋ฌ์ ๊ฐ์ํ๋ฅผ ์ป์ผ์ธ์. ํ์ง๋ง ๋ฌธ์ ๋ ๋ธ๋ก ํฌ๊ธฐ๋ฅผ 2๋ฐฐ๋ก ์ค์์ผ๋ก์จ ๋จ์ ์๊ฐ๋น ์ฝ๋ ๋ฐ์ดํธ ์๋ XNUMX๋ฐฐ๋ก ์ค์ด๋ ๋ค๋ ๊ฒ์ ๋๋ค.
FADV_RANDOM ํ๋๊ทธ ์ค์ ์ผ๋ก ์ผ๋ถ ์ด๋์ ์ป์ ์ ์์ง๋ง ๋์ ๋ฉํฐ์ค๋ ๋ฉ๊ณผ 128KB์ ๋ธ๋ก ํฌ๊ธฐ์์๋ง ์ป์ ์ ์์ง๋ง ์ด๋ ์ต๋ ์์ญ ํผ์ผํธ์ ๋๋ค.
ํ
์คํธ๋ ๊ฐ๊ฐ ํฌ๊ธฐ๊ฐ 100GB์ด๊ณ 1๊ฐ์ HDD์ ์๋ 10๊ฐ์ ํ์ผ์ ๋ํด ์ํ๋์์ต๋๋ค.
์์น์ ์ผ๋ก ์ด ์๋์์ ๊ธฐ๋ํ ์ ์๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๊ณ์ฐํด ๋ณด๊ฒ ์ต๋๋ค.
10MB/์ด์ ์๋๋ก 280๊ฐ์ ๋์คํฌ๋ฅผ ์ฝ๋๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. 3๋ง x 100๋ฐ์ดํธ. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ๊ธฐ์ตํ๋ ๊ฒ์ฒ๋ผ ์ฐ๋ฆฌ์๊ฒ ํ์ํ ๋ฐ์ดํฐ๋ ์ฝ์ ๊ฒ๋ณด๋ค 2600๋ฐฐ ์ ์ต๋๋ค. ๋ฐ๋ผ์ 3๋ฐฑ๋ง์ 2600์ผ๋ก ๋๋๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ต๋๋ค. ์ด๋น 1100๊ฐ์ ๋ ์ฝ๋.
์ฐ์ธํ์ง ์๋์? ๊ทธ๊ฒ ์์ฐ์ด์ผ ๋๋ค ์ก์ธ์ค ๋ธ๋ก ํฌ๊ธฐ์ ๊ด๊ณ์์ด HDD์ ๋ฐ์ดํฐ์ ์ก์ธ์คํฉ๋๋ค. ์ด๋ ์์ ์ก์ธ์ค์ ๋ฌผ๋ฆฌ์ ํ๊ณ์ด๋ฉฐ ์ด๋ฌํ ์กฐ๊ฑด์์๋ ์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ ๋ง์ ๊ฒ์ ์ง๋ผ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ด๋ป๊ฒ ํจ์ฌ ๋ ๋น ๋ฅธ ์๋๋ฅผ ๋ฌ์ฑํ ์ ์์๊น์? ์ด ์ง๋ฌธ์ ๋ตํ๊ธฐ ์ํด ๋ค์ ๊ทธ๋ฆผ์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ฒ์ ๋ช ๋ถ ๋์ ์๋๊ฐ ์ค์ ๋ก ์ด๋น ์ฝ 60๊ฐ์ ๋ ์ฝ๋๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ฒญํ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์์ ์ฝ๊ธฐ๊ฐ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ ์ด์ ์ฒด์ (Linux)์ ๋ฒํ/์บ์์ ๋ค์ด๊ฐ๊ณ ์๋๋ ์ด๋น XNUMX์ผ๋ก ์ฆ๊ฐํฉ๋๋ค.
๋ฐ๋ผ์ ๋ ๋์๊ฐ OS ์บ์์ ์๊ฑฐ๋ ์ ์ฌํ ์ก์ธ์ค ์๋์ SSD/NVMe ์คํ ๋ฆฌ์ง ์ฅ์น์ ์๋ ๋ฐ์ดํฐ์ ๋ํด์๋ง ์ก์ธ์ค๋ฅผ ๊ฐ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃฐ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ 4๊ฐ์ ์๋ฒ๋ก ๊ตฌ์ฑ๋ ๋ฒค์น์์ ํ ์คํธ๋ฅผ ์ํํ ๊ฒ์ด๋ฉฐ ๊ฐ ์๋ฒ์๋ ๋ค์๊ณผ ๊ฐ์ด ์๊ธ์ด ๋ถ๊ณผ๋ฉ๋๋ค.
CPU: Xeon E5-2680 v4 @ 2.40GHz 64 ์ค๋ ๋.
๋ฉ๋ชจ๋ฆฌ: 730GB.
์๋ฐ ๋ฒ์ : 1.8.0_111
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ค์ํ ์ ์ ์ฝ์ด์ผ ํ๋ ํ ์ด๋ธ์ ๋ฐ์ดํฐ ์์ ๋๋ค. ์ฌ์ค HBase ์บ์์ ์์ ํ ๋ฐฐ์น๋ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ฉด ์ด์ ์ฒด์ ์ ๋ฒํ/์บ์์์๋ ์ฝํ์ง ์์ต๋๋ค. HBase๋ ๊ธฐ๋ณธ์ ์ผ๋ก BlockCache๋ผ๋ ๊ตฌ์กฐ์ ๋ฉ๋ชจ๋ฆฌ์ 40%๋ฅผ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ณธ์ง์ ์ผ๋ก ์ด๊ฒ์ ConcurrentHashMap์ ๋๋ค. ์ฌ๊ธฐ์ ํค๋ ํ์ผ ์ด๋ฆ + ๋ธ๋ก์ ์คํ์ ์ด๊ณ ๊ฐ์ ์ด ์คํ์ ์ ์ค์ ๋ฐ์ดํฐ์ ๋๋ค.
๋ฐ๋ผ์ ์ด ๊ตฌ์กฐ์์๋ง ์ฝ์ ๋ ์ฐ๋ฆฌ๋
์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ RS ํ๋์ BlockCache ๋ณผ๋ฅจ์ ์ฝ 12GB์ ๋๋ค. ์ฐ๋ฆฌ๋ ํ๋์ ๋ ธ๋์ ๋ ๊ฐ์ RS๋ฅผ ์ฐฉ๋ฅ์์ผฐ์ต๋๋ค. ๋ชจ๋ ๋ ธ๋์ BlockCache์ 96GB๊ฐ ํ ๋น๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํจ์ฌ ๋ ๋ง์ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด 4๊ฐ์ ํ ์ด๋ธ, ๊ฐ๊ฐ 130๊ฐ์ ์์ญ์ด ์๊ณ ํ์ผ ํฌ๊ธฐ๋ 800MB์ด๊ณ FAST_DIFF๋ก ์์ถ๋ฉ๋๋ค. ์ด 410GB(๋ณต์ ์์๋ฅผ ๊ณ ๋ คํ์ง ์์ ์์ ๋ฐ์ดํฐ)
๋ฐ๋ผ์ BlockCache๋ ์ ์ฒด ๋ฐ์ดํฐ ์์ ์ฝ 23%์ ๋ถ๊ณผํ๋ฉฐ ์ด๋ BigData๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ค์ ์กฐ๊ฑด์ ํจ์ฌ ๋ ๊ฐ๊น์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ฌ๋ฏธ๊ฐ ์์๋ฉ๋๋ค. ์บ์ ์ ์ค ํ์๊ฐ ์ ์์๋ก ์ฑ๋ฅ์ด ์ ํ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฒฐ๊ตญ, ๋์น๋ฉด ๋ง์ ์ผ์ ํด์ผ ํ ๊ฒ์ ๋๋ค. ์์คํ ๊ธฐ๋ฅ ํธ์ถ๋ก ์ด๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ํผํ ์ ์์ผ๋ฏ๋ก ์์ ํ ๋ค๋ฅธ ์ธก๋ฉด, ์ฆ ์บ์ ๋ด๋ถ์ ๋ฐ์ดํฐ๋ ์ด๋ป๊ฒ ๋๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ํฉ์ ๋จ์ํํ๊ณ ํ๋์ ๊ฐ์ฒด์๋ง ๋ง๋ ์บ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ค์์ ์บ์๋ณด๋ค 1๋ฐฐ ๋ ํฐ ๋ฐ์ดํฐ ๋ณผ๋ฅจ์ผ๋ก ์์ ํ๋ ค๊ณ ํ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง์ ๋ํ ์์ ๋๋ค.
1. ๋ธ๋ก 1์ ์บ์์ ๋ฐฐ์น
2. ์บ์์์ ๋ธ๋ก 1์ ์ ๊ฑฐํฉ๋๋ค.
3. ๋ธ๋ก 2์ ์บ์์ ๋ฐฐ์น
4. ์บ์์์ ๋ธ๋ก 2์ ์ ๊ฑฐํฉ๋๋ค.
5. ๋ธ๋ก 3์ ์บ์์ ๋ฐฐ์น
5๊ฐ์ง ์์ ์ด ์๋ฃ๋์์ต๋๋ค! ๊ทธ๋ฌ๋ ์ด๋ฌํ ์ํฉ์ ์ ์์ด๋ผ๊ณ ํ ์ ์์ผ๋ฉฐ ์ค์ ๋ก ์ฐ๋ฆฌ๋ HBase๊ฐ ์์ ํ ์ธ๋ชจ์๋ ์์ ์ ์ํํ๋๋ก ๊ฐ์ํ๊ณ ์์ต๋๋ค. OS ์บ์์์ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ด๋ฅผ BlockCache์ ์ ์ฅํ ํ ๋ฐ์ดํฐ์ ์๋ก์ด ๋ถ๋ถ์ด ๋์ฐฉํ๋ฉด ๊ฑฐ์ ์ฆ์ ํ๊ธฐํฉ๋๋ค. ๊ฒ์๋ฌผ ์์ ๋ถ๋ถ์ ์ ๋๋ฉ์ด์ ์ ๋ฌธ์ ์ ๋ณธ์ง์ ๋ณด์ฌ์ค๋๋ค. Garbage Collector๊ฐ ๊ท๋ชจ๋ฅผ ๋ฒ์ด๋๊ณ ๋ถ์๊ธฐ๊ฐ ๋จ๊ฑฐ์์ง๊ณ ๋ฉ๊ณ ๋จ๊ฑฐ์ด ์ค์จ๋ด์ ์๋ ์์ Greta๊ฐ ํ๋ฅผ ๋ด๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ IT ์ฌ๋๋ค์ ์์ด๋ค์ด ์ฌํผํ๋ ๊ฒ์ ์ ๋ง ์ข์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ผ์ด ๋ฌด์์ธ์ง ์๊ฐํ๊ธฐ ์์ํฉ๋๋ค.
์บ์๊ฐ ์ค๋ฒํ๋ก๋์ง ์๋๋ก ๋ชจ๋ ๋ธ๋ก์ ์บ์์ ๋ฃ์ง ์๊ณ ํน์ ๋น์จ๋ง ์บ์์ ๋ฃ์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? BlockCache์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํจ์์ ์์ ๋ถ๋ถ์ ๋ช ์ค์ ์ฝ๋๋ง ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ์์ํด ๋ณด๊ฒ ์ต๋๋ค.
public void cacheBlock(BlockCacheKey cacheKey, Cacheable buf, boolean inMemory) {
if (cacheDataBlockPercent != 100 && buf.getBlockType().isData()) {
if (cacheKey.getOffset() % 100 >= cacheDataBlockPercent) {
return;
}
}
...
์ฌ๊ธฐ์ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. offset์ ํ์ผ์์ ๋ธ๋ก์ ์์น์ด๋ฉฐ ๋ง์ง๋ง ์ซ์๋ 00์์ 99๊น์ง ๋ฌด์์๋ก ๊ท ๋ฑํ๊ฒ ๋ถํฌ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํ์ํ ๋ฒ์์ ์ํ๋ ์ซ์๋ง ๊ฑด๋๋๋๋ค.
์๋ฅผ ๋ค์ด, ์บ์DataBlockPercent = 20์ ์ค์ ํ๊ณ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ํ์ธํ์ธ์.
๊ฒฐ๊ณผ๋ ๋ถ๋ช
ํฉ๋๋ค. ์๋ ๊ทธ๋ํ์์ ์ด๋ฌํ ๊ฐ์์ด ๋ฐ์ํ ์ด์ ๊ฐ ๋ถ๋ช
ํด์ก์ต๋๋ค. ์บ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์นํ์ฌ ์ฆ์ ํ์ฑ์ ๊ฐ ๋ฐฐ์๊ตฌ์ ๋ฒ๋ฆฌ๋ Sisyphean ์์
์ ์ํํ์ง ์๊ณ ๋ ๋ง์ 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~400MB๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ์ค์ฐ์ธต(~10๊ฐ ์ฝ์ด)์ ๊ฒฝ์ฐ 200-300MB. ์ฝํ ์์คํ (2~5๊ฐ ์ฝ์ด)์ ๊ฒฝ์ฐ 50~100MB๊ฐ ์ ์์ผ ์ ์์ต๋๋ค(์ด๊ฒ์์๋ ํ ์คํธ๋์ง ์์).
์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. hbase.lru.cache.heavy.eviction.mb.size.limit = 500์ผ๋ก ์ค์ ํ๊ณ ์ผ์ข ์ ๋ก๋(์ฝ๊ธฐ)๊ฐ ์์ผ๋ฉฐ ์ฝ 10์ด๋ง๋ค ๋ฐ์ดํธ ์๋ฅผ ๊ณ์ฐํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ค์ ๊ณต์์ ์ฌ์ฉํ์ฌ ํด๊ฑฐ๋ฉ๋๋ค.
์ค๋ฒํค๋ = ํด์ ๋ ๋ฐ์ดํธ ํฉ๊ณ(MB) * 100 / ์ ํ(MB) - 100;
์ค์ ๋ก 2000MB๊ฐ ์ ๊ฑฐ๋ ๊ฒฝ์ฐ ์ค๋ฒํค๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
2000 * 100 / 500 - 100 = 300%
์๊ณ ๋ฆฌ์ฆ์ ์์ญ ํผ์ผํธ ์ดํ๋ฅผ ์ ์งํ๋ ค๊ณ ์๋ํ๋ฏ๋ก ์ด ๊ธฐ๋ฅ์ ์บ์๋ ๋ธ๋ก์ ๋น์จ์ ์ค์ฌ ์๋ ์กฐ์ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ก๋๊ฐ ๋จ์ด์ง๋ฉด 200MB๋ง ์ ๊ฑฐ๋๊ณ ์ค๋ฒํค๋๊ฐ ์์(์์ ์ค๋ฒ์ํ )๊ฐ ๋๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
200 * 100 / 500 - 100 = -60%
๋ฐ๋๋ก ์ด ๊ธฐ๋ฅ์ ์ค๋ฒํค๋๊ฐ ์์๊ฐ ๋ ๋๊น์ง ์บ์๋ ๋ธ๋ก์ ๋น์จ์ ์ฆ๊ฐ์ํต๋๋ค.
๋ค์์ ์ค์ ๋ฐ์ดํฐ์์ ์ด๊ฒ์ด ์ด๋ป๊ฒ ๋ณด์ด๋์ง์ ๋ํ ์์ ๋๋ค. 0%์ ๋๋ฌํ๋ ค๊ณ ๋ ธ๋ ฅํ ํ์๋ ์์ต๋๋ค. ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ฝ 30~100%์ผ ๋ ๋งค์ฐ ์ข์ต๋๋ค. ์ด๋ ๋จ๊ธฐ ๊ธ์ฆ ์ค์ ์ต์ ํ ๋ชจ๋์์ ์กฐ๊ธฐ ์ข ๋ฃ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
hbase.lru.cache.heavy.eviction.overhead.coefficient โ ๊ฒฐ๊ณผ๋ฅผ ์ผ๋ง๋ ๋นจ๋ฆฌ ์ป๊ณ ์ถ์์ง ์ค์ ํฉ๋๋ค. ์ฝ๊ธฐ๊ฐ ๋๋ถ๋ถ ๊ธธ๊ณ ๊ธฐ๋ค๋ฆฌ๊ธฐ๋ฅผ ์ํ์ง ์๋๋ค๋ ๊ฒ์ ํ์คํ ์๊ณ ์๋ค๋ฉด ์ด ๋น์จ์ ๋์ด๊ณ ๊ณ ์ฑ๋ฅ์ ๋ ๋น ๋ฅด๊ฒ ์ป์ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ด ๊ณ์๋ฅผ 0.01๋ก ์ค์ ํฉ๋๋ค. ์ด๋ ์ค๋ฒํค๋(์ ์ฐธ์กฐ)์ ์ด ์ซ์๋ฅผ ๊ฒฐ๊ณผ ๊ฒฐ๊ณผ๋ก ๊ณฑํ๊ณ ์บ์๋ ๋ธ๋ก์ ๋น์จ์ด ๊ฐ์ํจ์ ์๋ฏธํฉ๋๋ค. ์ค๋ฒํค๋ = 300%, ๊ณ์ = 0.01์ด๋ผ๊ณ ๊ฐ์ ํ๋ฉด ์บ์๋ ๋ธ๋ก์ ๋น์จ์ด 3% ๊ฐ์ํฉ๋๋ค.
์์ ์ค๋ฒํค๋(์ค๋ฒ์ํ ) ๊ฐ์ ๋ํด์๋ ์ ์ฌํ "๋ฐฐ์" ๋ ผ๋ฆฌ๊ฐ ๊ตฌํ๋ฉ๋๋ค. ์ฝ๊ธฐ ๋ฐ ์ ๊ฑฐ ๋ณผ๋ฅจ์ ๋จ๊ธฐ ๋ณ๋์ ํญ์ ๊ฐ๋ฅํ๋ฏ๋ก ์ด ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ฉด ์ต์ ํ ๋ชจ๋์์ ์กฐ๊ธฐ ์ข ๋ฃ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. BackPressure์๋ ๋ฐ์ ๋ ๋ ผ๋ฆฌ๊ฐ ์์ต๋๋ค. ์ฆ, ์ค๋ฒ์ํ ์ด ๊ฐํ ์๋ก ๋ ๋ง์ ๋ธ๋ก์ด ์บ์๋ฉ๋๋ค.
๊ตฌํ ์ฝ๋
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;
}
์ด์ ์ค์ ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ชจ๋ ๊ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ํ ์คํธ ์คํฌ๋ฆฝํธ๊ฐ ์์ต๋๋ค.
- ์ค์บ์ ์์ํ๊ฒ ์ต๋๋ค(์ค๋ ๋ 25๊ฐ, ๋ฐฐ์น = 100).
- 5๋ถ ํ ๋ค์ค ๊ฐ์ ธ์ค๊ธฐ(25๊ฐ ์ค๋ ๋, ๋ฐฐ์น = 100)๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- 5๋ถ ํ ๋ฉํฐ๊ฒ ๊บผ์ง (๋ค์ ์ค์บ๋ง ๋จ์)
์ฐ๋ฆฌ๋ ๋ ๋ฒ์ ์คํ์ ์ํํฉ๋๋ค. ๋จผ์ hbase.lru.cache.heavy.eviction.count.limit = 10000(์ค์ ๋ก ๊ธฐ๋ฅ์ ๋นํ์ฑํํจ)์ ์ค์ ํ ๋ค์ ์ ํ = 0(ํ์ฑํ)์ ์ค์ ํฉ๋๋ค.
์๋ ๋ก๊ทธ์์๋ ์ด ๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ์ผ์ ธ ์๊ณ ์ค๋ฒ์ํ ์ 14-71%๋ก ์ฌ์ค์ ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค. ๋๋๋ก ๋ก๋๊ฐ ๊ฐ์ํ์ฌ BackPressure๊ฐ ์ผ์ง๊ณ HBase๊ฐ ๋ ๋ง์ ๋ธ๋ก์ ๋ค์ ์บ์ํฉ๋๋ค.
๋ก๊ทธ ์์ญ์๋ฒ
์ ๊ฑฐ๋จ(MB): 0, ๋น์จ 0.0, ์ค๋ฒํค๋(%): -100, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 0, ํ์ฌ ์บ์ฑ DataBlock(%): 100
์ ๊ฑฐ๋จ(MB): 0, ๋น์จ 0.0, ์ค๋ฒํค๋(%): -100, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 0, ํ์ฌ ์บ์ฑ DataBlock(%): 100
์ ๊ฑฐ๋จ(MB): 2170, ๋น์จ 1.09, ์ค๋ฒํค๋(%): 985, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 1, ํ์ฌ ์บ์ฑ DataBlock(%): 91 < ์์
์ ๊ฑฐ๋จ(MB): 3763, ๋น์จ 1.08, ์ค๋ฒํค๋(%): 1781, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 2, ํ์ฌ ์บ์ฑ DataBlock(%): 76
์ ๊ฑฐ๋จ(MB): 3306, ๋น์จ 1.07, ์ค๋ฒํค๋(%): 1553, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 3, ํ์ฌ ์บ์ฑ DataBlock(%): 61
์ ๊ฑฐ๋จ(MB): 2508, ๋น์จ 1.06, ์ค๋ฒํค๋(%): 1154, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 4, ํ์ฌ ์บ์ฑ DataBlock(%): 50
์ ๊ฑฐ๋จ(MB): 1824, ๋น์จ 1.04, ์ค๋ฒํค๋(%): 812, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 5, ํ์ฌ ์บ์ฑ DataBlock(%): 42
์ ๊ฑฐ๋จ(MB): 1482, ๋น์จ 1.03, ์ค๋ฒํค๋(%): 641, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 6, ํ์ฌ ์บ์ฑ DataBlock(%): 36
์ ๊ฑฐ๋จ(MB): 1140, ๋น์จ 1.01, ์ค๋ฒํค๋(%): 470, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 7, ํ์ฌ ์บ์ฑ DataBlock(%): 32
์ ๊ฑฐ๋จ(MB): 913, ๋น์จ 1.0, ์ค๋ฒํค๋(%): 356, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 8, ํ์ฌ ์บ์ฑ DataBlock(%): 29
์ ๊ฑฐ๋จ(MB): 912, ๋น์จ 0.89, ์ค๋ฒํค๋(%): 356, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 9, ํ์ฌ ์บ์ฑ DataBlock(%): 26
์ ๊ฑฐ๋จ(MB): 684, ๋น์จ 0.76, ์ค๋ฒํค๋(%): 242, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 10, ํ์ฌ ์บ์ฑ DataBlock(%): 24
์ ๊ฑฐ๋จ(MB): 684, ๋น์จ 0.61, ์ค๋ฒํค๋(%): 242, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 11, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 456, ๋น์จ 0.51, ์ค๋ฒํค๋(%): 128, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 12, ํ์ฌ ์บ์ฑ DataBlock(%): 21
์ ๊ฑฐ๋จ(MB): 456, ๋น์จ 0.42, ์ค๋ฒํค๋(%): 128, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 13, ํ์ฌ ์บ์ฑ DataBlock(%): 20
์ ๊ฑฐ๋จ(MB): 456, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 128, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 14, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 15, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.32, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 16, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.31, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 17, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.3, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 18, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.29, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 19, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.27, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 20, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.25, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 21, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.24, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 22, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.22, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 23, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.21, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 24, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.2, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 25, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.17, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 26, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 456, ๋น์จ 0.17, ์ค๋ฒํค๋(%): 128, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 27, ํ์ฌ ์บ์ฑ DataBlock(%): 18 < ์ถ๊ฐ๋ ๊ฐ์ ธ์ค๊ธฐ(๊ทธ๋ฌ๋ ํ
์ด๋ธ์ ๋์ผํจ)
์ ๊ฑฐ๋จ(MB): 456, ๋น์จ 0.15, ์ค๋ฒํค๋(%): 128, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 28, ํ์ฌ ์บ์ฑ DataBlock(%): 17
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.13, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 29, ํ์ฌ ์บ์ฑ DataBlock(%): 17
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.11, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 30, ํ์ฌ ์บ์ฑ DataBlock(%): 17
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.09, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 31, ํ์ฌ ์บ์ฑ DataBlock(%): 17
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.08, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 32, ํ์ฌ ์บ์ฑ DataBlock(%): 17
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.07, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 33, ํ์ฌ ์บ์ฑ DataBlock(%): 17
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.06, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 34, ํ์ฌ ์บ์ฑ DataBlock(%): 17
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.05, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 35, ํ์ฌ ์บ์ฑ DataBlock(%): 17
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.05, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 36, ํ์ฌ ์บ์ฑ DataBlock(%): 17
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.04, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 37, ํ์ฌ ์บ์ฑ DataBlock(%): 17
์ ๊ฑฐ๋จ(MB): 109, ๋น์จ 0.04, ์ค๋ฒํค๋(%): -46, ๋ฌด๊ฑฐ์ด ์ ๊ฑฐ ์นด์ดํฐ: 37, ํ์ฌ ์บ์ฑ DataBlock(%): 22 < ๋ฐฐ์
์ ๊ฑฐ๋จ(MB): 798, ๋น์จ 0.24, ์ค๋ฒํค๋(%): 299, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 38, ํ์ฌ ์บ์ฑ DataBlock(%): 20
์ ๊ฑฐ๋จ(MB): 798, ๋น์จ 0.29, ์ค๋ฒํค๋(%): 299, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 39, ํ์ฌ ์บ์ฑ DataBlock(%): 18
์ ๊ฑฐ๋จ(MB): 570, ๋น์จ 0.27, ์ค๋ฒํค๋(%): 185, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 40, ํ์ฌ ์บ์ฑ DataBlock(%): 17
์ ๊ฑฐ๋จ(MB): 456, ๋น์จ 0.22, ์ค๋ฒํค๋(%): 128, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 41, ํ์ฌ ์บ์ฑ DataBlock(%): 16
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.16, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 42, ํ์ฌ ์บ์ฑ DataBlock(%): 16
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.11, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 43, ํ์ฌ ์บ์ฑ DataBlock(%): 16
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.09, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 44, ํ์ฌ ์บ์ฑ DataBlock(%): 16
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.07, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 45, ํ์ฌ ์บ์ฑ DataBlock(%): 16
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.05, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 46, ํ์ฌ ์บ์ฑ DataBlock(%): 16
์ ๊ฑฐ๋จ(MB): 222, ๋น์จ 0.04, ์ค๋ฒํค๋(%): 11, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 47, ํ์ฌ ์บ์ฑ DataBlock(%): 16
์ ๊ฑฐ๋จ(MB): 104, ๋น์จ 0.03, ์ค๋ฒํค๋(%): -48, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 47, ํ์ฌ ์บ์ฑ DataBlock(%): 21 < ์ธํฐ๋ฝํธ ๊ฐ์ ธ์ค๊ธฐ
์ ๊ฑฐ๋จ(MB): 684, ๋น์จ 0.2, ์ค๋ฒํค๋(%): 242, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 48, ํ์ฌ ์บ์ฑ DataBlock(%): 19
์ ๊ฑฐ๋จ(MB): 570, ๋น์จ 0.23, ์ค๋ฒํค๋(%): 185, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 49, ํ์ฌ ์บ์ฑ DataBlock(%): 18
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.22, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 50, ํ์ฌ ์บ์ฑ DataBlock(%): 18
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.21, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 51, ํ์ฌ ์บ์ฑ DataBlock(%): 18
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.2, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 52, ํ์ฌ ์บ์ฑ DataBlock(%): 18
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.18, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 53, ํ์ฌ ์บ์ฑ DataBlock(%): 18
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.16, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 54, ํ์ฌ ์บ์ฑ DataBlock(%): 18
์ ๊ฑฐ๋จ(MB): 228, ๋น์จ 0.14, ์ค๋ฒํค๋(%): 14, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 55, ํ์ฌ ์บ์ฑ DataBlock(%): 18
์ ๊ฑฐ๋จ(MB): 112, ๋น์จ 0.14, ์ค๋ฒํค๋(%): -44, ๋ฌด๊ฑฐ์ด ์ ๊ฑฐ ์นด์ดํฐ: 55, ํ์ฌ ์บ์ฑ DataBlock(%): 23 < ๋ฐฐ์
์ ๊ฑฐ๋จ(MB): 456, ๋น์จ 0.26, ์ค๋ฒํค๋(%): 128, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 56, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.31, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 57, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 58, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 59, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 60, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 61, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 62, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 63, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.32, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 64, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 65, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 66, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.32, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 67, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 68, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.32, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 69, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.32, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 70, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 71, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 72, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 73, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 74, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 75, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 342, ๋น์จ 0.33, ์ค๋ฒํค๋(%): 71, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 76, ํ์ฌ ์บ์ฑ DataBlock(%): 22
์ ๊ฑฐ๋จ(MB): 21, ๋น์จ 0.33, ์ค๋ฒํค๋(%): -90, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 76, ํ์ฌ ์บ์ฑ DataBlock(%): 32
์ ๊ฑฐ๋จ(MB): 0, ๋น์จ 0.0, ์ค๋ฒํค๋(%): -100, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 0, ํ์ฌ ์บ์ฑ DataBlock(%): 100
์ ๊ฑฐ๋จ(MB): 0, ๋น์จ 0.0, ์ค๋ฒํค๋(%): -100, ๊ณผ๋ํ ์ ๊ฑฐ ์นด์ดํฐ: 0, ํ์ฌ ์บ์ฑ DataBlock(%): 100
๋ ์บ์ ์น์ , ์ฆ ๋จ์ผ(์ด์ ์ ์์ฒญํ ์ ์ด ์๋ ๋ธ๋ก)๊ณผ ๋ค์ค(์ต์ ํ ๋ฒ "์์ฒญ๋" ๋ฐ์ดํฐ๊ฐ ์ฌ๊ธฐ์ ์ ์ฅ๋จ) ์ฌ์ด์ ๊ด๊ณ ๊ทธ๋ํ ํํ๋ก ๋์ผํ ํ๋ก์ธ์ค๋ฅผ ํ์ํ๊ธฐ ์ํด ์ค์บ์ด ํ์ํ์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋งค๊ฐ๋ณ์์ ์๋์ ๊ทธ๋ํ ํํ๋ก ๋ํ๋ด๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๋น๊ต๋ฅผ ์ํด ์ฒ์์๋ ์บ์๊ฐ ์์ ํ ๊บผ์ง ํ ์บ์ฑ๊ณผ ํจ๊ป HBase๊ฐ ์์๋์์ผ๋ฉฐ ์ต์ ํ ์์
์์์ 5๋ถ(30ํ ์ ๊ฑฐ ์ฃผ๊ธฐ) ์ง์ฐ์์ผฐ์ต๋๋ค.
์ ์ฒด ์ฝ๋๋ Pull Request์์ ์ฐพ์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ์กฐ๊ฑด์์ ์ด ํ๋์จ์ด์์ ๋ฌ์ฑํ ์ ์๋ ์ด๋น ์ฝ๊ธฐ ํ์๋ 300๋งํ๊ฐ ์๋๋๋ค. ์ฌ์ค HDFS๋ฅผ ํตํด ๋ฐ์ดํฐ์ ์ก์ธ์คํด์ผ ํ๋ ๊ฒฝ์ฐ ShortCircuitCache(์ดํ SSC๋ผ๊ณ ํจ) ๋ฉ์ปค๋์ฆ์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋คํธ์ํฌ ์ํธ ์์ฉ์ ํผํ๋ฉด์ ๋ฐ์ดํฐ์ ์ง์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
ํ๋กํ์ผ๋ง์ ๋ฐ๋ฅด๋ฉด ์ด ๋ฉ์ปค๋์ฆ์ ํฐ ์ด๋์ ์ ๊ณตํ์ง๋ง ๊ฑฐ์ ๋ชจ๋ ๋ฌด๊ฑฐ์ด ์์ ์ด ์ ๊ธ ๋ด๋ถ์์ ๋ฐ์ํ์ฌ ๋๋ถ๋ถ์ ์๊ฐ์ ์ฐจ๋จํ๊ธฐ ๋๋ฌธ์ ์ด๋ ์์ ์์๋ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ๊ธฐ๋ ํฉ๋๋ค.
์ด๋ฅผ ์คํํ ํ, ์ฐ๋ฆฌ๋ ๋
๋ฆฝ์ ์ธ 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 - ๊ทธ๋ํฝ)๋ฅผ ๋๋ฆฝ๋๋ค. ์ธ๋ก์ถ์ ์บ์๊ฐ XNUMX๊ฐ์ธ ๊ฒฝ์ฐ์ ๋นํด SSC๊ฐ ์ฆ๊ฐํ์ฌ ๋ฐ์ํ๋ ๊ฐ์๋๋ฅผ ๋ํ๋ ๋๋ค.
๊ทธ๋ํ๋ฅผ ์ฝ๋ ๋ฐฉ๋ฒ: ํ๋์ ์บ์๋ก 100KB ๋ธ๋ก์์ 64๋ง ์ฝ๊ธฐ๋ฅผ ์คํํ๋ ๋ฐ 78์ด๊ฐ ์์๋ฉ๋๋ค. ๋ฐ๋ฉด ์บ์๊ฐ 5๊ฐ์ด๋ฉด 16์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ ๊ฒ๋ค. ~5๋ฐฐ์ ๊ฐ์๋๊ฐ ์์ต๋๋ค. ๊ทธ๋ํ์์ ๋ณผ ์ ์๋ฏ์ด ๋ณ๋ ฌ ์ฝ๊ธฐ ์๊ฐ ์ ์ ๋๋ ํจ๊ณผ๊ฐ ํฌ๊ฒ ๋์ ๋์ง ์์ง๋ง ์ค๋ ๋ ์ฝ๊ธฐ๊ฐ 50๊ฐ ์ด์์ผ ๋ ๋์ ๋๋ ์ญํ ์ ํ๊ธฐ ์์ํฉ๋๋ค. ์ด์์์๋ ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋์ง ์์ต๋๋ค.
์ฐธ๊ณ 1: ํ ์คํธ ๊ฒฐ๊ณผ๋ ๋งค์ฐ ๋ถ์์ ํ๋ฏ๋ก(์๋ ์ฐธ์กฐ) 3๋ฒ์ ์คํ์ ์ํํ๊ณ ๊ฒฐ๊ณผ ๊ฐ์ ํ๊ท ํํ์ต๋๋ค.
์ฐธ๊ณ 2: ์์ ์ก์ธ์ค ๊ตฌ์ฑ์ผ๋ก ์ธํ ์ฑ๋ฅ ํฅ์์ ๋์ผํ์ง๋ง ์ก์ธ์ค ์์ฒด๋ ์ฝ๊ฐ ๋๋ ค์ง๋๋ค.
๊ทธ๋ฌ๋ HBase์ ๊ฒฝ์ฐ์ ๋ฌ๋ฆฌ ์ด๋ฌํ ๊ฐ์์ด ํญ์ ๋ฌด๋ฃ๋ ์๋๋ผ๋ ์ ์ ๋ถ๋ช ํ ํ ํ์๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ ๊ธ์ ๋งค๋ฌ๋ฆฌ๋ ๋์ ๋ ๋ง์ ์์ ์ ์ํํ ์ ์๋ CPU ๊ธฐ๋ฅ์ "์ ๊ธ ํด์ "ํฉ๋๋ค.
์ฌ๊ธฐ์๋ ์ผ๋ฐ์ ์ผ๋ก ์บ์ ์๊ฐ ์ฆ๊ฐํ๋ฉด CPU ์ฌ์ฉ๋ฅ ์ด ๋๋ต ๋น๋กํ์ฌ ์ฆ๊ฐํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฝ๊ฐ ๋ ๋ง์ ์น๋ฆฌ ์กฐํฉ์ด ์์ต๋๋ค.
์๋ฅผ ๋ค์ด SSC = 3 ์ค์ ์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํด๋น ๋ฒ์์ ์ฑ๋ฅ ํฅ์์ ์ฝ 3.3๋ฐฐ์ ๋๋ค. ์๋๋ ์ธ ๊ฐ์ง ๊ฐ๋ณ ์คํ์ ๊ฒฐ๊ณผ์ ๋๋ค.
CPU ์๋น๋ ์ฝ 2.8๋ฐฐ ์ฆ๊ฐํฉ๋๋ค. ๊ทธ ์ฐจ์ด๋ ๊ทธ๋ฆฌ ํฌ์ง ์์ง๋ง ์ด๋ฆฐ ๊ทธ๋ ํ๋ ์ด๋ฏธ ํ๋ณตํดํ๋ฉฐ ํ๊ต์ ๋ค๋๊ณ ์์
์ ๋ฐ์ ์๊ฐ์ด ์์ ์๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๊ฐ ๊ฐ๋ณ๊ณ (์ฆ, ํ๋ฌ๊ทธ๊ฐ HDFS ํด๋ผ์ด์ธํธ ์ธก์ ์์) ๋ฌด๋ฃ CPU ์ฑ๋ฅ์ด ์๋ ๊ฒฝ์ฐ HDFS์ ๋ํ ๋๋ ์ก์ธ์ค๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๋๊ตฌ(์: Spark ๋ฑ)์ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ๊ฒ์ ๋๋ค. . ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด BlockCache ์ต์ ํ์ SSC ํ๋์ ๊ฒฐํฉํ์ฌ HBase์์ ์ฝ๊ธฐ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ํ ์คํธํด ๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฌํ ์กฐ๊ฑด์์๋ ๊ฐ์ ๋ ํ
์คํธ(์ฒ๋ฆฌ ์์ด ์ฝ๊ธฐ)๋งํผ ํจ๊ณผ๊ฐ ํฌ์ง ์์ง๋ง ์ฌ๊ธฐ์์ ์ถ๊ฐ๋ก 80K๋ฅผ ์ง๋ด๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ ๊ฐ์ง ์ต์ ํ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ต๋ 4๋ฐฐ์ ์๋ ํฅ์์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด ์ต์ ํ์ ๋ํ PR๋ ์์ฑ๋์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ์ ์ฌํ ์์ด๋ ์ปฌ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ธ Cassandra์ HBase์ ์ฝ๊ธฐ ์ฑ๋ฅ์ ๋น๊ตํ๋ ๊ฒ์ด ํฅ๋ฏธ๋ก์ ์ต๋๋ค.
์ด๋ฅผ ์ํด ๋ ํธ์คํธ(์ด 800๊ฐ ์ค๋ ๋)์์ ํ์ค YCSB ๋ก๋ ํ ์คํธ ์ ํธ๋ฆฌํฐ์ ์ธ์คํด์ค๋ฅผ ์์ํ์ต๋๋ค. ์๋ฒ ์ธก - 4๊ฐ์ ํธ์คํธ์ ์๋ 4๊ฐ์ RegionServer ๋ฐ Cassandra ์ธ์คํด์ค(ํด๋ผ์ด์ธํธ์ ์ํฅ์ ํผํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ๊ฐ ์คํ ์ค์ธ ํธ์คํธ๊ฐ ์๋). ํ๋ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ ํฌ๊ธฐ์ ํ์์ ๋์์ต๋๋ค.
HBase โ HDFS์์ 300GB(100GB ์์ ๋ฐ์ดํฐ)
Cassandra - 250GB(๋ณต์ ์ธ์ = 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