我正在尝试从本地计算机终端向我的群集提交Spark应用程序.我正在使用--master yarn-cluster.我也需要在我的集群上运行驱动程序,而不是在我提交应用程序的机器上运行,即我的本地机器
当我提供本地机器中应用程序jar的路径时,spark-submit会自动将其上传到我的群集吗?
我正在使用
bin/spark-submit
--class com.my.application.XApp
--master yarn-cluster --executor-memory 100m
--num-executors 50 /Users/nish1013/proj1/target/x-service-1.0.0-201512141101-assembly.jar
1000
Run Code Online (Sandbox Code Playgroud)
并得到错误
Diagnostics: java.io.FileNotFoundException: File file:/Users/nish1013/proj1/target/x-service-1.0.0-201512141101- does not exist
Run Code Online (Sandbox Code Playgroud)
高级依赖关系管理 使用spark-submit时,应用程序jar以及--jars选项中包含的任何jar都将自动传输到群集.
但似乎没有!
我需要使用Java使用Spark从DynamoDB表中获取数据.它与用户的访问密钥和密钥一起正常工作:
final JobConf jobConf = new JobConf(sc.hadoopConfiguration());
jobConf.set("dynamodb.servicename", "dynamodb");
jobConf.set("dynamodb.input.tableName", tableName);
jobConf.set("mapred.output.format.class", "org.apache.hadoop.dynamodb.write.DynamoDBOutputFormat");
jobConf.set("mapred.input.format.class", "org.apache.hadoop.dynamodb.read.DynamoDBInputFormat");
jobConf.set("dynamodb.awsAccessKeyId", accessKey);
jobConf.set("dynamodb.awsSecretAccessKey", secretKey);
jobConf.set("dynamodb.endpoint", endpoint);
Run Code Online (Sandbox Code Playgroud)
我需要使用AWS假定角色和STS(至少出于安全原因)使用spark从DynamoDB中获取数据.可能吗?我发现,有可能使用假定角色访问AWS S3火花(https://issues.apache.org/jira/browse/HADOOP-12537,https://hadoop.apache.org/docs/current3/hadoop- aws/tools/hadoop-aws/index.html),但没有找到类似DynamoDB的想法.
为了接收STS临时凭证,我使用以下代码:
AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.defaultClient();
AssumeRoleRequest assumeRequest = new AssumeRoleRequest()
.withRoleArn(roleArn) // arn:aws:iam::XXXXXXX:role/assume-role-DynamoDB-ReadOnly
.withDurationSeconds(3600)
.withRoleSessionName("assumed-role-session");
AssumeRoleResult assumeResult = stsClient.assumeRole(assumeRequest);
Credentials credentials = assumeResult.getCredentials();
Run Code Online (Sandbox Code Playgroud)
调用credentials.getAccessKeyId(), credentials.getSecretAccessKey() and credentials.getSessionToken()返回生成的临时凭证.有了这些凭据,我成功地可以使用java aws sdk AmazonDynamoDBClient(非火花方法)从DynamoDB获取数据.
火花有可能吗?spark是否允许使用以下内容:
jobConf.set("dynamodb.awsSessionToken”, sessionToken)?
首先,我也见过类似的问题。另一个问题链接 但我认为它的答案不是很清楚。
\n\n我的一些问题如下\xef\xbc\x9a
\n\n\xef\xbc\x881\xef\xbc\x89 --jars 参数 与spark.executor.extraClassPath 参数相同,如果不同,有什么区别?
\n\n我检查了spark-submit命令行中的--jars上的--help,解释如下:
\n\n Comma-separated list of local jars to include on the driver\n and executor classpaths.\nRun Code Online (Sandbox Code Playgroud)\n\n但是,我在spark-submit命令行中没有找到spark.executor.extraClassPath的解释。最后在spark官网找到了如下关于spark.executor.extraClassPath的解释:
\n\nExtra classpath entries to prepend to the classpath of executors. \nRun Code Online (Sandbox Code Playgroud)\n\n从两个\xef\xbc\x9f的解释来看貌似效果一样
\n\n但我从另一个问题链接中看到以下段落:
\n\n\n\n\n--jars 与 SparkContext.addJar:这些是相同的,只有一个是通过 Spark 提交设置的,另一个是通过代码设置的。选择更适合您的一款。需要注意的一件重要事情是,使用这两个选项中的任何一个都不会将 JAR 添加到驱动程序/执行程序类路径中,您需要使用这两个选项上的 extraClassPath 配置显式添加它们。
\n
怎么又这样了?
\n\n\xef\xbc\x882\xef\xbc\x89spark.executor.extraClassPath 和spark.executor.extraLibraryPath,与spark.driver.extraXXXXpath 相同,前缀相同\xe3\x80\x82
\n\nextraClassPath 和 extraLibraryPath 有什么区别?
\n\nSpark.executor.extraLibraryPath的解释来自spark官网\xe3\x80\x82
\n\nSet a special library path to use when launching …Run Code Online (Sandbox Code Playgroud) 我正在使用一个独立的火花群,一个主人和两个工人.我真的不明白如何明智地使用SPARK_CLASSPATH或SparkContext.addJar.我试过两个,看起来addJar不像以前那样工作.
在我的情况下,我试图在闭包或外面使用一些joda-time函数.如果我使用joda-time jar的路径设置SPARK_CLASSPATH,一切正常.但是,如果我删除SPARK_CLASSPATH并添加我的程序:
JavaSparkContext sc = new JavaSparkContext("spark://localhost:7077", "name", "path-to-spark-home", "path-to-the-job-jar");
sc.addJar("path-to-joda-jar");
Run Code Online (Sandbox Code Playgroud)
它不再起作用,虽然在日志中我可以看到:
14/03/17 15:32:57 INFO SparkContext: Added JAR /home/hduser/projects/joda-time-2.1.jar at http://127.0.0.1:46388/jars/joda-time-2.1.jar with timestamp 1395066777041
Run Code Online (Sandbox Code Playgroud)
并且立即:
Caused by: java.lang.NoClassDefFoundError: org/joda/time/DateTime
at com.xxx.sparkjava1.SimpleApp.main(SimpleApp.java:57)
... 6 more
Caused by: java.lang.ClassNotFoundException: org.joda.time.DateTime
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
Run Code Online (Sandbox Code Playgroud)
我以前认为SPARK_CLASSPATH正在为作业的驱动程序部分设置类路径,而SparkContext.addJar正在设置执行程序的类路径,但它似乎不再正确.
谁知道比我更好?
此处的页面 ( http://spark.apache.org/docs/latest/programming-guide.html ) 指示通过以下方式启动 shell 时可以包含包:
$SPARK_HOME/bin/spark-shell --packages com.databricks:spark-csv_2.11:1.4.0
Run Code Online (Sandbox Code Playgroud)
包含本地包(手动下载的包)的语法是什么?与Maven坐标有关吗?
问题很简单:您有一个本地 spark 实例(集群或只是在本地模式下运行它)并且您想从 gs:// 读取
当spark作业中需要有jar文件时,需要通过两种方式添加到spark作业中:
1.--jar path命令中的选项。
2 SparkContext.addJar("path")..
谁能告诉我这两种方式之间的区别?
从这个问题来看,答案是它们是相同的,只是优先级不同,但我认为这不是真的。--jars如果我在纱线集群模式下提交 Spark 作业,根据官方网站,如果命令中的选项中未包含 jar 文件,则 addJar() 将无法工作。
如果您将 SparkContext.addJar 函数与本地文件一起使用并在纱线集群模式下运行,则 --jars 选项允许 SparkContext.addJar 函数工作。如果您将其与 HDFS、HTTP、HTTPS 或 FTP 文件一起使用,则不需要使用它。
原因是驱动程序与客户端运行在不同的机器上。因此,--jars命令中的选项似乎来自客户端,而函数addJar()只能在驱动程序中的 jar 上工作。
然后我在本地模式下进行了测试。
1.spark-shell --master local --jars path/to/jar
如果我以这种方式启动spark-shell,则jar中的对象可以在spark-shell中使用
2.spark-shell --master local
如果我以这种方式启动spark-shell并使用sc.addJar("path/to/jar"),则jar文件中的对象无法导入到spark-shell中,并且出现class cannot be found错误。
我的问题是:
为什么该方法SparkContext.addJar()在本地模式下不起作用?
SparkContext.addJar()和 和有什么区别--jars?
我的环境:hortonworks 2.5集群,spark版本是1.6.2。如果有人能对此有所了解,我将不胜感激。
有人可以解释--packages和--jars提交火花脚本之间的区别吗?
nohup ./bin/spark-submit --jars ./xxx/extrajars/stanford-corenlp-3.8.0.jar,./xxx/extrajars/stanford-parser-3.8.0.jar \
--packages datastax:spark-cassandra-connector_2.11:2.0.7 \
--class xxx.mlserver.Application \
--conf spark.cassandra.connection.host=192.168.0.33 \
--conf spark.cores.max=4 \
--master spark://192.168.0.141:7077 ./xxx/xxxanalysis-mlserver-0.1.0.jar 1000 > ./logs/nohup.out &
Run Code Online (Sandbox Code Playgroud)
另外,--packages如果依赖关系在我的应用程序中,我是否需要配置pom.xml?(我问是因为我只是通过更改版本来炸毁我的应用程序,--packages而忘记了在中对其进行更改pom.xml)
我正在使用--jars当前版本,因为jar很大(超过100GB),因此减慢了有阴影的jar的编译速度。我承认我不确定为什么要使用--packages其他软件,因为我正在遵循datastax文档