前面配置过在windows本地通过Eclipse开发hadoop程序然后打成jar包在Linux集群中运行的经历,因此一方面是基于同样的需求,另一方面是因为我是spark小白,想通过这种方式快速了解和学习spark开发。
(注意:此文配置的是基于java语言开发spark的,如果要用scala开发,则需要在Eclipse中添加scala插件并做进一步配置。如果要用python开发,则最好用pycharm)
软件环境介绍
首先,需要在windows本地安装hadoop、spark、jdk、scala、maven、Eclipse。
Hadoop | 2.7.5 | http://archive.apache.org/dist/hadoop/core/hadoop-2.7.5/ |
Spark | 2.1.0 | http://spark.apache.org/downloads.html |
JDK | 1.8.0 | https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html |
Scala | 2.11.0 | http://distfiles.macports.org/scala2.11/ |
Maven | 3.5.4 | http://maven.apache.org/docs/history.html |
Eclipse | Mars.2 (4.5.2) | http://www.eclipse.org/downloads/packages/release/Mars/2 |
winutils&hadoop.dll | https://github.com/srccodes/hadoop-common-2.2.0-bin |
首先安装jdk,这里不做介绍了。
一、Hadoop安装
下载压缩文件后解压到某个目录下,我的是在F:\MySoftware下,解压后会得到一个hadoop-2.7.5文件夹,结果如下:
然后配置hadoop的环境变量HADOOP_HOME,并在path中加入%HADOOP_HOME%\bin。
然后在cmd中输入hadoop -version查看版本信息,证明是否安装成功
最后还有一步!将下载下来的winutils.exe和hadoop.dll复制到%HADOOP_HOME%\bin目录下即可完成hadoop安装配置。(如果没有这两个文件的话,运行spark程序的时候会报错,但奇怪的是,我的报错了但仍然可以运行得到结果。。。)
二、Scala安装
下载解压scala压缩文件,得到一个scala-2.11.0文件夹,文件目录结果如下:
然后配置 SCALA_HOME系统变量,并在path中加入%SCALA_HOME%\bin
然后在cmd中输入scala -version查看是否安装成功。
三、Spark安装
首先将下载的spark压缩包解压到某个目录下,我的是放在F:\MySoftware\下,解压后会生成一个名为spark-2.1.0-bin-hadoop2.7的文件夹,文件结构如下:
然后配置spark的环境变量SPARK_HOME,并在path中加入%SPARK_HOME%\bin。
此后在cmd中输入spark-shell查看是否安装成功(此时可能会显示一些警告信息,一般不会影响,如果看着不舒服也可以配置)
(注意,因为没有在windows本地搭建hadoop集群和spark集群,只是想在本地能够开发spark程序,真正的运行是在Linux集群上的,因此没有配置spark.env.sh等文件)
四、Eclipse下载和配置maven
Eclipse的安装在这里不做介绍了,相信大家都安装过。没安装的可以看这里。
主要需要说的是maven的配置。
首先下载maven压缩文件后解压得到一个名为apache-maven-3.5.4的文件夹,文件目录结构如下:
与前面安装hadoop之类的类似,也需要添加系统变量及path。。。
在cmd中输入mvn -v查看是否安装成功
接下来要在Eclipse中配置maven。
在Eclipse中点击window-->preference进入如下界面:
现在就已经将maven安装到Eclipse中了。但是还需要配置本地仓库。因为maven是一个方便我们管理jar包的工具,我们需要的jar包都是从中央仓库下载到本地的,但是如果本地不做保存,以后用到相同的jar包时还需要到中央仓库下载,就会很麻烦。因此需要配置本地仓库,这样下载后的jar包就放到本地仓库,方便以后使用。
配置本地仓库:
找到maven安装目录下的conf文件夹下的settings.xml文件,编辑其localRepository属性。
然后再次点击Eclipse中的window-->preferences,进入如下界面,并点击browser选择刚刚配置的那个settings.xml文件,然后下面就会自动显示你配置的本地仓库路径,最后点击应用即可。
这样就完成了Eclipse中的maven的配置。 接下来就在Eclipse中开始开发第一个spark程序。
五、开发spark
1.创建maven项目
点击finish后就会生成一个FirstSparkDemo的maven项目,结果如下:
接下来要配置pom.xml文件,让它帮忙下载一些spark开发所需要的jar文件。用以下内容替换掉<url>http://www.example.com</url>以下的内容。
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spark.version>2.1.0</spark.version>
<scala.version>2.11.0</scala.version>
<hadoop.version>2.7.5</hadoop.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>args4j</groupId>
<artifactId>args4j</artifactId>
<version>2.33</version>
</dependency>
<dependency>
<groupId>jline</groupId>
<artifactId>jline</artifactId>
<version>2.14.5</version>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven
defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<archive>
<manifest>
<!-- 我运行这个jar所运行的主类 -->
<mainClass>code.demo.spark.JavaWordCount</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>
<!-- 必须是这样写 -->
jar-with-dependencies
</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
接下来在src/main/java下创建类,开始编程。
package FirstSpark;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import java.util.ArrayList;
import java.util.List;
public final class FirstSparkDemo {
public static void main(String[] args) throws Exception {
SparkConf sparkConf = new SparkConf().setAppName("JavaSparkPi").setMaster("local");//local是特殊值,可以让spark运行在单机单线程上而无需连接到集群
JavaSparkContext jsc = new JavaSparkContext(sparkConf);
long start = System.currentTimeMillis();
int slices = 10;
int n = 100000 * slices;
List<Integer> l = new ArrayList<Integer>(n);
for (int i = 0; i < n; i++) {
l.add(i);
}
/*
* JavaSparkContext的parallelize:将一个集合变成一个RDD - 第一个参数一是一个 Seq集合 -
* 第二个参数是分区数 - 返回的是RDD[T]
*/
JavaRDD<Integer> dataSet = jsc.parallelize(l, slices);
int count = dataSet.map(new Function<Integer, Integer>() {
private static final long serialVersionUID = 1L;
public Integer call(Integer integer) {
double x = Math.random() * 2 - 1;
double y = Math.random() * 2 - 1;
return (x * x + y * y < 1) ? 1 : 0;
}
}).reduce(new Function2<Integer, Integer, Integer>() {
private static final long serialVersionUID = 1L;
public Integer call(Integer integer, Integer integer2) {
return integer + integer2;
}
});
long end = System.currentTimeMillis();
System.out.println("Pi is roughly " + 4.0 * count / n + ",use : " + (end - start) + "ms");
jsc.stop();
jsc.close();
}
}
运行后有如下输出则说明配置成功。
参考博文:
https://blog.youkuaiyun.com/qq_32653877/article/details/81979371
https://my.oschina.net/orrin/blog/1812035
https://blog.youkuaiyun.com/nxw_tsp/article/details/78281533(这是一个配置windows本地spark集群的博文)