如何运行Spark Java程序

 PHP_sunshine 发布于 2023-01-19 03:23

我为Spark编写了一个Java程序.但是如何从Unix命令行运行和编译它.编译运行时是否必须包含任何jar

3 个回答
  • 结合官方快速入门指南和在YARN上启动Spark的步骤,我们得到:

    我们将创建一个非常简单的Spark应用程序SimpleApp.java:

    /*** SimpleApp.java ***/
    import org.apache.spark.api.java.*;
    import org.apache.spark.api.java.function.Function;
    
    public class SimpleApp {
      public static void main(String[] args) {
        String logFile = "$YOUR_SPARK_HOME/README.md"; // Should be some file on your system
        JavaSparkContext sc = new JavaSparkContext("local", "Simple App",
          "$YOUR_SPARK_HOME", new String[]{"target/simple-project-1.0.jar"});
        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);
      }
    }
    

    该程序只计算包含'a'的行数和包含文本文件中'b'的数字.请注意,您需要将$ YOUR_SPARK_HOME替换为安装Spark的位置.与Scala示例一样,我们初始化SparkContext,尽管我们使用特殊的JavaSparkContext类来获得Java友好的类.我们还创建了RDD(由JavaRDD表示)并对它们进行转换.最后,我们通过创建扩展spark.api.java.function.Function的类将函数传递给Spark.Java编程指南更详细地描述了这些差异.

    为了构建程序,我们还编写了一个Maven pom.xml文件,该文件将Spark列为依赖项.请注意,Spark工件使用Scala版本标记.

    <project>
      <groupId>edu.berkeley</groupId>
      <artifactId>simple-project</artifactId>
      <modelVersion>4.0.0</modelVersion>
      <name>Simple Project</name>
      <packaging>jar</packaging>
      <version>1.0</version>
      <repositories>
        <repository>
          <id>Akka repository</id>
          <url>http://repo.akka.io/releases</url>
        </repository>
      </repositories>
      <dependencies>
        <dependency> <!-- Spark dependency -->
          <groupId>org.apache.spark</groupId>
          <artifactId>spark-core_2.10</artifactId>
          <version>0.9.0-incubating</version>
        </dependency>
      </dependencies>
    </project>
    

    如果您还希望从Hadoop的HDFS读取数据,您还需要为您的HDFS版本添加对hadoop-client的依赖:

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>...</version>
    </dependency>
    

    我们根据规范的Maven目录结构布置这些文件:

    $ find .
    ./pom.xml
    ./src
    ./src/main
    ./src/main/java
    ./src/main/java/SimpleApp.java
    

    现在,我们可以使用Maven执行应用程序:

    $ mvn package
    $ mvn exec:java -Dexec.mainClass="SimpleApp"
    ...
    Lines with a: 46, Lines with b: 23
    

    然后按照在YARN上启动Spark的步骤:

    构建支持YARN的程序集JAR

    我们需要一个整合的Spark JAR(它捆绑了所有必需的依赖项)来在YARN集群上运行Spark作业.这可以通过设置Hadoop版本和SPARK_YARN环境变量来构建,如下所示:

    SPARK_HADOOP_VERSION=2.0.5-alpha SPARK_YARN=true sbt/sbt assembly
    

    组装好的JAR将是这样的:./assembly/target/scala-2.10/spark-assembly_0.9.0-incubating-hadoop2.0.5.jar.

    构建过程现在还支持新的YARN版本(2.2.x).见下文.

    准备工作

    构建支持YARN的程序集(参见上文).

    组装好的罐子可以安装到HDFS中或在本地使用.

    您的应用程序代码必须打包到单独的JAR文件中.

    如果要测试YARN部署模式,可以使用当前的Spark示例.可以通过运行以下命令生成spark-examples_2.10-0.9.0-incubating文件:

    sbt/sbt assembly 
    

    注意:由于您正在阅读的文档是针对Spark版本0.9.0孵化的,因此我们假设您已经下载了Spark 0.9.0孵化或从源代码管理中检查它.如果您使用的是不同版本的Spark,则sbt package命令生成的jar中的版本号显然会有所不同.

    组态

    对于Spark on YARN,大多数配置与其他部署相同.有关这些信息,请参阅"配置"页面.这些是特定于SPAR在YARN上的配置.

    环境变量:

    SPARK_YARN_USER_ENV,用于将环境变量添加到YARN上启动的Spark进程.这可以是逗号分隔的环境变量列表,例如

    SPARK_YARN_USER_ENV="JAVA_HOME=/jdk64,FOO=bar"
    

    系统属性:

    spark.yarn.applicationMaster.waitTries,属性,用于设置ApplicationMaster等待spark主服务器的次数,然后还有等待Spark Context进行初始化的尝试次数.默认值为10.

    spark.yarn.submit.file.replication,为应用程序上传到HDFS的文件的HDFS复制级别.这些包括火花罐,应用程序jar和任何分布式缓存文件/存档.

    spark.yarn.preserve.staging.files,设置为true以在作业结束时保留暂存文件(spark jar,app jar,分布式缓存文件),而不是删除它们.

    spark.yarn.scheduler.heartbeat.interval-ms,Spark应用程序主服务器心跳到YARN ResourceManager的时间间隔(毫秒).默认值为5秒.

    spark.yarn.max.worker.failures,失败应用程序之前的最大工作失败数.默认值是请求的工作人员数量2,最少为3.

    在YARN上启动Spark

    确保HADOOP_CONF_DIRYARN_CONF_DIR指向包含hadoop集群的(客户端)配置文件的目录.这将用于连接到群集,写入dfs并将作业提交给资源管理器.

    有两种调度程序模式可用于在YARN上启动spark应用程序.

    由YARN Client以yarn-standalone模式启动spark应用程序.

    启动YARN客户端的命令如下:

    SPARK_JAR=<SPARK_ASSEMBLY_JAR_FILE> ./bin/spark-class org.apache.spark.deploy.yarn.Client \
      --jar <YOUR_APP_JAR_FILE> \
      --class <APP_MAIN_CLASS> \
      --args <APP_MAIN_ARGUMENTS> \
      --num-workers <NUMBER_OF_WORKER_MACHINES> \
      --master-class <ApplicationMaster_CLASS>
      --master-memory <MEMORY_FOR_MASTER> \
      --worker-memory <MEMORY_PER_WORKER> \
      --worker-cores <CORES_PER_WORKER> \
      --name <application_name> \
      --queue <queue_name> \
      --addJars <any_local_files_used_in_SparkContext.addJar> \
      --files <files_for_distributed_cache> \
      --archives <archives_for_distributed_cache>
    

    例如:

    # Build the Spark assembly JAR and the Spark examples JAR
    $ SPARK_HADOOP_VERSION=2.0.5-alpha SPARK_YARN=true sbt/sbt assembly
    
    # Configure logging
    $ cp conf/log4j.properties.template conf/log4j.properties
    
    # Submit Spark's ApplicationMaster to YARN's ResourceManager, and instruct Spark to run the SparkPi example
    $ SPARK_JAR=./assembly/target/scala-2.10/spark-assembly-0.9.0-incubating-hadoop2.0.5-alpha.jar \
        ./bin/spark-class org.apache.spark.deploy.yarn.Client \
          --jar examples/target/scala-2.10/spark-examples-assembly-0.9.0-incubating.jar \
          --class org.apache.spark.examples.SparkPi \
          --args yarn-standalone \
          --num-workers 3 \
          --master-memory 4g \
          --worker-memory 2g \
          --worker-cores 1
    
    # Examine the output (replace $YARN_APP_ID in the following with the "application identifier" output by the previous command)
    # (Note: YARN_APP_LOGS_DIR is usually /tmp/logs or $HADOOP_HOME/logs/userlogs depending on the Hadoop version.)
    $ cat $YARN_APP_LOGS_DIR/$YARN_APP_ID/container*_000001/stdout
    Pi is roughly 3.13794
    

    以上启动YARN客户端程序,启动默认的Application Master.然后,SparkPi将作为Application Master的子线程运行,YARN Client将定期轮询Application Master以获取状态更新并在控制台中显示它们.应用程序运行完毕后,客户端将退出.

    使用此模式,您的应用程序实际上在运行Application Master的远程计算机上运行.因此,涉及本地交互的应用程序将无法正常工作,例如spark-shell.

    2023-01-19 03:46 回答
  • 几天前我有同样的问题,昨天设法解决了.
    这就是我所做的:

      下载sbt并解压缩并解压缩:http://www.scala-sbt.org/download.html

      我已经为Hadoop 2下载了Spark Prebuild软件包,解压缩并解压缩它:http://www.apache.org/dyn/closer.cgi/spark/spark-1.0.2/spark-1.0.2-bin-hadoop2.tgz

      我创建了独立应用程序SimpleApp.scala,如下所述:http://spark.apache.org/docs/latest/quick-start.html#standalone-applications with simple simple.sbt file(刚刚从描述中复制)和正确的目录布局

      确保你在路径中有sbt.转到您的应用程序目录并使用构建您的包sbt package

      使用启动Spark Server SPARK_HOME_DIR/sbin/spark_master.sh

      转到localhost:8080并确保您的服务器正在运行.从URL复制链接(来自服务器描述,而不是localhost.它应该是端口7077或类似的东西)

      使用SPARK_HOME_DIR/bin/spark-class org.apache.spark.deploy.worker.Worker spark://IP:PORTIP:PORT是在6中复制的URL 启动Workers

      将应用程序部署到服务器: SPARK_HOME_DIR/bin/spark-submit --class "SimpleApp" --master URL target/scala-2.10/simple-project_2.10-1.0.jar

    这对我有用,希望对你有所帮助.
    帕维尔

    2023-01-19 03:47 回答
  • 如果要连接到外部独立Spark实例,请附加选择的答案:

    SparkConf conf =
    new SparkConf()
         .setAppName("Simple Application")
         .setMaster("spark://10.3.50.139:7077");
    
    JavaSparkContext sc = new JavaSparkContext(conf);
    

    在这里,您可以根据Spark的运行位置找到更多“主”配置:http : //spark.apache.org/docs/latest/submitting-applications.html#master-urls

    2023-01-19 03:53 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有