Maven打包Java版的spark程序到jar包,本地Windows测试,上传到集群中运行

本文介绍如何使用Maven将Spark程序打包成jar,并在本地Windows环境中进行测试,最后上传到集群执行。涵盖Maven配置、本地测试命令及集群部署步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:翁松秀


Maven打包Java版的spark程序到jar包,本地Windows测试,上传到集群中运行


学习spark的路漫漫啊~前面搭建好了本地环境,用eclipse跑了几个spark自带的程序,现在想用maven将程序打包成jar包,然后在本地测试,再上传到服务器集群中提交。
Windows本地搭建Spark开发环境

路漫漫其修远兮,吾将上下而求索。

Step1:Maven打包Jar包

windows本地测试版JavaWordCount代码:

package code.demo.spark;
import scala.Tuple2;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
public final class JavaWordCount {
	private static final Pattern SPACE = Pattern.compile(" ");
	public static void main(String[] args) throws Exception {
	
		//将hadoop路径映射为本地的hadoop路径
		
		System.setProperty("hadoop.home.dir", "F:\\home\\hadoop");
		SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount").setMaster("local");
		JavaSparkContext ctx = new JavaSparkContext(sparkConf);
		
		//从本地磁盘中读取待统计的文件
		
		JavaRDD<String> lines = ctx.textFile("F:/home/spark/README.md");
		JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
			private static final long serialVersionUID = 1L;
			
			@Override
			public Iterable<String> call(String s) {
				return Arrays.asList(SPACE.split(s));
			}
		});
		JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {

			private static final long serialVersionUID = 1L;

			@Override
			public Tuple2<String, Integer> call(String s) {
				return new Tuple2<String, Integer>(s, 1);
			}
		});
		JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {
			private static final long serialVersionUID = 1L;

			@Override
			public Integer call(Integer i1, Integer i2) {
				return i1 + i2;
			}
		});

		List<Tuple2<String, Integer>> output = counts.collect();
		for (Tuple2<?, ?> tuple : output) {
			System.out.println(tuple._1() + ": " + tuple._2());
		}
		ctx.stop();
		ctx.close();
	}
}

win + R 打开运行窗口输入cmd打开命令行窗口,切换到程序所在目录,我的目录是:

E:\code\JavaWorkspace\SparkDemo

编译程序

mvn compile

这里写图片描述
打包程序

mvn package

这里写图片描述
如果程序没有特殊情况,比如缺胳膊少腿,打包完后回看到“BUILD SUCCESS”,说明打包成功,这时在maven工程的target文件夹中就可以看到打包好的jar包。
这里写图片描述

Step2:本地测试spark程序

打开命令行窗口进入spark安装目录的bin目录底下,我的spark安装路径是

F:\home\spark-1.6.3-bin-hadoop2.6

为了提交方便,我把打包好的jar包放到了F盘的根目录

F:\ExampleSpark-1.0-SNAPSHOT.jar

然后执行命令

spark-submit --class code.demo.spark.JavaWordCount --master local F:\\ExampleSpark-1.0-SNAPSHOT.jar

这里写图片描述

Step3:Jar包上传到集群

准备工作:因为WordCount程序需要读取文件,为了方便起见,所以我们将程序中要统计的文件word.txt上传到HDFS
命令格式:hadoop fs -put 本地路径 HDFS路径
命令如下:

hadoop fs -put /home/hmaster/word.txt hdfs://hadoop-mn01:9000/user/hmaster/word.txt

查看是否上传成功:

hadoop fs -ls hdfs://hadoop-mn01:9000/user/hmaster

如果看到word.txt说明成功,没有则失败。上传失败的原因可能hdfs上面路径不存在,比如说hmaster文件夹不存在,在hdfs的user目录下创建hmaster文件夹:

hadoop fs -mkdir /user/hmaster

集群版代码:直接从HDFS读取要统计单词的文件word.txt


package code.demo.spark;

import scala.Tuple2;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

