我目前正在运行spark 2.1.0.我大部分时间都在PYSPARK shell中工作,但是我需要spark-submit一个python文件(类似于java中的spark-submit jar).你是如何在python中做到的?
apache-spark apache-spark-sql pyspark pyspark-sql spark-submit
我遵循https://spark.apache.org/docs/2.1.0/quick-start.html上的Scala教程
我的scala文件
/* SimpleApp.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
object SimpleApp {
def main(args: Array[String]) {
val logFile = "/data/README.md" // Should be some file on your system
val conf = new SparkConf().setAppName("Simple Application")
val sc = new SparkContext(conf)
val logData = sc.textFile(logFile, 2).cache()
val numAs = logData.filter(line => line.contains("a")).count()
val numBs = logData.filter(line => line.contains("b")).count()
println(s"Lines with a: $numAs, Lines with b: $numBs")
sc.stop()
}
}
Run Code Online (Sandbox Code Playgroud)
和build.sbt
name := "Simple Project"
version := "1.0"
scalaVersion …Run Code Online (Sandbox Code Playgroud) 我有一个 fat jar,用 Scala 编写,由 sbt 打包。我需要在 AWS EMR 的 Spark 集群中使用它。
如果我手动启动集群,将 jar 复制到 master 并使用这样的命令运行 Spark-submit 作业,它的功能就很好......
spark-submit --class org.company.platform.package.SparkSubmit --name platform ./platform-assembly-0.1.0.jar arg0 arg1 arg2
Run Code Online (Sandbox Code Playgroud)
但是...如果我尝试将其作为步骤添加到 EMR 集群,则会失败。stderr 的日志看起来像这样......
Exception in thread "main" java.lang.ClassNotFoundException: package.SparkSubmit
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:278)
at org.apache.hadoop.util.RunJar.run(RunJar.java:214)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Run Code Online (Sandbox Code Playgroud)
我的 build.sbt 中的相关设置如下所示......
lazy val root = (project in file(".")).
settings(
name := "platform",
version := "0.1.0",
scalaVersion := "2.10.5", …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行 spark submit(pyspark) 命令。作为 spark 提交的一部分,我需要提供 boto3 的依赖项,因为它是我代码中的依赖项。我正在运行以下命令并且没有收到模块错误。
bin/spark-submit --master=local --py-files /home/user/boto3-develop.zip /home/user/py_script.py
Traceback (most recent call last):
File "/home/user/py_script.py", line 16, in <module>
import boto3
ModuleNotFoundError: No module named 'boto3'
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
from apport.report import Report
File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
import apport.fileutils
File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
from apport.packaging_impl import impl as packaging …Run Code Online (Sandbox Code Playgroud) 我有一个简单的 Pyspark 代码
导入 pyarrow fs = pyarrow.hdfs.connect()
如果我在“客户端”模式下使用spark-submit运行它,它工作正常,但在“集群”模式下,会抛出错误
Traceback (most recent call last):
File "t3.py", line 17, in <module>
fs = pa.hdfs.connect()
File "/opt/anaconda/3.6/lib/python3.6/site-packages/pyarrow/hdfs.py", line 181, in connect
kerb_ticket=kerb_ticket, driver=driver)
File "/opt/anaconda/3.6/lib/python3.6/site-packages/pyarrow/hdfs.py", line 37, in __init__
self._connect(host, port, user, kerb_ticket, driver)
File "io-hdfs.pxi", line 99, in pyarrow.lib.HadoopFileSystem._connect
File "error.pxi", line 79, in pyarrow.lib.check_status
pyarrow.lib.ArrowIOError: HDFS connection failed
Run Code Online (Sandbox Code Playgroud)
所有必需的 python 库都安装在我的 Hadoop 集群中的每个节点上。我已经通过在 pyspark 每个节点上单独测试此代码来进行验证。
但无法通过集群模式下的spark-submit使其工作?
有任何想法吗?
香卡尔
运行 Spark 作业的常见方法似乎是使用 Spark-submit,如下所示(来源):
spark-submit --py-files pyfile.py,zipfile.zip main.py --arg1 val1
Run Code Online (Sandbox Code Playgroud)
作为 Spark 的新手,我想知道为什么第一种方法比从 python 运行它更受欢迎(示例):
python pyfile-that-uses-pyspark.py
Run Code Online (Sandbox Code Playgroud)
前一种方法在谷歌搜索该主题时会产生更多示例,但没有明确说明其原因。事实上,这是另一个堆栈溢出问题,其中一个答案(在下面重复)明确告诉OP不要使用python方法,但没有给出原因。
不要将 py 文件运行为: python filename.py 而是使用:spark-submit filename.py
有人可以提供见解吗?
因此,我尝试Apache Spark在 AWS EMR 上cluster使用spark-submit. 如果我在类路径中只提供一个 jar,则它可以与使用--jar和--driver-class-path选项的给定选项配合使用。我所需的所有依赖项 jar 都位于S3EMR 所需的存储桶中。为此,我在 EMR AWS 控制台上的 EMR 添加步骤选项中使用以下命令:
--class org.springframework.boot.loader.JarLauncher --jars s3://emrb/gson-2.8.4.jar --driver-class-path s3://emrb/gson-2.8.4.jar
Run Code Online (Sandbox Code Playgroud)
现在,我spark-submit options在add step. 但如果我想用同样的方式提供多个依赖的jar,就不会占用其他jar。我提供以下方式并尝试了各种选项,但找不到依赖的 jars:
--jars s3://emrb/hadoop_jars/emrfs-hadoop-assembly-2.32.0.jar,s3://emrb/gson-2.8.4.jar --driver-class-path s3://emrb/hadoop_jars/emrfs-hadoop-assembly-2.32.0.jar,s3://emrb/gson-2.8.4.jar --class org.springframework.boot.loader.JarLauncher
Run Code Online (Sandbox Code Playgroud) scala amazon-web-services amazon-emr apache-spark spark-submit
我遇到一个有趣的问题,即从 Windows 开发环境提交 Spark 应用程序的不同方法。一般来说,我们可以使用提交spark作业spark-submit,也可以使用以下命令执行uber jar(用jar组装的依赖spark库)java -jar
java -jar -Xmx1024m /home/myuser/myhar.jarspark-submit --master local[*] /home/myuser/myhar.jar因为我可以使用这两种方法执行作业,所以我观察到有时java -jar方法更快,有时spark-submit对于相同的数据集更快(例如 20000 行,其中有大量数据混洗登录)。spark-submit有更好的选择来使用命令行参数控制执行器和内存等,但是java -jar,我们需要在代码本身内部进行硬编码。如果我们运行具有大数据集的 jar,java -jar则会抛出内存不足异常,虽然spark-submit需要时间,但使用默认配置执行时不会出现错误。
我无法理解使用提交申请的区别spark-submit,java-jar因此我的问题是:
当我们使用 提交申请时,执行是如何发生的java-jar。它是否在内存本身内部执行jvm并且不使用任何 Spark 属性?
我创建了一个 Spark 集群,其中包含一个主服务器和两个从服务器,每个集群都位于一个 Docker 容器上。我用命令启动它start-all.sh。
我可以从本地计算机访问 UI localhost:8080,它显示集群已正常启动:
Spark UI 的屏幕截图
然后我尝试使用以下命令从我的主机(而不是从 Docker 容器)提交一个简单的 Python 脚本:spark-submit:spark-submit --master spark://spark-master:7077 test.py
测试.py:
import pyspark
conf = pyspark.SparkConf().setAppName('MyApp').setMaster('spark://spark-master:7077')
sc = pyspark.SparkContext(conf=conf)
Run Code Online (Sandbox Code Playgroud)
但控制台向我返回了这个错误:
22/01/26 09:20:39 INFO StandaloneAppClient$ClientEndpoint: Connecting to master spark://spark-master:7077...
22/01/26 09:20:40 WARN StandaloneAppClient$ClientEndpoint: Failed to connect to master spark-master:7077
org.apache.spark.SparkException: Exception thrown in awaitResult:
at org.apache.spark.util.ThreadUtils$.awaitResult(ThreadUtils.scala:226)
at org.apache.spark.rpc.RpcTimeout.awaitResult(RpcTimeout.scala:75)
at org.apache.spark.rpc.RpcEnv.setupEndpointRefByURI(RpcEnv.scala:101)
at org.apache.spark.rpc.RpcEnv.setupEndpointRef(RpcEnv.scala:109)
at org.apache.spark.deploy.client.StandaloneAppClient$ClientEndpoint$$anonfun$tryRegisterAllMasters$1$$anon$1.run(StandaloneAppClient.scala:106)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.io.IOException: Failed …Run Code Online (Sandbox Code Playgroud) 我尝试使用下面的 Spark-submit 参数(依赖项位于 PEX 文件上)通过 Databricks UI(使用 Spark-submit)创建 PySpark 作业,但出现 PEX 文件不存在的异常。据我了解, --files 选项将文件放入驱动程序和每个执行程序的工作目录中,所以我很困惑为什么会遇到这个问题。
配置
[
"--files","s3://some_path/my_pex.pex",
"--conf","spark.pyspark.python=./my_pex.pex",
"s3://some_path/main.py",
"--some_arg","2022-08-01"
]
Run Code Online (Sandbox Code Playgroud)
标准误
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=512m; support was removed in 8.0
Warning: Ignoring non-Spark config property: libraryDownload.sleepIntervalSeconds
Warning: Ignoring non-Spark config property: libraryDownload.timeoutSeconds
Warning: Ignoring non-Spark config property: eventLog.rolloverIntervalSeconds
Exception in thread "main" java.io.IOException: Cannot run program "./my_pex.pex": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at org.apache.spark.deploy.PythonRunner$.main(PythonRunner.scala:97)
at org.apache.spark.deploy.PythonRunner.main(PythonRunner.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at …Run Code Online (Sandbox Code Playgroud) spark-submit ×10
apache-spark ×8
pyspark ×6
scala ×4
amazon-emr ×2
python ×2
boto3 ×1
cluster-mode ×1
databricks ×1
docker ×1
jar ×1
java ×1
performance ×1
pex ×1
pyspark-sql ×1
sbt ×1