我为Spark编写了一个Java程序。但是如何从Unix命令行运行和编译它。在编译运行时我是否必须包含任何jar
答案 0 :(得分:57)
结合官方Quick Start Guide和Launching Spark on YARN的步骤,我们得到:
我们将创建一个非常简单的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的程序集JAR
我们需要一个整合的Spark JAR(它捆绑了所有必需的依赖项)来在YARN集群上运行Spark作业。这可以通过设置Hadoop版本和SPARK_YARN环境变量来构建,如下所示:
SPARK_HADOOP_VERSION=2.0.5-alpha SPARK_YARN=true sbt/sbt assembly
组装好的JAR将是这样的:./assembly / target / skla-10.10 / spark-assembly_0.9.0-incubating-hadoop2.0.5.jar。
构建过程现在还支持新的YARN版本(2.2.x)。见下文。
<强>制剂强>
如果要测试YARN部署模式,可以使用当前的Spark示例。可以通过运行:
生成spark-examples_2.10-0.9.0-incubating文件sbt/sbt assembly
注意:,因为您正在阅读的文档是针对Spark版本0.9.0孵化的,我们在此假设您已经下载了Spark 0.9.0-incubating或检查了源代码控制。如果您使用的是不同版本的Spark,则sbt package命令生成的jar中的版本号显然会有所不同。
<强>配置强>
对于Spark on YARN,大多数配置与其他部署相同。有关这些信息,请参阅“配置”页面。这些是特定于SPAR在YARN上的配置。
环境变量:
SPARK_YARN_USER_ENV="JAVA_HOME=/jdk64,FOO=bar"
系统属性:
在YARN上启动Spark
确保 HADOOP_CONF_DIR 或 YARN_CONF_DIR 指向包含hadoop群集的(客户端)配置文件的目录。这将用于连接到群集,写入dfs并将作业提交给资源管理器。
有两种调度程序模式可用于在YARN上启动spark应用程序。
YARN客户端使用纱线独立模式启动火花应用程序。
启动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的远程计算机上运行。因此,涉及本地交互的应用程序将无法正常工作,例如火花 - 壳
答案 1 :(得分:8)
我几天前有同样的问题,昨天设法解决了。
这就是我所做的:
sbt package
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:PORT
启动工作人员,其中IP:PORT是在6 SPARK_HOME_DIR/bin/spark-submit --class "SimpleApp" --master URL target/scala-2.10/simple-project_2.10-1.0.jar
那对我有用,希望对你有所帮助 的Pawel
答案 2 :(得分:4)
如果要连接到外部独立Spark实例,请按照所选答案进行操作:
SparkConf conf =
new SparkConf()
.setAppName("Simple Application")
.setMaster("spark://10.3.50.139:7077");
JavaSparkContext sc = new JavaSparkContext(conf);
在这里你可以找到更多&#34; master&#34;配置取决于Spark运行的位置:http://spark.apache.org/docs/latest/submitting-applications.html#master-urls
答案 3 :(得分:1)
这个答案适用于Spark 2.3。如果您想在本地测试您的Spark应用程序,即没有Hadoop集群的先决条件,甚至无需启动任何独立的Spark服务,您可以这样做:< / p>
JavaSparkContext jsc = new JavaSparkContext(new SparkConf().setAppName("Simple App"));
然后,在本地运行您的应用程序:
$SPARK_HOME/bin/spark-submit --class SimpleApp --master local target/scala-2.10/simple-project_2.10-1.0.jar
为此,您需要将Spark tar文件解压缩到$ SPARK_HOME,并将$ SPARK_HOME设置为Spark用户的.profile