ํ๋ก์ ๋จ์ผ ์๋ฒ๊ฐ ์๋ ์ฌ๋ฌ ๋
ธ๋๊ฐ ๋ณ๋ ฌ๋ก ๋์ํ๋ ๋ถ์ฐ ํด๋ฌ์คํฐ๋ค.
์ด๋ฅผ ์์ ์ ์ผ๋ก ์ด์ํ๊ธฐ ์ํด ๋ค์ํ ์์ ๊ด๋ฆฌยท์กฐ์จยท์๋ํยท์คํธ๋ฆฌ๋ฐ ์ปดํฌ๋ํธ๊ฐ ํจ๊ป ๋์ํ๋ค.
๐ ์ด์ ๊ณ์ธต ๊ตฌ์กฐ
| ๊ณ์ธต | ๊ตฌ์ฑ ์์ | ์ญํ |
|---|---|---|
| ์์ ๊ด๋ฆฌ | YARN, Mesos | CPUยท๋ฉ๋ชจ๋ฆฌ ์ค์ผ์ค๋ง ๋ฐ ํ์คํฌ ๋ฐฐ๋ถ |
| ์กฐ์จ ๊ด๋ฆฌ | ZooKeeper | ํด๋ฌ์คํฐ ์ํ ๊ด๋ฆฌ, ๋ฆฌ๋ ์ ์ถ |
| ์ํฌํ๋ก ์๋ํ | Oozie | ๋ฐฐ์น ์กยท์์กด์ฑยท์ค์ผ์ค ๊ด๋ฆฌ |
| ๋ถ์ ์ธํฐํ์ด์ค | Zeppelin, Hue | SQL/๋ ธํธ๋ถยท์๊ฐํ ํ๊ฒฝ ์ ๊ณต |
| ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ | Kafka, Flume | ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ ์์งยท์ ๋ฌ |
YARN (Yet Another Resource Negotiator) ๋ Hadoop์ ์์ ๊ด๋ฆฌ ํ๋ ์์ํฌ๋ค.
๋ชจ๋ Spark, MapReduce, Hive, Tez ์์
์ YARN ์์์ ์คํ๋๋ค.
๐ YARN ๊ตฌ์กฐ ์์ฝ
| ๊ตฌ์ฑ์์ | ์ญํ |
|---|---|
| ResourceManager (RM) | ํด๋ฌ์คํฐ ์ ์ฒด ์์ ์ค์ผ์ค๋ง, ํ ๊ด๋ฆฌ |
| NodeManager (NM) | ๊ฐ ๋ ธ๋์ CPUยท๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ํฐ๋ง, ์ปจํ ์ด๋ ์คํ |
| ApplicationMaster (AM) | ๊ฐ๋ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํยท๋ณต๊ตฌ ๊ด๋ฆฌ |
| Container | ์ค์ ํ์คํฌ๊ฐ ์คํ๋๋ ๋ ผ๋ฆฌ์ ์์ ๋จ์ |
๐ก ๋์ ํ๋ฆ
1๏ธโฃ ํด๋ผ์ด์ธํธ๊ฐ ์ก(Job)์ ์ ์ถ
2๏ธโฃ RM์ด ์์์ ํ ๋นํ๊ณ AM์ ์์ฑ
3๏ธโฃ AM์ด NMs์ ํ์คํฌ(Container) ๋ฐฐํฌ
4๏ธโฃ ์คํ ์๋ฃ ํ RM์ ๋ณด๊ณ
๐ ์ด์ ํฌ์ธํธ
http://localhost:8088Apache Tez๋ YARN ์์์ ์คํ๋๋ DAG(Directed Acyclic Graph) ๊ธฐ๋ฐ ์คํ ์์ง์ด๋ค.
Hive์ Pig์ ๋ด๋ถ ์คํ์ MapReduce๋ณด๋ค ์์ญ ๋ฐฐ ๋น ๋ฅด๊ฒ ์ต์ ํํ๋ค.
๐ Tez์ ํต์ฌ
๐ก ํ์ฉ
set hive.execution.engine=tez;tez.view UI์์ DAG ๊ทธ๋ํ ์คํ ํ๋ก์ฐ ํ์ธ๐ ์ฑ๋ฅ ์ด์ ์ธก์ ์์
| ์์ง | ์ฒ๋ฆฌ ์๊ฐ(์์) | ๊ฐ์ ์จ |
|---|---|---|
| MapReduce | 120์ด | baseline |
| Tez | 15์ด | 8๋ฐฐ ๋น ๋ฆ |
Apache Mesos๋ Hadoop, Spark, Kafka ๋ฑ ๋ค์ํ ํ๋ ์์ํฌ๋ฅผ
ํ๋์ ํด๋ฌ์คํฐ ์์ ํ๋ก ํตํฉ ๊ด๋ฆฌํ๋ ํ๋ซํผ์ด๋ค.
๐ ์ฃผ์ ํน์ง
๐ ๋น๊ต ์์ฝ
| ํญ๋ชฉ | YARN | Mesos |
|---|---|---|
| ์ฃผ์ ์ฉ๋ | Hadoop ์ํ๊ณ ์ ์ฉ | ๋ฒ์ฉ ํด๋ฌ์คํฐ ๊ด๋ฆฌ |
| ๋ฐฐํฌ ๋จ์ | ApplicationMaster ์ค์ฌ | Framework ์ค์ฌ |
| ํตํฉ ๊ฐ๋ฅ์ฑ | MapReduce, Spark, Tez | Spark, Kafka, Docker ๋ฑ |
๐ก ์ ์ฉ ์์
Apache ZooKeeper๋ ๋ถ์ฐ ํ๊ฒฝ์์ ์๋ฒ ๊ฐ์ ๋๊ธฐํยท๋ฆฌ๋ ์ ์ถยท๊ตฌ์ฑ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ค.
HBase, Kafka, Oozie ๋ฑ ๋ค์์ Hadoop ๊ตฌ์ฑ์์๊ฐ ZooKeeper์ ์์กดํ๋ค.
๐ ํต์ฌ ๊ธฐ๋ฅ
| ๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
| Leader Election | ๋ง์คํฐ ์ฅ์ ์ ์๋ ๋ฆฌ๋ ์ ์ถ |
| Configuration Management | ๋ ธ๋ ์ํยท๋ฉํ๋ฐ์ดํฐ ์ ์ฅ |
| Synchronization | ์ฌ๋ฌ ๋ ธ๋ ๊ฐ ๋์์ฑ ์ ์ด |
| Watch Mechanism | ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํ ๊ฐ์ |
๐ ์ค์ต: ๋ง์คํฐ ์ฅ์ ์๋ฎฌ๋ ์ด์
1๏ธโฃ ZooKeeper ํด๋ฌ์คํฐ(3๋
ธ๋ ์ด์) ์คํ
2๏ธโฃ Leader ๋
ธ๋ ๊ฐ์ ์ข
๋ฃ
3๏ธโฃ 1์ด ์ด๋ด ์ ๋ฆฌ๋ ์๋ ์ ์ถ ํ์ธ
๐ ๊ฒฐ๊ณผ
Apache Oozie๋ Hadoop ์์
(Hive, Pig, Sqoop, Spark, Shell ๋ฑ)์
์๊ฐยท์์กด์ฑยท์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ์๋ ์คํํ๋ ์ํฌํ๋ก ๋งค๋์ ๋ค.
๐ Oozie ๊ตฌ์กฐ
| ๊ตฌ์ฑ ์์ | ์ค๋ช |
|---|---|
| Coordinator | ์ฃผ๊ธฐ์ ์คํ (e.g., ๋งค์ผ 0์) |
| Workflow | XML ๊ธฐ๋ฐ ์์ ์ ์ (action ๊ฐ ์์ ์ง์ ) |
| Action Node | Hive/Pig/Shell/MapReduce ์คํ ๋จ์ |
| Control Node | Start, End, Kill, Decision ๋ฑ ํ๋ฆ ์ ์ด |
๐ป ๊ฐ๋จํ ์ํฌํ๋ก ์์
<workflow-app name="movielens_etl" xmlns="uri:oozie:workflow:0.5">
<start to="hive-load"/>
<action name="hive-load">
<hive xmlns="uri:oozie:hive-action:0.5">
<script>load_movielens.hql</script>
</hive>
<ok to="spark-train"/>
<error to="fail"/>
</action>
<action name="spark-train">
<spark xmlns="uri:oozie:spark-action:0.2">
<master>yarn-cluster</master>
<name>ALSModelTrain</name>
<class>com.recommender.TrainALS</class>
</spark>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail"><message>Workflow failed</message></kill>
<end name="end"/>
</workflow-app>
๐ก ํ์ฉ
๐ป Zeppelin์ผ๋ก ์ํ ํ์ ๋ถ์
%hive
SELECT movieId, AVG(rating) AS avg_rating
FROM movielens.ratings
GROUP BY movieId
ORDER BY avg_rating DESC
LIMIT 10;
๐ ํ์ฉ
Apache Kafka๋ ์ค์๊ฐ ๋ก๊ทธยท์ด๋ฒคํธ๋ฅผ ๋ถ์ฐ ๋ฉ์์ง ํ๋ก ์ฒ๋ฆฌํ๋ ์์คํ
์ด๋ค.
์๋ง์ ๋ฐ์ดํฐ ์์ฐ์(Producer)์ ์๋น์(Consumer)๊ฐ Kafka Topic์ ํตํด ํต์ ํ๋ค.
๐ Kafka ๊ตฌ์ฑ
| ๊ตฌ์ฑ ์์ | ์ค๋ช |
|---|---|
| Producer | ๋ฉ์์ง ์์ฑ (์น ๋ก๊ทธ, IoT, ์ฑ ๋ฑ) |
| Broker | ๋ฉ์์ง ์ ์ฅยท์ ๋ฌ (๋ถ์ฐ ํํฐ์ ๊ด๋ฆฌ) |
| Consumer | ๋ฉ์์ง ๊ตฌ๋ ๋ฐ ์ฒ๋ฆฌ |
| ZooKeeper | ๋ธ๋ก์ปค ๋ฉํ๋ฐ์ดํฐ ๊ด๋ฆฌ |
๐ก ํ์ฉ ์์
๐ Kafka ๋ช ๋ น ์์
# ํ ํฝ ์์ฑ
kafka-topics.sh --create --topic weblogs --bootstrap-server localhost:9092
# ๋ฉ์์ง ๊ฒ์
kafka-console-producer.sh --topic weblogs --bootstrap-server localhost:9092
# ๋ฉ์์ง ์๋น
kafka-console-consumer.sh --topic weblogs --bootstrap-server localhost:9092 --from-beginning
Apache Flume์ ๋ก๊ทธ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ์์ ๋ฐ์ํ๋ ๋ฐ์ดํฐ๋ฅผ
HDFS, HBase, Kafka ๋ฑ์ผ๋ก ์ค์๊ฐ ์ ์กํ๋ค.
๐ Flume ๊ตฌ์ฑ
| ๊ตฌ์ฑ์์ | ์ญํ |
|---|---|
| Source | ์ ๋ ฅ ์์ง (๋ก๊ทธ ํ์ผ, TCP, syslog ๋ฑ) |
| Channel | ๋ฒํผ ์ญํ (๋ฉ๋ชจ๋ฆฌ or ํ์ผ ๊ธฐ๋ฐ) |
| Sink | ์ถ๋ ฅ ๋์ (HDFS, Kafka ๋ฑ) |
๐ก ์์ ๊ตฌ์ฑ (Flume โ HDFS)
agent.sources = src
agent.sinks = sink
agent.channels = ch
agent.sources.src.type = spooldir
agent.sources.src.spoolDir = /var/logs/web
agent.channels.ch.type = memory
agent.sinks.sink.type = hdfs
agent.sinks.sink.hdfs.path = /data/weblogs
agent.sources.src.channels = ch
agent.sinks.sink.channel = ch
Flume์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ์ํ๋ฉฐ ์ ํ์ผ์ด ์๊ธฐ๋ฉด ์๋์ผ๋ก HDFS์ ์ ์ฅํ๋ค.
Kafka์ ์ฐ๋ํ๋ฉด ์์ ํ ์ค์๊ฐ ์์ง ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ ์ ์๋ค.
๐ ์๋ํฌ์๋ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ๊ฐ๋ ๋
[Flume/Kafka] โ [YARN + HDFS/HBase] โ [Hive/Tez/Spark] โ [Oozie Scheduler]
โ โ
(์ค์๊ฐ ๋ก๊ทธ ์์ง) (๊ฒฐ๊ณผ ์ ๊ณต: Zeppelin/Hue)
| ๋จ๊ณ | ์ญํ | ์ฌ์ฉ ๊ธฐ์ |
|---|---|---|
| ์์ง | ๋ก๊ทธ/์ด๋ฒคํธ ์์ง | Flume, Kafka |
| ์ ์ฅ | ๋ถ์ฐ ํ์ผยทDB | HDFS, HBase |
| ์ฒ๋ฆฌ | ๋ถ์ฐ ๊ณ์ฐ | Spark, Hive, Tez |
| ๊ด๋ฆฌ | ๋ฆฌ์์ค ์ค์ผ์ค๋ง | YARN, Mesos |
| ์กฐ์จ | ์ฅ์ ๋ณต๊ตฌ, ์ํ ๊ด๋ฆฌ | ZooKeeper |
| ์๋ํ | ์ํฌํ๋ก ์ ์ด | Oozie |
| ์ ๊ณต | ๋ถ์ ์๊ฐํ | Zeppelin, Hue |
์ด๋ฒ ํธ์์๋ Hadoop ํด๋ฌ์คํฐ๊ฐ ๋จ์ ์ ์ฅ์๋ฅผ ๋์ด
๋ฐ์ดํฐ ์์ง โ ๋ถ์ฐ ์ฒ๋ฆฌ โ ์๋ํ โ ์๊ฐํ๋ก ์ด์ด์ง๋
์์ ํ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ์ํ๊ณ๋ก ๋ฐ์ ํ๋ ๊ณผ์ ์ ๋ค๋ค๋ค.
YARN์ด ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๊ณ ,
Tez๊ฐ ์ฐ์ฐ์ ๊ฐ์ํ๋ฉฐ,
ZooKeeper๊ฐ ์์ ์ฑ์ ์ ์งํ๊ณ ,
Oozie๊ฐ ์ํฌํ๋ก๋ฅผ ์๋ํํ๋ค.
๊ทธ๋ฆฌ๊ณ KafkaยทFlume์ด ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ๊ณต๊ธํ๋ค.
์ด ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ฉด ๋๊ท๋ชจ ๋ฐ์ดํฐ ์์คํ
์ ์ด์๊ณผ ๋ฐ์ดํฐ ํ๋ฆ ์ ์ด๋ฅผ
์์ ํ ํตํฉ์ ์ผ๋ก ์ค๊ณํ ์ ์๋ค.
๋ค์ ํธ์์๋ ์ด ๋ชจ๋ ๊ตฌ์ฑ์์๋ฅผ ํ์ฉํด
์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ๋ถ์ ๋ฐ Hadoop ์ํคํ
์ฒ ์ค๊ณ๋ฅผ ๋ค๋ฃฌ๋ค.