在与Kubernetes的PySpark缺乏文档和广泛误导的信息作斗争之后,我想我已经把这个问题归结为一个问题。我如何得到驱动程序pod旋转读取我的python文件(不是依赖,实际的文件本身)?下面是我使用的命令:
kubectl run --namespace apache-spark apache-spark-client --rm --tty -i --restart='Never'
--image docker.io/bitnami/spark:3.1.2-debian-10-r44
-- spark-submit --master spark://10.120.112.210:30077
test.py
结果如下:
python3: can't open file '/opt/bitnami/spark/test.py': [Errno 2] No such file or directory
好,那么我如何把这个python文件放到驱动pod上呢?这条至关重要的信息似乎在数百篇关于这个主题的文章中完全缺失了。我已经安装了工人可以看到的卷,并尝试将其作为路径。还是不行。所以我猜它一定在驾驶舱内。但如何?每个示例都抛出了.py文件,而没有提到它是如何到达的。
您没有将任何卷挂载到pod上,因此即使文件存在于NFS挂载中,也无法从pod中看到它。你必须装上它。在下面的命令中,您正在创建一个pod,但没有为其附加任何卷。
kubectl run --namespace apache-spark apache-spark-client --rm --tty -i --restart='Never'
--image docker.io/bitnami/spark:3.1.2-debian-10-r44
-- spark-submit --master spark://10.120.112.210:30077
test.py
如果您希望使用NFS
卷,则需要为NFS挂载使用正确的PVC或hostPath。TLDR, Mount volume.
或者:如果您希望使用configMap
和卷在pod中提供本地文件,可以参考这个示例。在本例中,我在运行kubectl命令的服务器上本地创建了info.log
文件。
//在我的工作站创建一个测试文件
echo "This file is written in my workstation, not inside the pod" > info.log
//创建文件的config-map
:
kubectl create cm test-cm --from-file info.log
configmap/test-cm created
//将configmap挂载为volume,注意volumes和voluumounts部分:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: test-pod
name: test-pod
spec:
nodeName: k8s-master
containers:
- command:
- sleep
- infinity
image: ubuntu
name: test-pod
resources: {}
volumeMounts:
- name: my-vol
mountPath: /tmp
dnsPolicy: ClusterFirst
restartPolicy: Always
volumes:
- name: my-vol
configMap:
name: test-cm
status: {}
//现在测试,使用卷,我可以从pod内访问info.log
文件。
kuebctl exec -it test-pod -- bash
root@test-pod:/# cd /tmp/
root@test-pod:/tmp# ls
info.log
root@test-pod:/tmp# cat info.log
This file is written in my workstation, not inside the pod
root@test-pod:/tmp#