public final class JavaWordCount {
	private static final Pattern SPACE = Pattern.compile(" ");
	public static void main(String[] args) throws Exception {
		SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount");
		JavaSparkContext ctx = new JavaSparkContext(sparkConf);
		
		//从hdfs中读取word.txt进行单词统计
		
		JavaRDD<String> lines = ctx.textFile("hdfs://hadoop-mn01:9000/user/hmaster/word.txt");
		JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
			private static final long serialVersionUID = 1L;
			@Override
			public Iterable<String> call(String s) {
				return Arrays.asList(SPACE.split(s));
			}
		});
		JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {
			private static final long serialVersionUID = 1L;
			@Override
			public Tuple2<String, Integer> call(String s) {
				return new Tuple2<String, Integer>(s, 1);
			}
		});
		JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {
			private static final long serialVersionUID = 1L;
			@Override
			public Integer call(Integer i1, Integer i2) {
				return i1 + i2;
			}
		});
		List<Tuple2<String, Integer>> output = counts.collect();
		for (Tuple2<?, ?> tuple : output) {
			System.out.println(tuple._1() + ": " + tuple._2());
		}
		ctx.stop();
		ctx.close();
	}
}

从本地windows上传jar包到linux服务器的集群里,我用的是WinSCP,除了WinSCP还有其他的方法,不一一例举。
这里写图片描述

Step4:集群上提交Jar包

打开spark主节点服务器的终端,进入spark的安装目录,执行提交命令:

.bin/spark-submit --class code.demo.spark.JavaWordCount --master spark://hadoop-mn01:7077 /home/hmaster/WordCount.jar

命令解释:
.bin/spark-submit :提交命令,提交应用程序
–class code.demo.spark.JavaWordCount:应用程序的主类
–master spark://hadoop-mn01:7077 :运行的master,跟本地测试local不一样
/home/hmaster/WordCount.jar:jar包所在路径
提交之后程序运行完后就能看到统计的结果:
这里写图片描述
Hello WordCount!

### 将Scala代码在IDEA中打包JAR文件并通过命令上传到集群运行 #### 准备工作 为了能够在IntelliJ IDEA中功创建并打包Scala项目,需先完必要的环境设置。这括但不限于安装Scala插件[^2]。 #### 创建新项目 当启动新的Scala Maven项目时,选择`File -> New Project`,随后挑选Scala作为主要编程语言,并确保已正确指定了Project SDK和Scala SDK。如果未见Scala选项,则表明尚未安装相应的插件。 #### 编写POM.XML文件 对于Maven项目的构建,编辑`pom.xml`来定义依赖关系和其他配置参数至关重要。特别是要加入Spark的相关库支持以便后续能够顺利编译和部署应用至集群环境中[^1]。 ```xml <dependencies> <!-- Spark Core --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>${spark.version}</version> </dependency> <!-- Other dependencies... --> </dependencies> <!-- Build configuration to include all dependencies into the JAR file --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 上述XML片段展示了如何利用maven-shade-plugin将所有依赖项嵌入最终生JAR文件内,从而简化分发过程[^4]。 #### 打包项目为JAR 一旦完了源码编写及其关联资源准备之后,可以通过右键点击项目根目录下的任意空白处,在弹出菜单里依次选取`Build | Build Artifacts` 或者直接通过命令行工具mvn clean package 来触发整个工程的编译与打包流程,进而获得可执行本的应用程序。 #### 提交作业给集群 最后一步就是把之前制作好的JAR文件连同输入数据集一起发送到远程服务器上去执行计算任务。这里给出了一条典型的spark-submit调用语句用于说明具体做法: ```bash bin/spark-submit \ --class com.example.MainClass \ --master yarn \ --deploy-mode cluster \ /path/to/application-jar-file.jar \ hdfs://namenode:port/input-path \ hdfs://namenode:port/output-path ``` 请注意替换实际路径名、端口号以及其他必要参数以适应特定场景需求[^5]。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翁松秀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值