假设我们有一个像这样编写的火花驱动程序:
public class SimpleApp {
public static void main(String[] args) {
String logFile = "YOUR_SPARK_HOME/README.md"; // Should be some file on your system
SparkConf conf = new SparkConf().setAppName("Simple Application");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> logData = sc.textFile(logFile).cache();
long numAs = logData.filter(new Function<String, Boolean>() {
public Boolean call(String s) { return s.contains("a"); }
}).count();
long numBs = logData.filter(new Function<String, Boolean>() {
public Boolean call(String s) { return s.contains("b"); }
}).count();
System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);
}
}
我希望在一个纱线集群中运行,我可以避免使用spark-submit和(假设我当然可以访问一个集群节点),只需在上下文中指定我想在纱线上运行吗?换句话说,是否可以将spark客户端作为利用纱线的常规Java应用程序启动?
答案 0 :(得分:1)
这是另一种官方方式。
Spark Launcher - 用于启动Spark应用程序的库。
此库允许应用程序以编程方式启动Spark。该库只有一个入口点 - SparkLauncher类。
要启动Spark应用程序,只需实例化SparkLauncher并配置要运行的应用程序。例如:
import org.apache.spark.launcher.SparkLauncher;
public class MyLauncher {
public static void main(String[] args) throws Exception {
Process spark = new SparkLauncher()
.setAppResource("/my/app.jar")
.setMainClass("my.spark.app.Main")
.setMaster("local")
.setConf(SparkLauncher.DRIVER_MEMORY, "2g")
.launch();
spark.waitFor();
}
}
您可以使用 setConf 方法设置所有YARN特定配置,并将主设置为 yarn-client 或 yarn-cluster
参考文献: https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/launcher/package-summary.html
答案 1 :(得分:0)
1)将Spark程序集jar复制到HDFS
默认情况下,HDFS中不提供spark程序集jar文件。对于远程访问,我们需要它。
HDP中的一些标准位置是:
HDP 2.3.2:
Version: 2.3.2.0-2950
Spark Jar: /usr/hdp/2.3.2.0-2950/spark/lib/spark-assembly-1.4.1.2.3.2.0-2950-hadoop2.7.1.2.3.2.0-2950.jar
HDP 2.4.0:
Version: 2.4.0.0-169
Spark Jar: /usr/hdp/2.4.0.0-169/spark/lib/spark-assembly-1.6.0.2.4.0.0-169-hadoop2.7.1.2.4.0.0-169.jar
这是一次性准备步骤,例如对于HDP 2.4,它将是:
sudo su - hdfs
HDP_VERSION=2.4.0.0-169
SPARK_JAR=spark-assembly-1.6.0.2.4.0.0-169-hadoop2.7.1.2.4.0.0-169.jar
hdfs dfs -mkdir "/hdp/apps/${HDP_VERSION}/spark/"
hdfs dfs -put "/usr/hdp/${HDP_VERSION}/spark/lib/$SPARK_JAR" "/hdp/apps/${HDP_VERSION}/spark/spark-hdp-assembly.jar"
2)将您的spark应用程序jar文件上传到HDFS
通过WebHdfs将sbt打包的spark应用程序jar文件上传到HDFS中的项目文件夹(也许使用比&#34; / tmp&#34更好的东西):
export APP_FILE=simple-project_2.10-1.0.jar
curl -X PUT "${WEBHDFS_HOST}:50070/webhdfs/v1/tmp/simple-project?op=MKDIRS"
curl -i -X PUT "${WEBHDFS_HOST}:50070/webhdfs/v1/tmp/simple-project/${APP_FILE}?op=CREATE&overwrite=true"
# take Location header from the response and issue a PUT request
LOCATION="http://..."
curl -i -X PUT -T "target/scala-2.10/${APP_FILE}" "${LOCATION}"
3)创建spark属性文件并上传到HDFS
spark.yarn.submit.file.replication=3
spark.yarn.executor.memoryOverhead=384
spark.yarn.driver.memoryOverhead=384
spark.master=yarn
spark.submit.deployMode=cluster
spark.eventLog.enabled=true
spark.yarn.scheduler.heartbeat.interval-ms=5000
spark.yarn.preserve.staging.files=true
spark.yarn.queue=default
spark.yarn.containerLauncherMaxThreads=25
spark.yarn.max.executor.failures=3
spark.executor.instances=2
spark.eventLog.dir=hdfs\:///spark-history
spark.history.kerberos.enabled=true
spark.history.provider=org.apache.spark.deploy.history.FsHistoryProvider
spark.history.ui.port=18080
spark.history.fs.logDirectory=hdfs\:///spark-history
spark.executor.memory=2G
spark.executor.cores=2
spark.history.kerberos.keytab=none
spark.history.kerberos.principal=none
并通过WebHDFS将其作为spark-yarn.properties上传到您之前的简单项目文件夹中
4)创建Spark Job json文件
a)我们需要构建命令来启动Spark ApplicationMaster:
java -server -Xmx1024m -Dhdp.version=2.4.0.0-169 \
-Dspark.yarn.app.container.log.dir=/hadoop/yarn/log/rest-api \
-Dspark.app.name=SimpleProject \
org.apache.spark.deploy.yarn.ApplicationMaster \
--class IrisApp --jar __app__.jar \
--arg '--class' --arg 'SimpleProject' \
1><LOG_DIR>/AppMaster.stdout 2><LOG_DIR>/AppMaster.stderr
提供Spark应用程序名称和HDP版本非常重要。 Spark将解决
b)我们需要设置一些通用环境变量
JAVA_HOME="/usr/jdk64/jdk1.8.0_60/"
SPARK_YARN_MODE=true
HDP_VERSION="2.4.0.0-169"
然后我们需要告诉Spark哪些文件分布在所有Spark执行程序中。因此我们需要设置4个变量。一个变量的格式为&#34;#,#,...&#34;,另外三个变量包含逗号分隔的时间戳,文件大小和每个文件的可见性(相同顺序):
SPARK_YARN_CACHE_FILES: "hdfs://<<name-node>>:8020/tmp/simple-project/simple-project.jar#__app__.jar,hdfs://<<name-node>>:8020/hdp/apps/2.4.0.0-169/spark/spark-hdp-assembly.jar#__spark__.jar"
SPARK_YARN_CACHE_FILES_FILE_SIZES: "10588,191724610"
SPARK_YARN_CACHE_FILES_TIME_STAMPS: "1460990579987,1460219553714"
SPARK_YARN_CACHE_FILES_VISIBILITIES: "PUBLIC,PRIVATE"
替换&lt;&gt;用正确的地址。可以从HDFS vie WebHDFS中检索文件大小和时间戳。
接下来,构建类路径
CLASSPATH="{{PWD}}<CPS>__spark__.jar<CPS>{{PWD}}/__app__.jar<CPS>{{PWD}}/__app__.properties<CPS>{{HADOOP_CONF_DIR}}<CPS>/usr/hdp/current/hadoop-client/*<CPS>/usr/hdp/current/hadoop-client/lib/*<CPS>/usr/hdp/current/hadoop-hdfs-client/*<CPS>/usr/hdp/current/hadoop-hdfs-client/lib/*<CPS>/usr/hdp/current/hadoop-yarn-client/*<CPS>/usr/hdp/current/hadoop-yarn-client/lib/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/common/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/common/lib/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/yarn/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/yarn/lib/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/hdfs/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/hdfs/lib/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/tools/lib/*<CPS>/usr/hdp/2.4.0.0-169/hadoop/lib/hadoop-lzo-0.6.0.2.4.0.0-169.jar<CPS>/etc/hadoop/conf/secure<CPS>"
注意: - spark .jar和 app .jar与SPARK_YARN_CACHE_FILES中提供的相同
:
c)创建Spark作业json文件
以上信息将作为命令和环境属性添加到Spark json文件中(详细信息请参阅附件 - 删除.txt结尾)
最后一个缺失的部分是所谓的local_resources,它描述了Spark作业所需的HDFS中的所有文件: - Spark程序集jar(如在缓存环境变量中) - 此项目的Spark应用程序jar(如在缓存环境变量中) ) - 此项目的Spark属性文件(仅适用于Application Master,无需缓存)
所有这三项都需要以表格形式提供
{
"key": "__app__.jar",
"value": {
"resource": "hdfs://<<name-node>>:8020/tmp/simple-project/simple-project.jar",
"size": 10588,
"timestamp": 1460990579987,
"type": "FILE",
"visibility": "APPLICATION"
}
},
再次,替换&lt;&gt ;.时间戳,hdfs路径,大小和密钥需要与缓存环境变量相同。
将其另存为spark-yarn.json(详情见附件 - 删除.txt结尾)
5)提交作业
首先从YARN请求申请ID
curl -s -X POST -d '' \
https://$KNOX_SERVER:8443/gateway/default/resourcemanager/v1/cluster/apps/new-application
# {
# "application-id": "application_1460195242962_0054",
# "maximum-resource-capability": {
# "memory": 8192,
# "vCores": 3
# }
# }
编辑&#34; application-id&#34;在spark-yarn.json然后提交作业:
curl -s -i -X POST -H "Content-Type: application/json" ${HADOOP_RM}/ws/v1/cluster/apps \
--data-binary spark-yarn.json
# HTTP/1.1 100 Continue
#
# HTTP/1.1 202 Accepted
# Cache-Control: no-cache
# Expires: Sun, 10 Apr 2016 13:02:47 GMT
# Date: Sun, 10 Apr 2016 13:02:47 GMT
# Pragma: no-cache
# Expires: Sun, 10 Apr 2016 13:02:47 GMT
# Date: Sun, 10 Apr 2016 13:02:47 GMT
# Pragma: no-cache
# Content-Type: application/json
# Location: http://<<resource-manager>>:8088/ws/v1/cluster/apps/application_1460195242962_0054
# Content-Length: 0
# Server: Jetty(6.1.26.hwx)
请参阅this gitlab project中博客文章作者的有用python助手。
答案 2 :(得分:0)
查看此项目:
https://github.com/cloudera/livy
https://github.com/spark-jobserver/spark-jobserver
两者都易于使用,并公开了一个休息界面来部署和运行spark应用程序。
答案 3 :(得分:-1)
您应该查看org.apache.spark.deploy.yarn.Client
,它提供您要使用的API。它允许您定义SparkConf
命令行参数,然后使用run()
方法将相应的作业提交给Yarn。
我怀疑这是你想要达到的目标。
我在另一个问题中找到了以下tutorial,这给出了一个简短的实例。
或者,这是另一个blog post,涵盖了这个问题。
这是source code,供参考,因为API并未完全记录。