Я пытаюсь подключиться к кластеру hdfs из Docker образа, развернутого в miniKube. Вот мой Dockerfile:
FROM lrh7
USER root
ARG config_files=configs
ARG pyfiles=pyfiles
ARG HADOOP_PATH="/opt/hadoop"
RUN mkdir -p ${HADOOP_PATH}
RUN yum -y install which java-1.6.0-openjdk.x86_64 krb5-workstation python3
COPY hadoop-2.6.0/etc/hadoop ${HADOOP_PATH}/etc/hadoop
COPY hadoop-2.6.0/share/hadoop/hdfs ${HADOOP_PATH}/share/hadoop/hdfs
COPY hadoop-2.6.0/share/hadoop/common ${HADOOP_PATH}/share/hadoop/common
COPY hadoop-2.6.0/bin ${HADOOP_PATH}/bin
COPY hadoop-2.6.0/libexec ${HADOOP_PATH}/libexec
RUN mkdir -p ${HADOOP_PATH}/work-dir && \
rm /bin/sh && \
ln -sv /bin/bash /bin/sh && \
chgrp root /etc/passwd && chmod ug+rw /etc/passwd
RUN chmod -R 777 ${HADOOP_PATH}
RUN pip3 install flask gunicorn
ENV HADOOP_HOME=${HADOOP_PATH}
COPY ${config_files}/krb5.conf /etc/krb5.conf
COPY ${config_files}/core-site.xml ${HADOOP_PATH}/etc/hadoop
COPY ${config_files}/hdfs-site.xml ${HADOOP_PATH}/etc/hadoop
COPY ${config_files}/hive-site.xml ${HADOOP_PATH}/etc/hadoop
COPY ${config_files}/krb5cc_0 /tmp
COPY ${pyfiles}/app.py ${HADOOP_PATH}/work-dir
COPY ${pyfiles}/config.py ${HADOOP_PATH}/work-dir
ENV JAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk.x86_64
ENV PATH="$HADOOP_HOME/bin:$JAVA_HOME/bin:${PATH}"
WORKDIR ${HADOOP_PATH}/work-dir
ENV PORT 8080
Я могу создать и запустить образ, используя этот Dockerfile. Используя это изображение, я также могу подключиться к hdfs и запускать команды hdfs. Для следующего шага я развернул этот образ в миникубе, используя приведенный ниже deploy.yml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hdfsclient
spec:
selector:
matchLabels:
app: hdfsclient
replicas: 1
template:
metadata:
labels:
app: hdfsclient
spec:
containers:
- name: hdfsclient
image: hdfsclient
ports:
- containerPort: 8080
, а в app.py у меня есть:
from flask import Flask
import os
import config
app = Flask(__name__)
filename='tmp2.file'
f = open(filename,'w')
f.write('Hello World!')
f.close()
@app.route("/")
def hello():
os.system(f'hdfs dfs -put -f {filename} /tmp/{filename}')
return "Hello World!"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=config.PORT, debug=config.DEBUG_MODE)
В основном я пишу фиктивный файл в папку hdfs.
Развертывание прошло успешно, и модуль создан. Я также создал сервис. Однако файл не записывается в папку hdfs.
В чем проблема, а также есть ли лучший способ сделать это? Я хочу, чтобы я мог читать и писать в папку hdfs, используя minikube.