Eclipse下用Maven(Java+Scala混合)构建Hadoop/Spark项目


 

1.如何在Maven项目中加入Scala源码

在Maven项目中加入Scala,一种比较规整的方式是:

  1. 构建普通Maven项目
  2. 右键项目-Configure-Add Scala Nature
  3. 在main文件夹下新建一个名为Scala的Source Folder(右键项目-New-Package-src/main/scala),与Java并列,Scala文件放在Scala下,Java文件放在Java下,两文件夹下可以有相同的包(两文件夹下分别创建一个同名的包)。
    项目结构
  4. 通过在pom.xml中添加plugins,使项目能编译scala源码
<build>
		<plugins>
			<plugin>
				<groupId>org.scala-tools</groupId>
				<artifactId>maven-scala-plugin</artifactId>
				<version>2.15.2</version>
				<executions>
					<execution>
						<id>scala-compile-first</id>
						<goals>
							<goal>compile</goal>
						</goals>
						<configuration>
							<includes>
								<include>**/*.scala</include>
							</includes>
						</configuration>
					</execution>
					<execution>
						<id>scala-test-compile</id>
						<goals>
							<goal>testCompile</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>
				<configuration>
					<descriptorRefs>
						<descriptorRef>jar-with-dependencies</descriptorRef>
					</descriptorRefs>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
  1. 编写源码
  2. 使用mvn clean scala:compile compile package编译打包。
    传统的命令只能编译打包Java源码,这种方式使用maven-scala-plugin插件提供的选项scala:compile编译Scala源码。先编译scala,再编译java,最后打包。

 

2.构建测试提交Spark项目的流程

2.1 流程
  1. 在Windows环境下用IDE(如Eclipse)以local模式编写源码,并测试

    需启动Windows下的HDFS,文件路径为

    hdfs://127.0.0.1:9000/input/文件名
    

    或不使用HDFS而使用本地文件系统下的文件,文件路径为

    file:///E://...
    
  2. 将上述项目打包、用cmd提交测试(可跳过)

  3. 将代码改写成standalone模式下的代码

  4. 打包

  5. 在虚拟机集群上提交测试

    需启动HDFS和Spark集群,文件路径为

    hdfs://192.168.100.10:8020/input/文件名
    

    如果不使用HDFS,则为

    file:///.../文件名
    

其中,具体ip、端口号、路径按自己设置的。在两种模式中,我一般都使用HDFS下的路径。
 

2.2 不同模式下初始化SparkContext的区别

(1)local模式

val conf=new SparkConf().setMaster("local").setAppName("jobname")
val spark=new SparkContext(conf)

其中,

  • local: 所有计算都运行在一个线程当中,没有任何并行计算,通常我们在本机执行一些测试代码,或者练手,就用这种模式。
  • local[K]: 指定使用几个线程来运行计算,比如local[4]就是运行4个worker线程。通常我们的cpu有几个core,就指定几个线程,最大化利用cpu的计算能力
  • local[*]: 这种模式直接帮你按照cpu最多cores来设置线程数了。

提交任务的命令

E:\Spark\spark-2.4.3-bin-hadoop2.7\bin>
    spark-submit --class 主类所在package名.主类名 --master local jar包位置\jar
例: spark-submit --class pca.PCAMain --master local E:\\Spark\myjars\PcaSpark-0.0.1-SNAPSHOT-jar-with-dependencies.jar

(2)standalone模式

val conf=new SparkConf().setAppName("jobname")
val spark=new SparkContext(conf)

提交任务的命令

    /opt/modules/hadoopentire/spark-2.4.3/bin/spark-submit --class 主类所在包名.主类名 --master spark://192.168.100.10:7077 jar包位置/jar包名
例: /opt/modules/hadoopentire/spark-2.4.3/bin/spark-submit --class pca.PCAMain --master spark://192.168.100.10:7077 /opt/data/input/pca.jar

 

2.3 带args输入参数

源代码中,主函数的参数列表不用变,得到的都是String类型

Java: xxx=args[0];
	  xxx=args[1];
Scala: xxx=args(0);
       xxx=args(1);

Eclipse中测试,右键主类-Run As-Run Configurations-Scala Application-Arguments选项卡-在Program arguments里输入参数-Apply-Run 如果是Java直接点到选项卡即可
在这里插入图片描述
命令行命令:后面的参数不用带引号

java -jar xxx.jar 参数1 参数2 参数n
spark-submit ...... /xxx.jar 参数1 参数2 参数n

 

2.4 pom.xml文件的常用配置:
<properties>
    <scala.version>2.11</scala.version>
    <spark.version>2.4.3</spark.version>
    <hadoop.version>2.7.0</hadoop.version>
  </properties>
  
  <dependencies>
  
  	<dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_${scala.version}</artifactId>
      <version>${spark.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_${scala.version}</artifactId>
      <version>${spark.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-hive_${scala.version}</artifactId>
      <version>${spark.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-streaming_${scala.version}</artifactId>
      <version>${spark.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>2.7.0</version>
    </dependency>
  
  
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>2.11.8</version>
    </dependency>
    
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-compiler</artifactId>
      <version>2.11.8</version>
    </dependency>
    
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-reflect</artifactId>
      <version>2.11.8</version>
    </dependency>
    
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.4</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.specs</groupId>
      <artifactId>specs</artifactId>
      <version>1.2.5</version>
      <scope>test</scope>
    </dependency>
    
    <dependency>
	    <groupId>gov.nist.math</groupId>
	    <artifactId>jama</artifactId>
	    <version>1.0.3</version>
	</dependency>
	
	<dependency>
	    <groupId>org.apache.commons</groupId>
	    <artifactId>commons-lang3</artifactId>
	    <version>3.4</version>
	</dependency>
    
  </dependencies>
  
  <build>
		<plugins>
			<plugin>
				<groupId>org.scala-tools</groupId>
				<artifactId>maven-scala-plugin</artifactId>
				<version>2.15.2</version>
				<executions>
					<execution>
						<id>scala-compile-first</id>
						<goals>
							<goal>compile</goal>
						</goals>
						<configuration>
							<includes>
								<include>**/*.scala</include>
							</includes>
						</configuration>
					</execution>
					<execution>
						<id>scala-test-compile</id>
						<goals>
							<goal>testCompile</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>
				<configuration>
					<descriptorRefs>
						<descriptorRef>jar-with-dependencies</descriptorRef>
					</descriptorRefs>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
		<pluginManagement>
			<plugins>
				<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
				<plugin>
					<groupId>org.eclipse.m2e</groupId>
					<artifactId>lifecycle-mapping</artifactId>
					<version>1.0.0</version>
					<configuration>
						<lifecycleMappingMetadata>
							<pluginExecutions>
								<pluginExecution>
									<pluginExecutionFilter>
										<groupId>
											org.scala-tools
										</groupId>
										<artifactId>
											maven-scala-plugin
										</artifactId>
										<versionRange>
											[2.15.2,)
										</versionRange>
										<goals>
											<goal>compile</goal>
											<goal>testCompile</goal>
										</goals>
									</pluginExecutionFilter>
									<action>
										<ignore></ignore>
									</action>
								</pluginExecution>
							</pluginExecutions>
						</lifecycleMappingMetadata>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
  </build>

 
 

参考文章

scala和maven整合实践
eclipse+scala+java+maven 整合实践
eclipse + maven + scala+spark环境搭建
Maven打包Java版的spark程序到jar包,本地Windows测试,上传到集群中运行
在Windows平台安装Hadoop&&idea调试spark程序(scala版)
Spark启动时的master参数以及Spark的部署方式
eclipse如何输入args参数
命令行运行jar 并传参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值