大数据开发-Windows下Hadoop和Spark开发环境搭建

Windows环境

下载地址

链接:https://pan.baidu.com/s/1YczOo5novINV_MimJ9Xpqg
提取码:psvm

版本

名称 版本
Hadoop 2.7.7
Scala 2.12.15
Spark 3.1.3

Hadoop

https://archive.apache.org/dist/hadoop/common/hadoop-2.7.7/

配置HADOOP_HOME&Path

HADOOP_HOME D:\Tools\bigdata\hadoop-2.7.7
Path %HADOOP_HOME%\bin

配置文件

首选创建三个文件夹

D:\Tools\bigdata\zdata\hadoop\data

D:\Tools\bigdata\zdata\hadoop\name

D:\Tools\bigdata\zdata\hadoop\tmp

D:\Tools\bigdata\hadoop-2.7.7\etc\hadoop,修改hadoop以下的几个文件

hadoop-env.cmd

1
set JAVA_HOME="D:\Tools\Java\jdk1.8.0_102"

修改core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/D:/Tools/bigdata/zdata/hadoop/tmp</value>
<description></description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
<description></description>
</property>
</configuration>

修改hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
<description></description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/D:/Tools/bigdata/zdata/hadoop/data</value>
<description></description>
</property>
<property>
<name>dfs.name.dir</name>
<value>/D:/Tools/bigdata/zdata/hadoop/name</value>
<description></description>
</property>
</configuration>

修改mapred-site.xml(如果不存在就先copy mapred-site.xml.template,再修改文件名为mapred-site.xml)

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>hdfs://localhost:9001</value>
</property>
</configuration>

修改yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0"?>

<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>

winutils

https://gitee.com/nkuhyx/winutils

找到对应的版本把bin里的文件覆盖到hadoop的bin目录下

D:\Tools\bigdata\hadoop-2.7.7\bin

启动

环境变量中Path添加

1
2
3
D:\Tools\Java\jdk1.8.0_102\bin
D:\Tools\bigdata\hadoop-2.7.7\bin
D:\Tools\bigdata\hadoop-2.7.7\sbin

注意

建议Java安装路径中不包含空格或中文,负责可能运行报错。

namenode格式化

1
hdfs namenode -format

出现以下文字则成功了

hdfs namenode -format

全部服务

1
2
start-all.cmd
stop-all.cmd

只启动HDFS

1
2
start-dfs.cmd
stop-dfs.cmd

地址

作用 地址
HDFS监控页面 http://localhost:50070/
http://localhost:50070/explorer.html#/
Yarn监控页面 http://localhost:8088/cluster

Scala

下载

https://www.scala-lang.org/download/2.12.15.html

image-20220421183614199

Spark

https://spark.apache.org/downloads.html

image-20220421171049474

下载地址

https://dlcdn.apache.org/spark/spark-3.1.3/spark-3.1.3-bin-hadoop2.7.tgz

设置环境变量

Path中添加

Path D:\Tools\bigdata\spark-3.1.3-bin-hadoop2.7\bin
SPARK_LOCAL_DIRS D:\Tools\bigdata\spark-3.1.3-bin-hadoop2.7\temp

如图

image-20220422104639709

其中

SPARK_LOCAL_DIRS 是设置临时文件的存储位置,比如运行一个jar文件,就会先把文件放到这个临时目录中,使用完成后再删除。

运行

1
spark-shell

运行报错

java.io.IOException: Failed to delete

当我们提交打包好的spark程序时提示如上报错。

在windows环境下本身就存在这样的问题,和我们的程序没有关系。

若是想消除该报错,可以在%SPARK_HOME%/conf下的文件log4j.properties(没有的话可以复制log4j.properties.template文件)

最后面添加如下信息:

1
2
log4j.logger.org.apache.spark.util.ShutdownHookManager=OFF
log4j.logger.org.apache.spark.SparkEnv=ERROR

创建项目

创建项目

image-20220421143002437

项目名WordCount

image-20220421143202036

在项目名称WordCount上单击鼠标右键,在弹出的菜单中点击Add Framework Support

image-20220421184711204

java目录上单击鼠标右键,在弹出的菜单中选择Refactor,再在弹出的菜单中选择Rename

然后,在出现的界面中把java目录名称修改为scala

image-20220421143610503

添加类WordCount

image-20220421143726513

在IDEA开发界面中,打开pom.xml,清空里面的内容,输入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>cn.psvmc</groupId>
<artifactId>WordCount</artifactId>
<version>1.0</version>

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spark.version>3.1.3</spark.version>
<scala.version>2.12</scala.version>
</properties>

<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>

</dependencies>
<build>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.4.6</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<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>
</project>

测试

创建测试文件wordcount.txt

D:\spark_study\wordcount.txt

1
2
good good study
day day up

然后,再打开WordCount.scala代码文件,清空里面的内容,输入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
import org.apache.spark.{SparkConf, SparkContext}

object WordCount {
def main(args: Array[String]): Unit = {
val inputFile = "file:///D:\\spark_study\\wordcount.txt"
val conf = new SparkConf().setAppName("WordCount").setMaster("local")
val sc = new SparkContext(conf)
val textFile = sc.textFile(inputFile)
val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)
wordCount.foreach(println)
}
}

运行就可以看到结果为

(up,1)
(day,2)
(good,2)
(study,1)

打包运行

在IDEA开发界面的右侧,点击Maven图标,会弹出Maven调试界面

在Maven调试界面中点击package,就可以对应用程序进行打包,打包成JAR包。

image-20220421165441710

这时,到IDEA开发界面左侧的项目目录树中,在“target”目录下,就可以看到生成了两个JAR文件,

分别是:WordCount-1.0.jarWordCount-1.0-jar-with-dependencies.jar

image-20220421181248319

然后,打开一个Linux终端,执行如下命令运行JAR包:

1
spark-submit --class WordCount D:\Project\Spark\WordCount\target\WordCount-1.0-jar-with-dependencies.jar