Scala 使用bitnami图像在docker内部运行Spark代码
我试图从一个oracle表中读取记录并将其转储到另一个oracle表中。我是Spark-Scala技术堆栈的新手。下面是相同的代码。此代码在我的本地计算机上永远运行Scala 使用bitnami图像在docker内部运行Spark代码,scala,docker,apache-spark,Scala,Docker,Apache Spark,我试图从一个oracle表中读取记录并将其转储到另一个oracle表中。我是Spark-Scala技术堆栈的新手。下面是相同的代码。此代码在我的本地计算机上永远运行 package com.demo.spark import java.util.logging.Logger import org.apache.spark.sql.{SaveMode, SparkSession} object HelloSpark extends Serializable{ @transient l
package com.demo.spark
import java.util.logging.Logger
import org.apache.spark.sql.{SaveMode, SparkSession}
object HelloSpark extends Serializable{
@transient lazy val logger: Logger = Logger.getLogger(getClass.getName)
def main(args : Array[String]): Unit ={
// create spark session
val spark = SparkSession.builder()
.appName("Hello Spark")
.master("local[*]")
.getOrCreate()
val query = "SELECT * FROM FSI.CSG_PRPR_PR"
val startTime = System.currentTimeMillis()
// fetching 6 million records
val jdbcDF = spark.read.format("jdbc")
.option("url", url)
.option("user", user)
.option("password", password)
.option("query", query)
.option("driver", "oracle.jdbc.OracleDriver")
.option("fetchsize", 10000)
.load()
// truncate and load
jdbcDF.write
.format("jdbc")
.option("url", url)
.option("user", user)
.option("password", password)
.option("dbtable", FSI.CSG_PRPR_PR_BKP)
.option("driver","oracle.jdbc.OracleDriver")
.option("batchsize", 10000)
.mode(SaveMode.Overwrite)
.option("truncate", true)
.save()
val endTime = System.currentTimeMillis()
println("Total elapsed time in seconds: ", (endTime - startTime)/1000)
spark.stop()
}
}
由于我没有获得预期的性能,我确实喜欢与两名员工一起运行,以猜测预期的性能。我安装了bitnami Spark映像,现在我在docker内部安装了Spark,其中有1个主节点和2个工作节点。我不知道如何在这个集群上运行我的代码,需要一些指导
docker-compose.yml:
version: '2'
services:
spark:
image: docker.io/bitnami/spark:3
environment:
- SPARK_MODE=master
- SPARK_RPC_AUTHENTICATION_ENABLED=no
- SPARK_RPC_ENCRYPTION_ENABLED=no
- SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
- SPARK_SSL_ENABLED=no
ports:
- '8080:8080'
spark-worker-1:
image: docker.io/bitnami/spark:3
environment:
- SPARK_MODE=worker
- SPARK_MASTER_URL=spark://spark:7077
- SPARK_WORKER_MEMORY=1G
- SPARK_WORKER_CORES=1
- SPARK_RPC_AUTHENTICATION_ENABLED=no
- SPARK_RPC_ENCRYPTION_ENABLED=no
- SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
- SPARK_SSL_ENABLED=no
spark-worker-2:
image: docker.io/bitnami/spark:3
environment:
- SPARK_MODE=worker
- SPARK_MASTER_URL=spark://spark:7077
- SPARK_WORKER_MEMORY=1G
- SPARK_WORKER_CORES=1
- SPARK_RPC_AUTHENTICATION_ENABLED=no
- SPARK_RPC_ENCRYPTION_ENABLED=no
- SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
- SPARK_SSL_ENABLED=no
我假设我需要构建代码来创建jar,需要将其装载到主节点上,然后需要使用spark submit代码运行代码。但是,考虑到spark submit在docker内部运行,我的spark submit参数应该是什么,这样我就可以在分布式模式下运行它
我可以右键单击spark_spark_1并将shell连接到打开的shell窗口并执行下面的命令吗?这够了吗
spark-submit --master spark://spark:7077 mounted-code.jar
本地计算机上的单独容器运行代码的速度不应比使用多个执行器和单个,
local[*]
Spark驱动程序快。特别是因为你已经有效地用一个更大的多内存和多个内核的盒子制造出了只有一个内核和1G内存的小盒子。在任何情况下,当你尝试那个命令时发生了什么?