【问题标题】:How to locate openjdk in Docker container?如何在 Docker 容器中找到 openjdk?
【发布时间】:2018-12-24 14:52:20
【问题描述】:

我尝试运行 pyspark 应用程序。为此,我首先从 pip 安装了 pyspark,然后拉下 openjdk:8 以设置 JAVA_HOME 变量

Docker 文件:

FROM python:3

ADD my_script.py /
COPY requirements.txt ./

ENV JAVA_HOME  /usr/lib/jvm/java-8-openjdk-amd64/

RUN pip install --no-cache-dir -r requirements.txt

CMD [ "python", "./my_script.py" ]

my_script.py:

from pyspark import SparkContext
from pyspark import SparkConf

#spark conf
conf1 = SparkConf()
conf1.setMaster("local[*]")
conf1.setAppName('hamza')
print(conf1)
sc = SparkContext(conf = conf1)


from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
print(sqlContext)

Requirements.txt:

pyspark

numpy

收到此错误:

C:\Users\hrafiq\Desktop\sample>docker run -it --rm --name data2 my-python-app
<pyspark.conf.SparkConf object at 0x7f4bd933ba58>
/usr/local/lib/python3.7/site-packages/pyspark/bin/spark-class: line 71: 
/usr/lib/jvm/java-8-openjdk-amd64//bin/java: No such file or directory
Traceback (most recent call last):
   File "./my_script.py", line 14, in <module>
    sc = SparkContext(conf = conf1)
  File "/usr/local/lib/python3.7/site-packages/pyspark/context.py", line 115, in __init__
    SparkContext._ensure_initialized(self, gateway=gateway, conf=conf)
  File "/usr/local/lib/python3.7/site-packages/pyspark/context.py", line 298, in _ensure_initialized
    SparkContext._gateway = gateway or launch_gateway(conf)
  File "/usr/local/lib/python3.7/site-packages/pyspark/java_gateway.py", line 94, in launch_gateway
    raise Exception("Java gateway process exited before sending its port number")
Exception: Java gateway process exited before sending its port number  

所以问题是如果没有找到 java 文件,那么我将如何找到该文件?我知道它存储在某个我们无权访问的虚拟硬盘中。

任何帮助将不胜感激

谢谢

【问题讨论】:

    标签: docker pyspark java-home


    【解决方案1】:

    设置 JAVA_HOME 环境变量是不够的。您需要在 docker 映像中实际安装 openjdk。

    您的基础镜像 (python:3) 本身基于 Debian Stretch 镜像。所以你可以使用 apt-get install 来获取 JDK:

    FROM python:3
    
    RUN apt-get update && \
         apt-get install -y openjdk-8-jdk-headless && \
        rm -rf /var/lib/apt/lists/*
    ENV JAVA_HOME  /usr/lib/jvm/java-8-openjdk-amd64/
    
    COPY requirements.txt ./
    RUN pip install --no-cache-dir -r requirements.txt
    
    COPY my_script.py ./
    CMD [ "python", "./my_script.py" ]
    

    (在上面我已经优化了层顺序,这样当你的脚本改变时你就不需要重新构建 pip install 层)

    【讨论】:

    • 您能进一步帮助我吗?我正在从 Postgresql 获取数据但现在我收到此错误:py4j.protocol.Py4JJavaError:调用 o25.jdbc 时发生错误。 : java.sql.SQLException: 没有合适的驱动程序如何安装该驱动程序
    • 查看这个 SO 问题:stackoverflow.com/questions/34948296/… 从它所说的,它应该像将这两行添加到您的 Dockerfile 一样简单(在 pip 安装之后):ENV SPARK_CLASSPATH /opt/lib/postgresql-42.2 .5.jar ADD jdbc.postgresql.org/download/postgresql-42.2.5.jar /opt/lib/ (这是未经测试的,但你明白了:Dockerfile 的内容与你在本地工作站上所做的没有什么不同)
    猜你喜欢
    • 2022-08-03
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2020-02-15
    • 1970-01-01
    相关资源
    最近更新 更多