在dockerfile中配置spark



我正在使用jupyter/pyspark-notebook docker映像,但我没有找到delta和s3的任何支持,所以我手动尝试设置所有必需的东西,如下面的代码,然后它工作得很好。

import pyspark
spark = pyspark.sql.SparkSession.builder.master("local[4]").appName('SparkDelta') 
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") 
.config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") 
.config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") 
.config("spark.jars.packages", 
"io.delta:delta-core_2.12:1.2.1,"
"org.apache.hadoop:hadoop-aws:3.3.1,"
"com.amazonaws:aws-java-sdk-bundle:1.12.180") 
.config('spark.hadoop.fs.s3a.access.key', 'xxxxx') 
.config('spark.hadoop.fs.s3a.secret.key', 'xxxxx') 
.getOrCreate()
df = spark.read.csv("s3a://<bucket>/<folder>/test33.csv")
print(df) 

但是像上面的方法一样暴露凭证并设置所有的jar和包似乎不是一个好方法,所以我想在启动docker容器时设置所有这些东西。那么,我们是否可以在dockerfile中拥有上述所有配置选项,然后在容器启动并运行时直接使用spark对象?

您可以使用Dockerfile中的环境变量。例如,您可以这样设置Dockerfile中的访问键:

ENV ACCESS_KEY "XXXX"

,然后在代码中:

import os
import pyspark
spark = pyspark.sql.SparkSession.builder.master("local[4]")
.appName('SparkDelta')
.config('spark.hadoop.fs.s3a.access.key', os.environ['ACCESS_KEY']) 
.getOrCreate()

其他键相同。

通过这样做,你不会在文件中暴露你的密钥,你可以使用Dockerfile(你也可以使用docker compose btw)顺利地更改它们

最新更新