在不使用 spark 提交的情况下部署 spark 驱动程序应用程序

Fel*_*ano 6 java apache-spark

假设我们有一个像这样编写的火花驱动程序:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

并且我想在纱线集群中运行,是否可以避免使用 spark-submit 和(当然假设我可以访问一个集群节点),只需在上下文中指定我想在纱线上运行?换句话说,是否可以利用yarn将spark客户端作为常规Java应用程序启动?

Rak*_*hit 1

来自Hortonworks 博客文章

1)将Spark程序集jar复制到HDFS

默认情况下,spark 程序集 jar 文件在 HDFS 中不可用。对于远程访问,我们将需要它。

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
Run Code Online (Sandbox Code Playgroud)

这是一次性准备步骤,例如对于 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"
Run Code Online (Sandbox Code Playgroud)

2) 将 Spark 应用程序 jar 文件上传到 HDFS

通过 WebHdfs 将 sbt 打包的 Spark 应用程序 jar 文件上传到 HDFS 中的项目文件夹(也许使用比“/tmp”更好的东西):

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}"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

并像以前一样通过 WebHDFS 将其作为 spark-yarn.properties 上传到您的 simple-project 文件夹

4)创建Spark作业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
Run Code Online (Sandbox Code Playgroud)

提供 Spark 应用程序名称和 HDP 版本非常重要。Spark将解决

b) 我们需要设置一些通用的环境变量

JAVA_HOME="/usr/jdk64/jdk1.8.0_60/"
SPARK_YARN_MODE=true
HDP_VERSION="2.4.0.0-169" 
Run Code Online (Sandbox Code Playgroud)

然后我们需要告诉 Spark 哪些文件要分布到所有 Spark 执行器上。因此我们需要设置4个变量。一个变量的格式为“#,#, ...”,其他三个变量包含逗号分隔的时间戳、文件大小和每个文件的可见性(相同顺序):

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"
Run Code Online (Sandbox Code Playgroud)

将 <> 替换为正确的地址。文件大小和时间戳可以通过 WebHDFS 从 HDFS 检索。

接下来,构建类路径

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>"
Run Code Online (Sandbox Code Playgroud)

注意: - Spark .jar 和app .jar 与 SPARK_YARN_CACHE_FILES 中提供的相同

  • Spark 将决心:

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"
  }
}, 
Run Code Online (Sandbox Code Playgroud)

再次替换 <>。时间戳、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
#   } 
# }
Run Code Online (Sandbox Code Playgroud)

编辑spark-yarn.json中的“application-id”,然后提交作业:

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)
Run Code Online (Sandbox Code Playgroud)

另请参阅博客文章作者在此 gitlab 项目中提供的有用的 python 助手。