HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ์ ํ์ฉํ HBase์ WAL ์ฐ๊ธฐ ์ต์ ํ
HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ์ ํ์ฉํ HBase์ WAL ์ฐ๊ธฐ ์ต์ ํ ๊ด๋ จ
๋ค์ด๋ฒ ๊ฒ์์์๋ ๊ฒ์ ์๋น์ค ์ ๊ณต์ ํ์ํ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ HBase ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ ์ ์ฅ์์ธ Cuve์ ์ ์ฅํ๊ณ ์์ต๋๋ค. HBase๋ Java ๊ธฐ๋ฐ์ ์คํ ์์ค NoSQL ๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค. HDFS์ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ ๋ด๊ตฌ์ฑ(durability)๊ณผ ์ง์์ฑ(persistence)์ ๋ณด์ฅํฉ๋๋ค. ์ง์ฐ ์๊ฐ์ด ๋งค์ฐ ์งง๊ณ ๊ฑฐ์ ์ค์๊ฐ์ ๊ฐ๊น์ด ๋๋ค ์ฝ๊ธฐ์ ๋๋ค ์ฐ๊ธฐ๋ฅผ ์ง์ํฉ๋๋ค.
HBase ์ฐ๊ธฐ ๊ฒฝ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
HBase๋ ์ฐ๊ธฐ ์์ฒญ์ ์ฒ๋ฆฌํ ๋ HDFS์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ์ฐ์ง ์๊ณ RegionServer์ MemStore๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ ์ฅํฉ๋๋ค. MemStore์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ Flush ๊ณผ์ ์ ํตํด์ ์ฃผ๊ธฐ์ ์ผ๋ก HDFS์ ์ ์ฅ๋ฉ๋๋ค. HDFS์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ ์ ์๋ฒ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ธ MemStore์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ์ ์ค๋ ์ ์์ต๋๋ค. HBase๋ ๋ฐ์ดํฐ ์ ์ค์ ๋ฐฉ์งํ๊ธฐ ์ํด WAL(Write-Ahead Log)์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ธฐ๋กํฉ๋๋ค.
WAL์ MySQL์ BIN ๋ก๊ทธ์ ๋น์ทํ๊ฒ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ก๊ทธ์ ๊ธฐ๋กํ์ฌ ๋ฐ์ดํฐ ๋ด๊ตฌ์ฑ์ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ผ๋ฐ์ ์ผ๋ก ์๊ตฌ์ ์ธ ๋ฐ์ดํฐ ์ ์ฅ ์ฅ์น(์: HDD, SSD ๋ฑ)์ ์ ์ฅํ๋๋ฐ HBase๋ HDFS์ ์ ์ฅํฉ๋๋ค. ์๋ฒ์ ์ฅ์ ๊ฐ ๋ฐ์ํ์ฌ ๋ฉ๋ชจ๋ฆฌ์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ค๋์ด๋ WAL์ ์ด์ฉํด ๋ณต๊ตฌํ ์ ์์ต๋๋ค.
HBase ๋ฒ์ 1์์๋ HDFS๊ฐ ์ ๊ณตํ๋ DFSOutputStream
์ ํตํด์ WAL ๋ฐ์ดํฐ๋ฅผ HDFS์ ์ ์ฅํ์ต๋๋ค. ํ์ง๋ง HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๊ฐ 3๊ฐ์ DataNode์ ์ฐ์ด๋ค ๋ณด๋ ์ง์ฐ ์๊ฐ์ด ์ฆ๊ฐํ๋ ๋ฌธ์ ์ WAL ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ ์คํจ๋ก ์ธํด ์ฌ์ฉ์ ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์ง์ฐ๋๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. Cuve์์๋ HBase ๋ฒ์ 1 ํด๋ฌ์คํฐ์์ WAL ๋ฐ์ดํฐ ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ ์คํจ๋ก ์ฌ์ฉ์์ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ์ฌ SLA๋ฅผ ์๋ฐํ๋ ์ฅ์ ๊ฐ ๋ฐ์ํ์์ต๋๋ค. HBase ๋ฒ์ 2์์๋ HBase์ WAL ์ฐ๊ธฐ ์ ์ฉ Fan-out DFSOutputStream์ด ๊ตฌํ๋์ด ์ด๋ฌํ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
์ด ๊ธ์์๋ Cuve์์ HBase ๋ฒ์ 1 ๊ธฐ๋ฐ์ผ๋ก ์ด์ํ๋ HBase ํด๋ฌ์คํฐ์์ ์ด๋ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง ์์๋ณด๊ณ HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ๊ณผ HBase์ Fan-out DFSOutputStream์์ HDFS ํ๋กํ ์ฝ์ ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
์ด ๊ธ์ HDFS์ HBase์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ๊ณผ ์ฌ์ฉ๋ฒ์ ์ต์ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์์ต๋๋ค. HDFS์ HBase์ ๊ตฌ์ฑ ์์์ ํน์ง์ Hadoop ๋ฌธ์ HDFS Architecture์ HBase ๋ฌธ์ Architecture Overview๋ฅผ ์ฐธ๊ณ ํ๊ธฐ ๋ฐ๋๋๋ค.
ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ ์คํจ๋ก ์ธํ ์ฅ์ ์ํฉ
HBase ๋ฒ์ 1์ RegionServer๋ HDFS๊ฐ ์ ๊ณตํ๋ DFSOutputStream
์ ํตํด WAL ๋ฐ์ดํฐ๋ฅผ ์ด๋ค. HDFS ํด๋ผ์ด์ธํธ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ค๊ฐ DataNode์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ์ธ ์ ์๋๋ก ํ์ดํ๋ผ์ธ์ ๋ณต๊ตฌํ๋ค. ๋คํธ์ํฌ ์ํ๊ฐ ์ข์ง ์๊ฑฐ๋ DataNode์ ๋์คํฌ๊ฐ ๊ณ ์ฅ ๋๋ ๊ฒฝ์ฐ DataNode์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
WAL ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ๋์ค DataNode์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ๊ฐ ์์๋๋๋ฐ, ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ๊ฐ ์คํจํ์ฌ RegionServer๊ฐ ์ฌ์ฉ์์ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ ํ์์ด ๋ฐ์ํ์๋ค. ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ์ ์คํจํ์ ๋ ์ด๋ค ํ์์ด ๋ฐ์ํ๋์ง Cuve ์ฌ๋ก๋ฅผ ํตํด ์์๋ณด๊ฒ ๋ค.
Cuve์์ ์ด์ํ๋ HBase ๋ฒ์ 1 ํด๋ฌ์คํฐ์ RegionServer์์ WAL ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ๋์ค ์๋ RegionServer ์ค๋ฅ ๋ก๊ทธ๊ฐ์ด IOException
์ค๋ฅ๊ฐ ๋ฐ์ํ์๋ค.
RegionServer ์ค๋ฅ ๋ก๊ทธ
2023-XX-XX XX:XX:XX,XXX WARN [DataStreamer for file ...:blk_...] hdfs.DFSClient: DataStreamer Exception
java.io.IOException: Broken pipe
at org.apache.hadoop.hdfs.DFSPacket.writeTo(DFSPacket.java)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java)
ํ์ดํ๋ผ์ธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ๋ฅผ ์ํด ์ค๋ฅ๊ฐ ๋ฐ์ํ DataNode๋ ํ์ดํ๋ผ์ธ์์ ์ ์ธ๋๋๋ฐ, ์์ ๊ฐ์ด OutputStream
์ ๋ฐ์ดํฐ๋ฅผ ์ธ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ DataNode๋ฅผ ์๋ณํ ์ ์๋ค. HDFS ํด๋ผ์ด์ธํธ๋ OutputStream
์ ๋ฐ์ดํฐ๋ฅผ ์ธ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์๋ DFSOutputStream
์ฝ๋ ์ผ๋ถ์ ๊ฐ์ด tryMarkPrimaryDatanodeFailed()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
DFSOutputStream
์ฝ๋ ์ผ๋ถ
try {
one.writeTo(blockStream); // IOException์ด ๋ฐ์ํ ์์น
blockStream.flush();
} catch (IOException e) {
tryMarkPrimaryDatanodeFailed();
throw e;
}
tryMarkPrimaryDatanodeFailed()
๋ฉ์๋๋ ์๋ tryMarkPrimaryDatanodeFailed
๋ฉ์๋ ๊ตฌํ ๋ด์ฉ๊ณผ ๊ฐ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ DataNode๊ฐ ์๋ณ๋์ง ์์ ๊ฒฝ์ฐ ํญ์ ํ์ดํ๋ผ์ธ์ ์ฒซ ๋ฒ์งธ DataNode๋ฅผ ์ค๋ฅ๊ฐ ๋ฐ์ํ DataNode๋ก ์ค์ ํ๋ค. ๊ทธ ์ด์ ๋ ํด๋ผ์ด์ธํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ errorIndex
๊ฐ ์์ผ๋ฉด DataNode ์ค๋ฅ๊ฐ ์๋ ํด๋ผ์ด์ธํธ์ ์ค๋ฅ๋ก ์ทจ๊ธ๋๋๋ฐ, ํด๋ผ์ด์ธํธ ์ค๋ฅ๋ก ์ทจ๊ธ๋๋ฉด ๋ ์ด์ ์ฌ์๋ํ์ง ์๊ณ ํด๋ผ์ด์ธํธ๊ฐ ์ข
๋ฃ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. OutputStream
์์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ค๊ฐ ๋ฐ์ํ ์ค๋ฅ๋ ํด๋ผ์ด์ธํธ ์ค๋ฅ๊ฐ ์๋ DataNode ์ค๋ฅ์ด๊ธฐ ๋๋ฌธ์, ์ค๋ฅ๊ฐ ๋ฐ์ํ DataNode๊ฐ ์๋ณ๋์ง ์์ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ DataNode๋ฅผ ์ค๋ฅ๊ฐ ๋ฐ์ํ DataNode๋ก ์ค์ ํจ์ผ๋ก์จ ์ค๋ฅ๊ฐ DataNode ์ค๋ฅ๋ก ์ฒ๋ฆฌ๋๊ณ ํ์ดํ๋ผ์ธ์ ๋ณต๊ตฌํ๊ฒ ํ๋ค.
tryMarkPrimaryDatanodeFailed
๋ฉ์๋ ๊ตฌํ ๋ด์ฉ
synchronized void tryMarkPrimaryDatanodeFailed() {
if ((errorIndex == -1) && (restartingNodeIndex.get() == -1)) {
errorIndex = 0; // errorIndex = ์ค๋ฅ๊ฐ ๋ฐ์ํ DataNode์ ์ธ๋ฑ์ค
}
}
tryMarkPrimaryDatanodeFailed()
๋ฉ์๋์ ์ํด ์ฒซ ๋ฒ์งธ DataNode๋ฅผ ์ค๋ฅ๊ฐ ๋ฐ์ํ DataNode๋ก ์ธ์ํ HDFS ํด๋ผ์ด์ธํธ๋ ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ๋ฅผ ์ํด ์ฒซ ๋ฒ์งธ DataNode๋ฅผ ์ ์ธํ๊ณ ์ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ ค๊ณ ์๋ํ๋ค.
์ฒซ ๋ฒ์งธ DataNode๋ฅผ ์ค๋ฅ๊ฐ ๋ฐ์ํ DataNode๋ก ์ธ์ํ ๋ก๊ทธ
Error Recovery for block ... in pipeline DatanodeInfoWithStorage[...], DatanodeInfoWithStorage[...], DatanodeInfoWithStorage[...]: datanode 0(DatanodeInfoWithStorage[...]) is bad.
ํ์ง๋ง ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ์ ์คํจํ๋ค. ์ดํ ๊ณ์ํด์ ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ๋ฅผ ๋ค์ ์๋ํ์ง๋ง ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ์ ์ฑ๊ณตํ์ง ๋ชปํ๋ค. ๊ณ์๋ ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ ์คํจ๋ก ์ธํด ํด๋น RegionServer๋ ๊ทธ๋ฆผ 2์ ๊ฐ์ด RPC Handler๊ฐ ๊ฝ ์ฐจ์ ์ฌ์ฉ์์ ์์ฒญ์ ์ ๋๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ๋ค.
์ฅ์ ์ํฉ ์ดํ NameNode, DataNode, RegionServer์ ๋ก๊ทธ๋ฅผ ํ์ธํด ๋ณด๋ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ DataNode๋ ํ์ดํ๋ผ์ธ์ ๋ง์ง๋ง DataNode์๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ DataNode๋ฅผ ์๋ชป ์๋ณํ์ฌ ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ๊ฐ ๊ณ์ ์คํจํ๋ ๊ฒ์ผ๋ก ์ถ์ ๋๋ค.
์์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ด์์๊ฐ ๊ฐ์ ํ์ฌ ํด๋น RegionServer๋ฅผ ์ฌ์์ํด์ผ ์ค๋ฅ๊ฐ ํด๊ฒฐ๋์๋ค. ๋งค๋ฒ ์ด์์๊ฐ ๊ฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ํ ์ฒ๋ฆฌ๋ ํ์ง๋ง ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ํด๊ฒฐ์ ์๋์๋ค. ๋ฐ๋ผ์ ์ฅ์ ์ํฉ์ ๋ํ ์ดํด๋ฅผ ๋์ด๊ณ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ชจ์ํ๊ณ ์ HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ ๋ฒ์ ์์๋ ํน์ ํด๊ฒฐ๋์๋์ง ์์๋ณด์๋ค.
HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ
HDFS๋ Hadoop์ ๊ธฐ๋ณธ(default) ํ์ผ ์์คํ ์ด๋ค. HDFS๋ ํ์ผ์ ๋ธ๋ก(Block)์ผ๋ก ๋๋์ด DataNode์ ์ ์ฅํ๊ณ ๋ฉํ๋ฐ์ดํฐ๋ NameNode์ ์ ์ฅํ๋ค. ๋ฐ์ดํฐ์ ๋ด๊ฒฐํจ์ฑ(fault tolerance)์ ์ ๊ณตํ๊ธฐ ์ํด ๋ธ๋ก์ ์ฌ๋ฌ DataNode์ ๋ณต์ ๋๋๋ฐ, ๋ณต์ ๋ณธ์ ์๋ฅผ Replication Factor๋ผ๊ณ ํ๋ฉฐ ๊ธฐ๋ณธ๊ฐ์ 3์ด๋ค. DataNode์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ์ฅ๋ ๋ธ๋ก์ Replica๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Replica์๋ ๋ค์๊ณผ ๊ฐ์ 5๊ฐ์ง ์ํ๊ฐ ์กด์ฌํ๋ค.
- Replica์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ์ํ์ด๋ค.
- Append๋ฅผ ์ํด ๋ค์ Replica๋ฅผ ์ด์ง ์์ผ๋ฉด, ์๋ก์ด ๋ฐ์ดํฐ๊ฐ Replica์ ๊ธฐ๋ก๋์ง ์๋๋ค.
- Generation stamp(๋จ์กฐ๋กญ๊ฒ ์ฆ๊ฐํ๋ ์ซ์๋ก, ๋ธ๋ก์ ์ค๋๋ Replica๋ฅผ ๊ฐ์งํ๊ธฐ ์ํ ์ฉ๋)๊ฐ ๋์ผํ Finalized Replica๋ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
Replica Being Written to
- ์์ฑ๋๊ฑฐ๋ Append์ ์ํด ๋ฐ์ดํฐ๊ฐ ์ฐ์ด๊ณ ์๋ Replica์ด๋ค.
- ์ด๋ฆฐ ํ์ผ์ ๋ง์ง๋ง ๋ธ๋ก์ ํญ์ RBW์ด๋ค.
Replica Waiting to be Recovered
- DataNode๊ฐ ์ฃฝ์๋ค๊ฐ ๋ค์ ์์๋ ๊ฒฝ์ฐ ๋ชจ๋ RBW Replica๋ RWR ์ํ๋ก ๋ณ๊ฒฝ๋๋ค.
- RWR Replica๋ ๋ ์ด์ ์ธ๋ชจ๊ฐ ์์ด์ ธ์ ๋ฒ๋ ค์ง๊ฑฐ๋ ๋ณต๊ตฌ ๊ณผ์ ์ ์ฐธ์ฌํ๋ค.
Replica Under Recovery
- ๋ณต๊ตฌ ๊ณผ์ ์ ์ฐธ์ฌํ Replica์ด๋ค.
- ๋ธ๋ก ๋ณต์ (Replication ๋ชจ๋ํฐ๋ Cluster Balancer์ ์ํด ์์ฑ)๋ฅผ ์ํด ์์ฑ๋ Replica์ด๋ค.
๋ค์ ๊ทธ๋ฆผ์ HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ๊ณผ ์ปดํฌ๋ํธ๋ค์ด ์๋ก ํต์ ํ ๋ ์ฌ์ฉํ๋ ํ๋กํ ์ฝ์ ๋ณด์ฌ์ค๋ค.
์ปดํฌ๋ํธ๋ค์ TCP/IP ์์ ์ค๊ณ๋ ํ๋กํ ์ฝ์ ์ฌ์ฉํด์ ์๋ก ํต์ ํ๋ค. Client Protocol (apache/hadoop
)์ ํด๋ผ์ด์ธํธ์ NameNode ๊ฐ์ ํต์ ์ ์ํด ์ ์๋ ํ๋กํ ์ฝ์ด๋ค. ํด๋ผ์ด์ธํธ๋ Client Protocol์ ์ฌ์ฉํ์ฌ ์๋ก์ด ํ์ผ์ ๋ง๋ค๊ฑฐ๋ ๊ธฐ์กด ํ์ผ์ ๊ด๋ฆฌ(์: ๋ธ๋ก ํ ๋น, ์ด๋ฆ ๋ณ๊ฒฝ, ์ญ์ , ๊ถํ ์ค์ ๋ฑ)ํ ์ ์๋ค. ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ์ํด์๋ DataNode์ ํต์ ์ ํด์ผ ํ๋๋ฐ DataNode์ ํต์ ํ ๋๋ DataTransfer Protocol (apache/hadoop
)์ ์ฌ์ฉํ๋ค. Datanode Protocol (apache/hadoop
)์ DataNode์ NameNode ๊ฐ์ ํต์ ์ ์ํด ์ ์๋ ํ๋กํ ์ฝ์ด๋ค. DataNode์์ NameNode๋ก ๋ธ๋ก ๋ฆฌํฌํธ ๋ฑ์ ๋ณด๋ผ ๋ ์ฌ์ฉ๋๋ค.
๊ฐ Protocol์ ์์ฒญ๊ณผ ์๋ต ๋ฐ์ดํฐ๋ Protocol Buffer๋ฅผ ํตํด ์ง๋ ฌํ, ์ญ์ง๋ ฌํ๋๋ค. Protocol Buffer๋ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํ, ์ญ์ง๋ ฌํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. .proto
ํ์ผ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๊ตฌ์กฐํ๋์ด ์๋์ง ์ ์ํ๊ณ Protobuf Compiler๋ก ์ปดํ์ผํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํ, ์ญ์ง๋ ฌํํ ์ ์๋ ํน์ํ ์ฝ๋๋ฅผ ๋ค์ํ ์ธ์ด๋ณ๋ก ์์ฑํ ์ ์๋ค. Protobuf Compiler๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ํ ํ๋ซํผ๊ณผ ์ธ์ด์์ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํ, ์ญ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅํ๋ค.
Protocol ๋ณ ์ฃผ์ ๊ธฐ๋ฅ
- ํ์ผ ๊ด๋ จ
create
: ๋ค์์คํ์ด์ค์ ์๋ก์ด ํ์ผ ํญ๋ชฉ(Entry)์ ๋ง๋ ๋ค.append
: ํ์ผ ๋์ ์ถ๊ฐํ๋ค.setPermission
: ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ์ ๊ถํ์ ์ค์ ํ๋ค.setOwner
: ๊ฒฝ๋ก(ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ)์ ์์ ์๋ฅผ ์ค์ ํ๋ค.addBlock
: ์ฐ๊ธฐ๋ฅผ ์ํด ์ด๋ ค์๋ ํ์ผ์ ๋ธ๋ก์ ์ฐ๊ธฐ ์ํด ํธ์ถํ๋ค. ์๋ก์ด ๋ธ๋ก๊ณผ ๋ธ๋ก์ ๋ณต์ ํ DataNode๋ฅผ ํ ๋น๋ฐ๋๋ค.complete
: ํด๋ผ์ด์ธํธ๊ฐ ํ์ผ์ ๋ฐ์ดํฐ ์ฐ๊ธฐ๋ฅผ ์๋ฃํ์ ๋ ํธ์ถํ๋ค.
- ๋ค์์คํ์ด์ค ๊ด๋ จ
rename
: ๋ค์์คํ์ด์ค์ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ ์ด๋ฆ์ ๋ฐ๊พผ๋ค.delete
: ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ญ์ ํ๋ค.mkdirs
: ์๋ก์ด ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
- ์์คํ
๊ด๋ จ
renewLease
: ํ์ผ์ ๋ํ ๋ณ๊ฒฝ ๊ถํ์ ์์ง ์๊ธฐ ์ํด NameNode์ ์ด์์๋ค๊ณ ๋ณด๊ณ ํ๋ค.recoverLease
: Lease๋ฅผ ๋ณต๊ตฌํ๋ค.
readBlock
: ๋ธ๋ก์ ์ฝ๋๋ค.writeBlock
: DataNode ํ์ดํ๋ผ์ธ์ ๋ธ๋ก์ ์ด๋ค.
registerDatanode
: DataNode๋ฅผ ๋ฑ๋กํ๋ค.sendHeartbeat
: NameNode์ DataNode๊ฐ ์ด์์์์ ์๋ฆฌ๊ธฐ ์ํด Heartbeat ์์ฒญ์ ๋ณด๋ธ๋ค.blockReport
: ๋ธ๋ก ๋ฆฌํฌํธ๋ฅผ ๋ณด๋ธ๋ค.
์๋ก์ด ํ์ผ ํญ๋ชฉ ์์ฑ
ํด๋ผ์ด์ธํธ๊ฐ HDFS์ ์๋ก์ด ํ์ผ์ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ธฐ ์ํด์๋ ๋จผ์ ๋ค์์คํ์ด์ค์ ์๋ก์ด ํ์ผ ํญ๋ชฉ์ ๋ง๋ค์ด์ผ ํ๋ค. ์๋ก์ด ํ์ผ ํญ๋ชฉ์ ๋ง๋ค๊ธฐ ์ํด ํด๋ผ์ด์ธํธ๋ NameNode์ create
์์ฒญ(๊ทธ๋ฆผ 3์ 1)์ ๋ณด๋ธ๋ค.
message CreateRequestProto {
// ํ์ผ ๊ฒฝ๋ก
src: "/test_dir/file.txt"
// ํด๋ผ์ด์ธํธ๋ช
clientName: "DFSClient_..."
// File create semantic (CreateFlag)
createFlag: 3
// ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ ์์ฑ ์ฌ๋ถ
createParent: true
// block replication factor (dfs.replication)
replication: 3
// maximum block size (dfs.blocksize)
blockSize: 5242880
// Crypto protocol version
cryptoProtocolVersion: ENCRYPTION_ZONES
// Permision
masked {
perm: 420
}
unmasked {
perm: 438
}
}
NameNode๋ fileId
(Inode ID)๊ฐ ํฌํจ๋ ํ์ผ ์ํ ์ ๋ณด๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ผ๋ก ๋ณด๋ธ๋ค.
message CreateResponseProto {
// ํ์ผ ์ํ
fs: message HdfsFileStatusProto {
fileType: IS_FILE
...
owner: "owner"
group: "group"
...
block_replication: 3
blocksize: 5242880
// Inode ID
fileId: 17434
}
}
DataNode ํ ๋น
NameNode๋ก๋ถํฐ create
์๋ต์ ๋ฐ์ ํ ํด๋ผ์ด์ธํธ๋ ๋ฐ์ดํฐ๋ฅผ ์ธ DataNode๋ฅผ ํ ๋น๋ฐ์์ผ ํ๋ค. ํด๋ผ์ด์ธํธ๋ DataNode๋ฅผ ํ ๋น๋ฐ๊ธฐ ์ํด NameNode์ addBlock
์์ฒญ(๊ทธ๋ฆผ 3์ 2)์ ๋ณด๋ธ๋ค. ํด๋ผ์ด์ธํธ๋ addBlock
์์ฒญ ์ create
์๋ต์ผ๋ก ๋ฐ์๋ fileId
(Inode ID)์ ๋ธ๋ก ํ ๋น์ ์ํ ํํธ ์ ๋ณด๋ฅผ ๋ณด๋ธ๋ค.
message AddBlockRequestProto {
// ํ์ผ ๊ฒฝ๋ก
src: "/test_dir/file.txt"
// ํด๋ผ์ด์ธํธ๋ช
clientName: "DFSClient_..."
// ๋ธ๋ก ํ ๋น ์ ์ ์ธํ๊ณ ์ถ์ ๋
ธ๋
excludeNodes: []
// Inode ID
fileId: 17434
// ํด๋ผ์ด์ธํธ๊ฐ ์ ํธํ๋ ๋
ธ๋
favoredNodes: ""
// ๋ธ๋ก ํ ๋น์ ๋ํ ํํธ(AddBlockFlag)
flags: ""
}
NameNode๋ addBlock
์๋ต์ผ๋ก ํด๋ผ์ด์ธํธ์ ๋ธ๋ก ์ ๋ณด์ ํ์ดํ๋ผ์ธ ๋์ DataNode ์ ๋ณด๋ฅผ ๋ณด๋ธ๋ค.
message AddBlockResponseProto {
block: message LocatedBlockProto {
// ๋ธ๋ก ์ ๋ณด
b: message ExtendedBlockProto {
// Block Pool ID
poolId: "BP-..."
// Block ID
blockId: 1073742133
generationStamp: 1309
numBytes: 0
}
// ํ์ผ์์ ๋ธ๋ก์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํธ ์คํ์
offset: 0
// ํ์ดํ๋ผ์ธ ๋์ DataNode ์ ๋ณด
locs: [DatanodeInfoProto, DatanodeInfoProto, message DatanodeInfoProto {
// DataNode IP ์ฃผ์, ํธ์คํธ๋ช
, ํฌํธ ์ ๋ณด
id: message DatanodeIDProto {
ipAddr: "x.x.x.x"
hostName: "example"
datanodeUuid: "..."
xferPort: 0
infoPort: 0
ipcPort: 0
infoSecurePort: 0
}
...
}]
storageTypes: [DISK, DISK, DISK]
storageIDs: [..., ... , ...]
...
}
}
ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ ๋ฐ ๋ฐ์ดํฐ ์ฐ๊ธฐ
NameNode๋ก๋ถํฐ ํ์ดํ๋ผ์ธ ๋์ DataNode ์ ๋ณด๋ฅผ ํ๋ํ ํด๋ผ์ด์ธํธ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ธฐ ์ํด ํ์ดํ๋ผ์ธ ๋์ DataNode๋ค๋ก ๋ธ๋ก ์์ฑ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๊ณ ๋ธ๋ก์ ํจํท(๋คํธ์ํฌ ํจํท์ด ์๋๋ผ HDFS ๋ฐ์ดํฐ ์ฐ๊ธฐ์์ ์ฌ์ฉ๋๋ ํด๋์ค๋ฅผ ์๋ฏธ)์ผ๋ก ๋๋์ด ํ์ดํ๋ผ์ธ์ DataNode์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค. ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ๊ณผ์ ์ ๊ทธ๋ฆผ 4์ ๊ฐ์ด 3 ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋ค.
1 ๋จ๊ณ: ํ์ดํ๋ผ์ธ ์ค์
๊ทธ๋ฆผ 4์ T0~T1์ ํ์ดํ๋ผ์ธ ์ค์ ๋จ๊ณ์ด๋ค. ํ์ดํ๋ผ์ธ์ ๋ฐ๋ผ ๋ค์ด์คํธ๋ฆผ DataNode์๊ฒ WRITE_BLOCK
์์ฒญ์ ์ ์กํ๋ค.(๊ทธ๋ฆผ 3์ 3)
message OpWriteBlockProto {
header: message ClientOperationHeaderProto {
baseHeader: message ClientOperationHeaderProto {
// ๋ธ๋ก ์ ๋ณด
block: message ExtendedBlockProto
...
}
// ํด๋ผ์ด์ธํธ๋ช
clientName: "DFSClient_..."
}
// ํ์ดํ๋ผ์ธ ๋์ DataNode ์ ๋ณด(IP ์ฃผ์, ํธ์คํธ๋ช
, ํฌํธ ์ ๋ณด, ...)
targets: [DatanodeInfoProto, DatanodeInfoProto]
// ํ์ดํ๋ผ์ธ ์คํ
์ด์ง(BlockConstructionStage)
stage: PIPELINE_SETUP_CREATE(๋ธ๋ก ์์ฑ์ ์ํ ํ์ดํ๋ผ์ธ ์ค์ )
// ํ์ดํ๋ผ์ธ ํฌ๊ธฐ
pipelineSize: 3
// minimum number of bytes received.
minBytesRcvd: 0
// maximum number of bytes received.
maxBytesRcvd: 0
// ๋ธ๋ก์ latest Generation Stamp
latestGenerationStamp: 0
}
๋ง์ง๋ง DataNode๊ฐ ์์ฒญ์ ๋ฐ์ ํ ํ์ดํ๋ผ์ธ ์ ์คํธ๋ฆผ์ผ๋ก ACK๊ฐ ์ ์ก๋๋ค.(๊ทธ๋ฆผ 3์ 4)
message BlockOpResponseProto {
// ํ์ดํ๋ผ์ธ ์ํ
status: SUCCESS
// ์ฐ๊ฒฐ ์ค์ ์ ์คํจํ ์ฒซ ๋ฒ์งธ DataNode
firstBadLink: ""
}
ํ์ดํ๋ผ์ธ ์ค์ ๋จ๊ณ๊ฐ ๋๋๋ฉด ํ์ดํ๋ผ์ธ์ ๋ฐ๋ผ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ์ค์ ๋๊ณ DataNode์ Replica๊ฐ ์ค๋น๋๋ค.
writeBlock
์์ฒญ์์stage
๊ฐPIPELINE_SETUP_CREATE
์ธ ๊ฒฝ์ฐ DataNode๋ ์๋ก์ด RBW Replica๋ฅผ ๋ง๋ ๋ค.writeBlock
์์ฒญ์์stage
๊ฐPIPELINE_SETUP_APPEND
์ธ ๊ฒฝ์ฐ append๋ฅผ ์ํด DataNode๋ Finalized Replica๋ฅผ RBW Replica๋ก ๋ฐ๊พผ๋ค.
2 ๋จ๊ณ: ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ
๊ทธ๋ฆผ 4์ T2~T5๋ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ๋จ๊ณ์ด๋ค. ๊ทธ๋ฆผ 4์ T2์์ ์ฒซ ๋ฒ์งธ ํจํท์ด ์ ์ก๋์๊ณ T5์์ ๋ง์ง๋ง ํจํท์ ACK๋ฅผ ์์ ํ๋ค.
ํ์ดํ๋ผ์ธ ์ค์ ์ด ์๋ฃ๋๋ฉด ํด๋ผ์ด์ธํธ๋ ํ์ดํ๋ผ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋๋ฐ, ๋ฐ์ดํฐ๋ ๋จผ์ ํด๋ผ์ด์ธํธ ๋ฒํผ์ ์ ์ฅ๋๋ค. ๋ฒํผ๊ฐ ๊ฝ ์ฐจ๋ฉด ํ์ดํ๋ผ์ธ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ก๋๋ค.(๊ทธ๋ฆผ 3์ 5)
์ด์ ํจํท์ ACK๋ฅผ ๋ฐ๊ธฐ ์ ์ด๋ผ๋ ํ์ดํ๋ผ์ธ์ ํตํด ๋ค์ ํจํท์ด ์ ์ก๋ ์ ์๋ค. ๊ทธ๋ฆผ 4์ T3์์ hflush
๊ฐ ํธ์ถ๋์๋ค. hflush
๊ฐ ๋ช
์์ ์ผ๋ก ํธ์ถ๋ ๊ฒฝ์ฐ์๋ ํจํท์ด ์ฑ์์ง์ง ์์์ด๋ ํ์ดํ๋ผ์ธ์ผ๋ก ์ ์ก๋๋ค. hflush
๋ ๋๊ธฐ ์์
์ด๊ธฐ ๋๋ฌธ์ flush๋ ํจํท์ ACK๋ฅผ ๋ฐ๊ธฐ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ธ ์ ์๋ค. ๊ทธ๋ฆผ 4์ packet 2๋ packet 1์ ACK๋ฅผ ์์ ํ ๊ทธ๋ฆผ 4์ T4 ์ดํ์ ์ ์ก๋๋ค.
3 ๋จ๊ณ: ํ์ดํ๋ผ์ธ ์ข ๋ฃ
๊ทธ๋ฆผ 3์ T6~T7์ ํ์ดํ๋ผ์ธ ์ข ๋ฃ ๋จ๊ณ์ด๋ค. ํด๋ผ์ด์ธํธ๋ ๋ชจ๋ ํจํท์ ACK์ ๋ฐ์ ํ์ ์ข ๋ฃ(close) ์์ฒญ์ ๋ณด๋ธ๋ค. ํ์ดํ๋ผ์ธ์ ๋ชจ๋ DataNode๋ ํด๋น Replica๋ฅผ Finalized ์ํ๋ก ๋ณ๊ฒฝํ๊ณ NameNode์ ๋ณด๊ณ ํ๋ค. NameNode๋ Replica์ ์ํ๊ฐ Finalized๋ผ๊ณ ๋ณด๊ณ ํ DataNode์ ์๊ฐ ์ต์ ๋ณต์ ์ ์ด์์ธ ๊ฒฝ์ฐ ๋ธ๋ก์ ์ํ๋ฅผ ์๋ฃ(Complete)๋ก ๋ฐ๊พผ๋ค. ํ์ผ์ ๋ซ์ผ๋ ค๋ฉด ํ์ผ์ ๋ชจ๋ ๋ธ๋ก์ด ์๋ฃ๋ ์ํ์ฌ์ผ ํ๋ค
๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค ์ด ํด๋ผ์ด์ธํธ๋ ํด๋น ํ์ผ์ ์ฐ๊ธฐ ์์
์ด ์๋ฃ๋์๋ค๋ ๊ฒ์ NameNode๋ก ์๋ฆฌ๊ณ ํ์ผ์ ๋ซ๊ธฐ ์ํด NameNode์ complete
์์ฒญ(๊ทธ๋ฆผ 3์ 7)์ ๋ณด๋ธ๋ค.
message CompleteResponseProto {
// ํ์ผ ๊ฒฝ๋ก
src: "/test_dir/file.txt"
// ํด๋ผ์ด์ธํธ๋ช
clientName: "DFSClient_..."
// ๋ง์ง๋ง ๋ธ๋ก ์ ๋ณด
last: message ExtendedBlockProto {
poolId: "..."
blockId: "..."
generationStamp: ...
}
// Inode ID
fileId: 17434
}
message CompleteResponseProto {
// ์ฑ๊ณต ์ฌ๋ถ
result: true
}
HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ์ ํน์ง
์ง๊ธ๊น์ง HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ์ ๋ํด ์์๋ณด์๋ค. HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ์ ๊ฐ ๋ ธ๋์ ๋คํธ์ํฌ ๋์ญํญ์ ์ต๋ํ ํ์ฉํ์ฌ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ต์ํํ๋ ๋ฐฉ์์ด๋ค. ์ HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ์ด ๊ฐ ๋ ธ๋์ ๋คํธ์ํฌ ๋์ญํญ์ ์ต๋ํ ํ์ฉํ๋ ๋ฐฉ์์ธ์ง ๊ทธ๋ฆผ 5์ ๊ทธ๋ฆผ 6์ ๋น๊ต๋ฅผ ํตํด ์์๋ณด๊ฒ ๋ค.
HDFS ํด๋ผ์ด์ธํธ๋ฅผ ํฌํจํ์ฌ ๊ฐ ๋ ธ๋์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋์ญํญ์ด 1Gbps๋ผ๊ณ ๊ฐ์ ํ๋ฉด ๊ทธ๋ฆผ 5์ ๊ฒฝ์ฐ ๋ณต์ ๋ณธ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ฌ ์ ์กํ๋ ์ ์ฒด ๋ฐ์ดํฐ์ ์์ 3Gbps๊ฐ ๋๋ค. ์ค์ ๋ก๋ DataNode 2์ DataNode 3๊ฐ ๋์ผ Rack ์์ ์๊ธฐ ๋๋ฌธ์ ์ง์ฐ ์๊ฐ์ด ์งง๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ๋์ญํญ๋ ๋ ์ปค์ ๋ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๊ฐ ์ ์ก๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ๊ทธ๋ฆผ 6๊ณผ ๊ฐ์ด ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ DataNode์ ์ ์กํ๋ฉด ์ ์กํ๋ ์ ์ฒด ๋ฐ์ดํฐ์ ์์ 1Gbps๊ฐ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก HDFS์ ์ ์ฅํ๋ ํ์ผ์ ํฌ๊ธฐ๊ฐ ํฌ๋ค. ์ ์ฅํด์ผ ํ๋ ํ์ผ์ ํฌ๊ธฐ๊ฐ ํฌ๊ธฐ ๋๋ฌธ์ ๋ณต์ ๋ฅผ ์ํด ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์กํด์ผ ํ๋ ๋ฐ์ดํฐ์ ์๋ ๋ง์์ง๋ค.
์ฆ, ๊ฐ ๋ ธ๋์ ๋์ญํญ์ ์ต๋ํ ํ์ฉํ๋ ํ์ดํ๋ผ์ธ ๋ฐฉ์์ด ํฐ ํ์ผ์ ์ ์ฅํ๋ HDFS์์ ํจ์จ์ ์ด๋ค.
Fan-out DFSOutputStream๋ฅผ ํตํ WAL ์ฐ๊ธฐ ์ต์ ํ
HBase๋ ์๋์ ๊ฐ์ด 4๊ฐ์ง์ WAL Durability ์ค์ ์ ์ ๊ณตํ๋ฉฐ, SYNC_WAL
์ด ๊ธฐ๋ณธ๊ฐ์ด๋ค.
- WAL์ ๋นํ์ฑํํ๋ค.
- ๋ฐ์ดํฐ ์์ค์ด ๋ฐ์ํ ์ ์๋ ์ต์ ์ด๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ WAL์ ์ด ๋ฐ์ดํฐ๊ฐ sync๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค.
- ๋ฐ์ดํฐ ์์ค์ด ๋ฐ์ํ ์ ์๋ ์ต์ ์ด๋ค.
- ํด๋ผ์ด์ธํธ์ ๋ฆฌํดํ๊ธฐ ์ ์ ๋ฐ์ดํฐ๊ฐ sync๋๊ธธ ๊ธฐ๋ค๋ฆฐ๋ค.(HDFS์
hflush
ํธ์ถ)
- ํด๋ผ์ด์ธํธ์ ๋ฆฌํดํ๊ธฐ ์ ์ ๋ฐ์ดํฐ๊ฐ fsync๋๊ธธ ๊ธฐ๋ค๋ฆฐ๋ค.(HDFS์
hsync
ํธ์ถ)
WAL Durability ์ค์ ์ด SYNC_WAL
์ธ ๊ฒฝ์ฐ HBase๋ WAL์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ๋ฐ์ดํฐ ์์ค์ ๋ฐฉ์งํ๊ธฐ ์ํด HDFS์ hflush
๋ฅผ ํธ์ถํด ๋ฐ์ดํฐ๊ฐ sync๋๊ธธ ๊ธฐ๋ค๋ฆฐ๋ค. hflush
๋ ๋๊ธฐ ์์
์ผ๋ก, ํด๋ผ์ด์ธํธ๋ ์ ์กํ ํจํท์ ACK๊ฐ ์ค๊ธธ ๊ธฐ๋ค๋ฆฐ๋ค.(2 ๋จ๊ณ: ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ์ฐธ๊ณ )
WAL ๋ฐ์ดํฐ๋ ์๋์ ์ผ๋ก ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ WAL ์ฐ๊ธฐ๋ ๋คํธ์ํฌ ๋์ญํญ์ ์ํฅ์ ๋ ๋ฐ์ง๋ง, ์ ์กํ ํจํท์ ACK๊ฐ ์ค๊ธธ ๊ธฐ๋ค๋ ค์ผ ํ๊ธฐ ๋๋ฌธ์ ์ง์ฐ ์๊ฐ์ด ๊ธด ๊ฒฝ์ฐ WAL ์ฐ๊ธฐ ์ฑ๋ฅ์ด ๋ฎ์์ง ์ ์๋ค. ๋ฐ๋ผ์ WAL ์ฐ๊ธฐ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด์๋ ์ง์ฐ ์๊ฐ์ ๊ฐ์์ํค๋ ๊ฒ ์ค์ํ๋ฐ, ๊ทธ๋ฆผ 5์ ๊ฐ์ด ํ์ดํ๋ผ์ธ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ฉด ACK๊ฐ ์ฌ๋ฌ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ์ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ์ง์ฐ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์๋ค. ๊ทธ๋ฆผ 6๊ณผ ๊ฐ์ด ํด๋ผ์ด์ธํธ๊ฐ ๋์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ ACK๋ฅผ ์ง์ ๋ฐ์ผ๋ฉด ์ง์ฐ ์๊ฐ์ ์ค์ผ ์ ์๋ค.
HBase๋ WAL ์ฐ๊ธฐ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด Netty ๊ธฐ๋ฐ์ผ๋ก ๊ทธ๋ฆผ 6์ฒ๋ผ DataNode์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ฐ๋ WAL ์ฐ๊ธฐ์ฉ Fan-out DFSOutputStream์ ๊ฐ๋ฐํ๋ค. HBase๋ ๋ค์๊ณผ ๊ฐ์ด hbase.wal.provider
๋ฅผ ์ค์ ํ์ฌ WAL ๊ตฌํ์ฒด๋ฅผ ์ง์ ํ ์ ์๋๋ฐ hbase.wal.provider
๋ฅผ asyncfs
(HBase 2์์ ๊ธฐ๋ณธ๊ฐ)๋ก ์ค์ ํ ๊ฒฝ์ฐ Fan-out DFSOutputStream์ด ์ฌ์ฉ๋๋ค.
- HBase 2์์ ๊ธฐ๋ณธ๊ฐ์ด๋ค.
- HBase 2์์ ์ถ๊ฐ๋์์ผ๋ฉฐ WAL ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ก ์์ฑ ํ์ดํ๋ผ์ธ์ ๋ฐ๋ผ์ ์ฐ์ง ์๊ณ ๋์์(Fan-out) ์ฐ๊ธฐ ๋๋ฌธ์ ์ง์ฐ ์๊ฐ์ ์ค์ผ ์ ์๋ค.
- HBase 1์์ ๊ธฐ๋ณธ๊ฐ์ด๋ค.
- DFSClient๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก์ผ๋ฉฐ ๋ธ๋ก ์์ฑ ํ์ดํ๋ผ์ธ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค.
- ์ฌ๋ฌ ๊ฐ์
asyncfs
๋๋ ์ฌ๋ฌ ๊ฐ์filesystem
์ ์ฌ์ฉํ๋ ์ค์ ์ด๋ค. - RegionServer์์ ๋จ์ผ WAL์ ์ฌ์ฉํ๋ฉด ๋ณ๋ชฉ ํ์์ด ์๊ธธ ์ ์๋๋ฐ ์ฌ๋ฌ ๊ฐ์ WAL์ ๋ณ๋ ฌ๋ก ์ธ ์ ์๊ฒ ํ์ฌ ์ด ์ฒ๋ฆฌ๋์ ์ฆ๊ฐ์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
Fan-out DFSOutputStream์ ๋ชจ๋ DataNode์ ๋์์ ๋ฐ์ดํฐ ์ฐ๊ธฐ๋ฅผ ์งํํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ๋๊ธฐ ์๊ฐ์ด ๋จ์ถ๋๋ค. ๋ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ๋ฅผ ์ํํ์ง ์๊ณ ์๋ก์ด WAL ํ์ผ์ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ด๋ค. ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ๋ฅผ ์ํํ์ง ์๊ธฐ ๋๋ฌธ์ ์์์ ์ธ๊ธํ ํ์ดํ๋ผ์ธ ๋ณต๊ตฌ ์คํจ๋ก ์ธํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. Fan-out DFSOutputStream์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์๋ก์ด WAL ํ์ผ์ด ์์ฒญ๋๋ฉด FanOutOneBlockAsyncDFSOutputHelper
๋ HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ์ ๋์ผํ๊ฒ Client Protocol์ create
์์ฒญ(๊ทธ๋ฆผ 7์ 1)์ ๋ณด๋ด ๋ค์์คํ์ด์ค์ ์๋ก์ด WAL ํ์ผ ํญ๋ชฉ์ ๋ง๋ ๋ค. ๊ฐ Protocol์ ์์ฒญ๊ณผ ์๋ต ๋ฐ์ดํฐ๊ฐ Protocol Buffer๋ฅผ ํตํด ์ง๋ ฌํ, ์ญ์ง๋ ฌํ๋๊ธฐ ๋๋ฌธ์ HBase๋ HDFS์ Protocol Buffer ์ฝ๋๋ฅผ ํตํด ์ฝ๊ฒ ๋์ผํ ์์ฒญ์ ๋ง๋ค๊ณ ์๋ต์ ํ์ฑํ ์ ์๋ค.
NameNode๋ก๋ถํฐ ์๋ต์ ๋ฐ์ ํ ๋ธ๋ก์ ์ธ DataNode๋ฅผ ํ ๋น๋ฐ๊ธฐ ์ํด FanOutOneBlockAsyncDFSOutputHelper
๋ addBlock
์์ฒญ(๊ทธ๋ฆผ 7์ 2)์ NameNode๋ก ๋ณด๋ธ๋ค. NameNode๋ก๋ถํฐ ๋ธ๋ก์ ์ธ DataNode๋ฅผ ํ ๋น๋ฐ์ ํ์๋ Netty Channel์ ์ฌ์ฉํด์ DataNode์ ์ฐ๊ฒฐ์ ๋งบ๊ณ writeBlock
์์ฒญ(๊ทธ๋ฆผ 7์ 3)์ ๋ณด๋ธ๋ค. FanOutOneBlockAsyncDFSOutputHelper
๊ฐ ๋ณด๋ด๋ writeBlock
์์ฒญ์ ๋ค์๊ณผ ๊ฐ๋ค.
FanOutOneBlockAsyncDFSOutputHelper
์์ ๋ณด๋ด๋ writeBlock
์์ฒญ ์
message OpWriteBlockProto {
header: message ClientOperationHeaderProto {
// ๋ธ๋ก ์ ๋ณด
block: message ExtendedBlockProto
...
}
// ํด๋ผ์ด์ธํธ๋ช
clientName: "DFSClient_..."
// ํ์ดํ๋ผ์ธ ๋์ DataNode ์ ๋ณด(IP ์ฃผ์, ํธ์คํธ๋ช
, ํฌํธ ์ ๋ณด, ...)
targets: []
// ํ์ดํ๋ผ์ธ ์คํ
์ด์ง(BlockConstructionStage)
stage: PIPELINE_SETUP_CREATE
// ํ์ดํ๋ผ์ธ ํฌ๊ธฐ
pipelineSize: 1
// ...
}
FanOutOneBlockAsyncDFSOutputHelper
๊ฐ ๋ณด๋ด๋ writeBlock
์์ฒญ์ ์ดํด๋ณด๋ฉด HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ์์ ๋ณด๋ด๋ writeBlock
์์ฒญ๊ณผ ๋ค๋ฅด๊ฒ ํ์ดํ๋ผ์ธ ๋์ DataNode ์ ๋ณด๊ฐ ์๊ณ ํ์ดํ๋ผ์ธ ํฌ๊ธฐ๊ฐ 1์ด๋ค. ์ด ์์ฒญ์ ๋ฐ์ DataNode๋ ํ์ดํ๋ผ์ธ ๋์ DataNode ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์ ์ ํ์ดํ๋ผ์ธ์ ๋ง์ง๋ง DataNode๋ก ์ธ์ํ๊ณ ๋ค๋ฅธ DataNode์ ์ถ๊ฐ์ ์ธ ์ฐ๊ฒฐ์ ๋ง๋ค์ง ์๋๋ค. ์ฆ, DataNode๋ผ๋ฆฌ ๋ธ๋ก ์์ฑ ํ์ดํ๋ผ์ธ์ ๋ง๋ค์ง ์๋๋ค.
ํ์ง๋ง ์ด ๋ฐฉ์์ HDFS์ ๊ฐ์์ฑ(visibility)์ด ๋ณด์ฅ๋์ง ์๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ์๋ ํ์ผ์ ๊ฒฝ์ฐ HDFS์ ๊ฐ์์ฑ ๋ณด์ฅ์ ๋ฐ๋ผ ํ์ดํ๋ผ์ธ์ ๋ง์ง๋ง DataNode์ ์ฐ์ธ ๋ฐ์ดํฐ๊น์ง ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ๊ฐ ๋๋๋ฐ, Fan-out DFSOutputStream์ ๋ชจ๋ DataNode๊ฐ ํ์ดํ๋ผ์ธ์ ๋ง์ง๋ง DataNode๋ก ์ทจ๊ธ๋๊ธฐ ๋๋ฌธ์ ์์ง ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ์๋ WAL ํ์ผ์ ์ฝ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ ์ ์๋ค. HBase๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ์ฌ HDFS์ sync๋ ํ์ผ์ ๊ธธ์ด๋ฅผ ๋ณ๋๋ก ๊ด๋ฆฌํ์ฌ ๋ด๋ถ ํ๋ก์ธ์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ํด๋น ๊ธธ์ด๊น์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋๋ก ์ ํํ๋ค.
DataNode์ ๊ธฐ์กด HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ์ ํ์ดํ๋ผ์ธ ์ค์ ๋จ๊ณ๊น์ง ๋ง์น FanOutOneBlockAsyncDFSOutputHelper
๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ธ ์ ์๋๋ก FanOutOneBlockAsyncDFSOutput
์ ์์ฑํ๋ค.(๊ทธ๋ฆผ 7์ 4) ์ดํ FanOutOneBlockAsyncDFSOutput
์ Netty Channel์ ์ด์ฉํ์ฌ ๋ชจ๋ DataNode์ ๋์์ WAL ๋ฐ์ดํฐ๋ฅผ ์ด๋ค.(๊ทธ๋ฆผ 7์ 5)
HBase๋ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ์๋ WAL์ ํ์ผ ํฌ๊ธฐ๊ฐ HDFS ๋ธ๋ก ํฌ๊ธฐ(hbase.regionserver.hlog.blocksize
์ค์ )์ 50%(hbase.regionserver.logroll.multiplier
์ค์ )๊ฐ ๋๊ฑฐ๋ ๊ธฐ์กด ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๊ธฐ์กด WAL ํ์ผ์ ๋ซ๊ณ ์๋ก์ด WAL ํ์ผ์ ๋ง๋ ๋ค.
- WAL ํ์ผ์ HDFS ๋ธ๋ก ํฌ๊ธฐ(๊ธฐ๋ณธ๊ฐ: HDFS ๊ธฐ๋ณธ ๋ธ๋ก ํฌ๊ธฐ์ 2๋ฐฐ)
- WAL ํ์ผ์ ํฌ๊ธฐ๊ฐ HDFS ๋ธ๋ก ํฌ๊ธฐ์ multiplier๋งํผ ๋๋ฌํ๋ฉด ์๋ก์ด WAL ํ์ผ์ ๋ง๋ ๋ค.(๊ธฐ๋ณธ๊ฐ: 0.5)
๊ธฐ์กด WAL ํ์ผ์ ๋ซ๊ณ ์๋ก์ด WAL ํ์ผ์ ๋ง๋ค ๋ ๊ธฐ์กด FanOutOneBlockAsyncDFSOutput
์ ๋ซ๊ณ ์๋ก์ด FanOutOneBlockAsyncDFSOutput
์ ๋ง๋๋๋ฐ, FanOutOneBlockAsyncDFSOutput
์ด ๋ซํ ๋ FanOutOneBlockAsyncDFSOutput
์ DataNode์ ์ฐ๊ฒฐ์ ์ ๋ฆฌํ๊ณ NameNode์ complete
์์ฒญ(๊ทธ๋ฆผ 7์6)์ ๋ณด๋ด ํ์ฌ WAL ํ์ผ์ ์ฐ๊ธฐ ์์
์ด ์๋ฃ๋์๋ค๋ ๊ฒ์ ์๋ฆฐ๋ค.
๋ง์น๋ฉฐ
์ด ๊ธ์์๋ HDFS ์ฐ๊ธฐ ํ์ดํ๋ผ์ธ๊ณผ HBase๊ฐ WAL ์ฐ๊ธฐ ์ต์ ํ๋ฅผ ์ํด ๊ฐ๋ฐํ Fan-out DFSOutputStream์ ๋ํด ์์๋ณด์๋ค.
Fan-out DFSOutputStream์ ์์ง ์ผ๋ฐ์ ์ธ ์ฐ๊ธฐ ์์ ์์๋ ์ฌ์ฉํ ์ ์๋ค. ์ผ๋ฐ์ ์ธ ์ฐ๊ธฐ ์์ ์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Fan-out DFSOutputStream์ด ์ฌ๋ฌ ๋ธ๋ก์ ์ธ ์ ์๋๋ก ๊ฐ์ ํ๊ณ HDFS ๊ฐ์์ฑ์ด ๋ณด์ฅ๋์ง ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ค. ๋ํ ์ถํ ํด๋น ๊ธฐ๋ฅ์ ์ ์ฉํ๋ ค๋ฉด ๊ทธ ์ ์ ์ฐ๊ธฐ ์์ ์ด ๋คํธ์ํฌ ๋์ญํญ์ ์ต๋๋ก ํ์ฉํ๋ ๊ฒ์ด ์ค์ํ์ง, ์๋๋ฉด ์ง์ฐ ์๊ฐ์ ์ค์ด๋ ๊ฒ์ด ์ค์ํ์ง ๋จผ์ ํ๋จํ ํ์๊ฐ ์๋ค.
HBase์์ WAL ์ฑ๋ฅ์ ์ฌ์ฉ์ ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ์ ์ํฅ์ ๋ง์ด ์ค๋ค. ๋ฐ๋ผ์ HBase๋ WAL ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด์๋ ์ง์ฐ ์๊ฐ์ ์ค์ด๋ ๊ฒ์ด ํ์ํ๋ค. ์ด๋ฅผ ์ํด HBase๋ HDFS ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ Fan-out DFSOutputStream์ ๊ฐ๋ฐํ๋ค. 2.5.0 ๋ฒ์ ์๋ ํจํท ์ฒ๋ฆฌ ์๊ฐ์ด ๋๋ฆฐ DataNode๋ฅผ ๋น ๋ฅด๊ฒ ํ์งํ์ฌ OutputStream์์ ์ ๊ฑฐํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์๋๋ฐ(HBASE-26347 Support detect and exclude slow DNs in fan-out of WAL) ์ด๋ฌํ ๊ธฐ๋ฅ์ ์์ฒด ๊ฐ๋ฐํ Fan-out DFSOutputStream์์ ACK๊ฐ ๋์์ค๋ ์๊ฐ์ ์ธก์ ํ ์ ์์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค. ๋ง์ฝ HDFS ํ๋กํ ์ฝ์ ๋ํ ์ดํด๊ฐ ์์๋ค๋ฉด ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ด๋ ค์ ์ ๊ฒ์ด๋ค.
์ถํ ๊ธฐํ๊ฐ ๋๋ค๋ฉด ๊ฐ ์ปดํฌ๋ํธ๊ฐ ํ๋กํ ์ฝ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ์์๋ณด๊ฒ ๋ค. ์ด ๊ธ์ด HDFS ์ฐ๊ธฐ ๊ณผ์ ์ ์ดํดํ๋ ๋ฐ ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋๊ธธ ๋ฐ๋๋ค.