使用IDEA开发Spark程序

2022-04-23 09:03:22 浏览数 (1)

Windows环境

下载地址

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

版本

名称

版本

Scala

2.12.15

Spark

3.1.3

Hadoop

2.7.7

Scala

下载

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

Spark

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

下载地址

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

设置环境变量

Path中添加

Path

D:Toolsbigdataspark-3.1.3-bin-hadoop2.7bin

SPARK_LOCAL_DIRS

D:Toolsbigdataspark-3.1.3-bin-hadoop2.7temp

如图

其中

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

运行

代码语言:javascript复制
spark-shell

运行报错

java.io.IOException: Failed to delete

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

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

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

最后面添加如下信息:

代码语言:javascript复制
log4j.logger.org.apache.spark.util.ShutdownHookManager=OFF
log4j.logger.org.apache.spark.SparkEnv=ERROR

Hadoop

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

配置HADOOP_HOME&Path

HADOOP_HOME

D:Toolsbigdatahadoop-2.7.7

Path

D:Toolsbigdatahadoop-2.7.7bin

配置文件

D:Toolsbigdatahadoop-2.7.7etchadoop,修改hadoop的4个主要配置文件

修改core-site.xml

代码语言:javascript复制
<?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/hadoop-2.7.7/workspace/tmp</value>
    <description>namenode上本地的hadoop临时文件夹</description>
  </property>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
    <description>HDFS的URI,文件系统://namenode标识:端口号</description>
  </property>
</configuration>

修改hdfs-site.xml

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <!-- 这个参数设置为1,因为是单机版hadoop -->
  <property>
    <name>dfs.replication</name>
    <value>1</value>
    <description>副本个数,配置默认是3,应小于datanode机器数量</description>
  </property>
  <property>
    <name>dfs.data.dir</name>
    <value>/D:/Tools/bigdata/hadoop-2.7.7/workspace/data</value>
    <description>datanode上数据块的物理存储位置</description>
  </property>
  <property>
    <name>dfs.name.dir</name>
    <value>/D:/Tools/bigdata/hadoop-2.7.7/workspace/name</value>
    <description>namenode上存储hdfs名字空间元数据</description>
  </property>
</configuration>

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

代码语言:javascript复制
<?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

代码语言:javascript复制
<?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:Toolsbigdatahadoop-2.7.7bin

创建项目

创建项目

项目名WordCount

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

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

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

添加类WordCount

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

代码语言:javascript复制
<?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_studywordcount.txt

代码语言:javascript复制
good good study
day day up

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

代码语言:javascript复制
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包。

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

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

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

代码语言:javascript复制
spark-submit --class WordCount D:ProjectSparkWordCounttargetWordCount-1.0-jar-with-dependencies.jar

0 人点赞