Spark, Kafka, Docker๋ฅผ ์ฌ์ฉํ์ฌ ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๋ ์ค, Kerberos๋ฅผ ์ฌ์ฉํ์ง๋ ์์๋๋ฐ Kerberos ์ธ์ฆ๊ณผ ๊ด๋ จ๋ Spark ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
org.apache.hadoop.security.KerberosAuthException: failure to login: javax.security.auth.login.LoginException: java.lang.NullPointerException: invalid null input: name
โ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์์ธ์?
- ๊ณต์ apache/spark:3.5.0 Docker ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค.
- Docker ๋ด๋ถ์ Spark๊ฐ Hadoop์ ๊ธฐ๋ณธ ์ธ์ฆ ๋ฉ์ปค๋์ฆ์ ํด๊ฒฐํ๋ ค๊ณ ์๋ํ์ต๋๋ค.
- Hadoop์ ๋ค์์ ํตํด ํ์ฌ OS ์ฌ์ฉ์๋ฅผ ๊ฒ์ํ๋ ค๊ณ ํ์ต๋๋ค:
UnixPrincipal(name)
- Docker ์ปจํ ์ด๋ ๋ด๋ถ์์ ์ฑ์ด ์ ์ ํ ์ฌ์ฉ์๋ช ๋งคํ์ด ์๋ UID/GID๋ก ์คํ๋๊ณ ์์์ต๋๋ค.
- ์ด๋ก ์ธํด ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค:
invalid null input: name
UnixPrincipal()์ด null์ ๋ฐ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๐ ๊ทผ๋ณธ ์์ธ
- Spark๋ ๋ด๋ถ์ ์ผ๋ก Hadoop์ UserGroupInformation์ ์ฌ์ฉํฉ๋๋ค.
- ๋ช ์์ ์ผ๋ก ๊ตฌ์ฑ๋ ์ฌ์ฉ์๊ฐ ์์ผ๋ฉด Hadoop์ ์์คํ ์ฌ์ฉ์๋ก ํด๋ฐฑํฉ๋๋ค.
- ํ์ง๋ง Docker ์ปจํ ์ด๋๋ ๋์ ์ผ๋ก ํ ๋น๋ ์ฌ์ฉ์์ ๋ํด ํญ์ ์ ํจํ /etc/passwd ํญ๋ชฉ์ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค.
- ์ ํจํ ์ฌ์ฉ์๋ช ์ด ์์ โ Hadoop ํฌ๋์ โ Kerberos ์์ธ.
โ ๏ธ ์ฐธ๊ณ : ์ด ๋ฌธ์ ๋ Kerberos๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋ฐ์ํฉ๋๋ค! ์์ธ ์ด๋ฆ์ด ์คํด๋ฅผ ๋ถ๋ฌ์ผ์ผํค๋๋ฐ, ๋จ์ํ Hadoop์ด ํ์ฌ ์ฌ์ฉ์๋ฅผ ์ฐพ์ง ๋ชปํ๋ ๊ฒ์ ๋๋ค.
๐ง ํด๊ฒฐ์ฑ : Docker ๋ด๋ถ์์ ์ ํจํ ์ฌ์ฉ์๋ช ์ค์
Spark๋ Hadoop ์ค์ ์ ํจ์นํ๋ ๋์ , ๋ค์๊ณผ ๊ฐ์ด ๊น๋ํ๊ฒ ํด๊ฒฐํ์ต๋๋ค:
1๏ธโฃ Dockerfile ๋ด๋ถ์์ ๋ช ์์ ์ผ๋ก ์ ํจํ ์ฌ์ฉ์ ์์ฑ
FROM apache/spark:3.5.0
USER root
# airflow ์ฌ์ฉ์ ์์ฑ (๋๋ ๋ค๋ฅธ ์ ํจํ ์ฌ์ฉ์)
RUN useradd --create-home --shell /bin/bash airflow
USER airflow
WORKDIR /opt/spark-app
2๏ธโฃ docker-compose.yml์์ HOME ํ๊ฒฝ ๋ณ์ ์ค์
environment:
- HOME=/home/airflow
- HADOOP_USER_NAME=airflow
3๏ธโฃ โ ์ด์ Hadoop์ UserGroupInformation์ด ์ปจํ ์ด๋ ๋ด๋ถ์์ ์ฌ์ฉ์ ์ ์์ ์ฑ๊ณต์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
๐ฌ ์ด ํด๊ฒฐ์ฑ ์ด ์๋ํ๋ ์ด์
- Hadoop์ UID๋ GID๋ฅผ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค.
- ์ ํจํ ์ฌ์ฉ์๋ช ๋ฌธ์์ด๋ง ํ์ํฉ๋๋ค.
- Docker ๋ด๋ถ์์ ๋ช ๋ช ๋ ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ฉด ์ด ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํฉ๋๋ค.
- ์์ ํ Kerberos, Kinit ๋๋ ๋ณด์ ํฐ์ผ ์ธํ๋ผ๋ฅผ ๊ตฌ์ฑํ ํ์๊ฐ ์์ต๋๋ค.
โ ์ฃผ์ ํฌ์ธํธ
- Spark ๋ด๋ถ์ Hadoop์ ์ ํจํ OS ์ฌ์ฉ์์ ์์กดํฉ๋๋ค.
- Docker๋ ๋๋๋ก ์ต๋ช UID๋ฅผ ์์ฑํฉ๋๋ค โ ํญ์ ๋ช ์์ ์ผ๋ก ์ฌ์ฉ์๋ฅผ ์์ฑํ์ธ์.
- HOME๊ณผ HADOOP_USER_NAME์ ์ผ์นํ๋๋ก ์ค์ ํ์ธ์.
- SPARK_CLASSPATH=* ์คํ์ผ์ ์์ผ๋์นด๋ ์ค์ ์ ํผํ๊ณ ๋ช ์์ ์ธ JAR ๋ง์ดํ ์ ์ ํธํ์ธ์.
- ์ฒด๊ณ์ ์ผ๋ก ๋๋ฒ๊น ํ์ธ์: ๋ก๊ทธ๋ฅผ ์์์ ์๋๋ก ์ฝ์ผ์ธ์. ๊ทผ๋ณธ ์์ธ์ ๋ณดํต ์๊ฐ๋ณด๋ค ํจ์ฌ ์์ ์์ต๋๋ค.
์ด ์์ Dockerfile ์กฐ์ ์ผ๋ก ๋ช ์๊ฐ์ ๊ณ ํต์ค๋ฌ์ด ๋๋ฒ๊น ์ ์ ์ฝํ ์ ์์์ต๋๋ค.