为开发和调试SPark应用程序设置的完整的开发环境。这里,我们将使用Java,其实SPark还支持使用Scala, Python和R。我们将使用IntelliJ作为IDE,因为我们对于eclipse再熟悉不过了,这里就使用IntelliJ进行练练手,所以我们也将使用Maven作为构建的管理器。在本篇结束时,您将了解如何设置IntelliJ,如何使用Maven管理依赖项,如何将SPark应用程序打包并部署到集群中,以及如何将活动程序连接到调试器。

一、创建一个新的IntelliJ项目

  (注意:指令可能因操作系统而异。在本教程中,我们将使用IntelliJ版本:2018.2.1上的MAC OSX High Sierra. )

  通过选择File > New > Project:         ,再选择 Maven > 单击Next

将项目命名如下:

  • GroupId:Hortonworks
  • ArtifactId:SparkTutorial
  • 版本:1.0-SNAPSHOT

  然后单击下一个继续。

  最后,选择项目名称和位置。这些字段应该是自动填充的,所以让我们保持默认值即可:

  IntelliJ应该创建一个具有默认目录结构的新项目。生成所有文件夹可能需要一两分钟。

  让我们分解一下项目结构。

  • .IDEA:这些是IntelliJ配置文件。
  • SRC:源代码。大部分代码应该进入主目录。应该为测试脚本保留测试文件夹。
  • 目标:当您编译您的项目时,它将位于这里。
  • xml:Maven配置文件。我们将向您展示如何使用该文件导入第三方库和文档。

  在继续之前,让我们验证几个IntelliJ设置:

    1.核实import Maven projects automatically是ON.

    •   Preferences > Build, Execution, Deployment > Build Tools > Maven > Importing

    2.核实Project SDK和Project language level设置为Java版本:

    •   File > Project Structure > Project

    3.核实Language level 设置为Java版本:

    •   File > Project Structure > Module

二、Maven配置

  在开始编写SPark应用程序之前,我们需要将SPark库和文档导入IntelliJ。为此,我们将使用Maven。这是必要的,如果我们想要IntelliJ识别Spark代码。要导入SPark库,我们将使用依赖关系管理器Maven。将以下行添加到文件put.xml中:

<?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>hortonworks</groupId>
<artifactId>SparkTutorial</artifactId>
<version>1.0-SNAPSHOT</version> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build> <dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.2.1</version>
</dependency>
</dependencies> </project>

需要导入put.xml的代码

  保存文件后,IntelliJ将自动导入运行SPark所需的库和文档。

三、创建SPark应用程序

  本地部署

  对于我们的第一个应用程序,我们将构建一个简单的程序,进行单词计数。Download the file,将文件保存为shakespeare.txt.

  稍后,我们希望SPark从HDFS(HadoopDistributedFileSystem)检索这个文件,所以现在让我们把它放在那里。要上传到HDFS,首先要确保我们的Ambari 沙箱已经启动并运行。

  • 导航到sandbox-hdp.hortonworks.com:8080
  • 使用用户名/密码登录
  • 一旦您登录到Ambari Manager,鼠标在右上角的下拉菜单上并单击文件视图.
  • 打开TMP文件夹并单击上传按钮在右上角上传文件。确保它的名字shakespeare.txt.

  现在我们已经准备好创建应用程序了。在IDE中打开文件夹src/main/resources,这应该是自动为您生成的。

  接下来,选择文件夹SRC/Main/java:

  • 右键单击文件夹并选择New > Java Class
  • 新建类文件:Main.java

  将其复制到您的新文件中:

public class Main {

    public static void main(String[] args) {
System.out.println("Hello World");
}
}

  现在转到IDE顶部的“Run”下拉菜单,然后选择Run。然后选择Main。如果所有设置都正确,IDE应该打印“HelloWorld”。现在我们已经知道环境已正确设置,请用以下代码替换该文件:

package Hortonworks.SparkTutorial;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.SparkConf;
import scala.Tuple2; import java.util.Arrays; public class Main { public static void main(String[] args){ //Create a SparkContext to initialize
SparkConf conf = new SparkConf().setMaster("local").setAppName("Word Count"); // Create a Java version of the Spark Context
JavaSparkContext sc = new JavaSparkContext(conf); // Load the text into a Spark RDD, which is a distributed representation of each line of text
JavaRDD<String> textFile = sc.textFile("src/main/resources/shakespeare.txt");
JavaPairRDD<String, Integer> counts = textFile
.flatMap(s -> Arrays.asList(s.split("[ ,]")).iterator())
.mapToPair(word -> new Tuple2<>(word, 1))
.reduceByKey((a, b) -> a + b);
counts.foreach(p -> System.out.println(p));
System.out.println("Total words: " + counts.count());
counts.saveAsTextFile("/tmp/shakespeareWordCount");
} }

替换代码

  

  如前所述,单击Run>Run以运行文件。这应该运行Spark进行作业,并打印在莎士比亚shakespeare.txt中出现的每个单词的频率。

  由您的程序创建的文件可以在上面代码中指定的目录中找到,在我们的例子中,我们使用/tmp/shakspeareWordCount.

注意,我们已经设置了这一行:

setMaster("local")

  这告诉SPark使用此计算机在本地运行,而不是在分布式模式下运行。要在多台机器上运行Spark,我们需要将此值更改为 YARN。我们稍后再看看怎么做。

  现在我们已经了解了如何在IDE中直接部署应用程序。这是一种快速构建和测试应用程序的好方法,但这有点不切实际,因为SPark只在一台机器上运行。在生产中,SPark通常会处理存储在分布式文件系统(如HDFS)上的数据(如果运行在云中,则可能是S3或Azure博客存储)。SPark也通常在集群模式下运行(即,分布在许多机器上)。

  那么,首先,我们将学习如何在Hortonworks沙箱(这是一个单节点Hadoop环境)上部署SPark,然后我们将学习如何在云中部署SPark。

  部署到Sandbox

  虽然我们仍然在一台机器上运行SPark,但是我们将使用HDFS和SEAR(集群资源管理器)。这将比我们之前所做的更接近于运行一个完整的分布式集群。我们要做的第一件事是更改这一行:

JavaRDD<String> textFile = sc.textFile("src/main/resources/shakespeare.txt");

  更改为:

JavaRDD<String> textFile = sc.textFile("hdfs:///tmp/shakespeare.txt");

将:

counts.saveAsTextFile("/tmp/shakespeareWordCount");

  更改为:

counts.saveAsTextFile("hdfs:///tmp/shakespeareWordCount");

    这告诉 Spark 要读取和写入HDFS,而不是本地。确保保存文件。

  接下来,我们将把这些代码打包到一个编译好的JAR文件中,这个JAR文件可以部署在 sandbox沙箱上。了简化我们的生活,我们将创建一个程序集JAR:一个包含我们的代码和我们的代码所依赖的所有JAR的JAR文件。通过将我们的代码打包成一个程序集,我们保证在代码运行时,所有依赖的JAR(在pu.xml中定义的)都会出现。

  打开终端和CD到包含 pom.xml. 运行mvn package. 这将在文件夹中创建一个名为“SparkTutver-1.0-SNAPSHOT.jar”的编译JAR。

      (注:如果MVN命令不起作用-请确保已成功安装maven。)

将程序集复制到沙箱:

scp -P 2222 ./target/SparkTutorial-1.0-SNAPSHOT.jar root@sandbox-hdp.hortonworks.com:/root

打开第二个终端窗口,将ssh放入沙箱:

ssh -p 2222 root@sandbox-hdp.hortonworks.com

使用spark-submit 运行我们的代码。我们需要指定主类、要运行的JAR和运行模式(本地或集群):

spark-submit --class "Hortonworks.SparkTutorial.Main" --master local ./SparkTutorial-1.0-SNAPSHOT.jar

您的控制台应该可以看到出现的每个单词的频率,如下所示:

...
(comutual,1)
(ban-dogs,1)
(rut-time,1)
(ORLANDO],4)
(Deceitful,1)
(commits,3)
(GENTLEWOMAN,4)
(honors,10)
(returnest,1)
(topp'd?,1)
(compass?,1)
(toothache?,1)
(miserably,1)
(hen?,1)
(luck?,2)
(call'd,162)
(lecherous,2)
...

控制台出现的内容

  此外,如果在Ambari中打开“文件视图”,您应该会看到/tmp/shakspeareWordCount下的结果。这表明结果也存储在HDFS中。

四、部署到云端

  在设置集群之后,部署代码的过程类似于部署到沙箱。我们需要对集群的JAR进行SCP:

scp -P 2222 -i "key.pem" ./target/SparkTutorial-1.0-SNAPSHOT.jar root@[ip address of a master node]:root

  然后打开第二个终端窗口并将ssh插入主节点:

ssh -p 2222 -i "key.pem" root@[ip address of a master node]

  然后使用 spark-submit运行我们的代码:

spark-submit --class "Hortonworks.SparkTutorial.Main"  --master yarn --deploy-mode client ./SparkTutorial-1.0-SNAPSHOT.jar

  注意,我们指定了参数--master yarn ,而不是--master local. 这意味着我们希望SPark在分布式模式下运行,而不是在一台机器上运行,并且我们希望依赖SEARY(集群资源管理器)来获取可用的机器来运行作业。如果您不熟悉YARN,那么如果您想要在同一个集群上同时运行多个作业,则这一点尤为重要。如果配置正确,YARN队列将提供不同的用户或处理允许使用的群集资源配额。它还提供了允许作业在资源可用时充分利用集群的机制,以及在其他用户或作业开始提交作业时缩小现有作业的范围。

  参数--deploy-mode client  ,指示要将当前计算机用作Spark的驱动程序机器。驱动程序机器是一台启动Spark作业的机器,也是工作完成后收集汇总结果的地方。或者,我们可以指定 --deploy-mode cluster ,这将允许YARN选择驱动机。

  重要的是要注意的是,一个写得不好的SPark程序可能会意外地试图将许多兆字节的数据带回到驱动程序机器中,从而导致其崩溃。因此,不应该使用集群的主节点作为驱动程序机器。许多组织从所谓的边缘节点提交火花作业,这是一个单独的机器,不用于存储数据或执行计算。由于边缘节点与集群是分开的,所以它可以在不影响集群其余部分的情况下降。边缘节点还用于从集群中检索的聚合数据的数据科学工作。

  例如,数据科学家可能从边缘节点提交一份SPark作业,将10 TB数据集转换为1GB聚合数据集,然后使用R和Python等工具对边缘节点进行分析。如果计划设置边缘节点,请确保机器没有安装DataNode或HostManager组件,因为它们是集群的数据存储和计算组件。

五、现场调试

  将正在运行的SPark程序连接到调试器,这将允许我们设置断点并逐行遍历代码。在直接从IDE运行时,调试SPark就像其他程序一样,但是调试远程集群需要一些配置。

  在计划提交Spark作业的机器上,从终端运行这一行:

export SPARK_JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8086

  这将使您可以在端口8086上附加调试器。您需要确保端口8086能够接收入站连接。然后在IntelliJ中 Run > Edit Configurations:

  然后单击左上角的+按钮并添加一个新的远程配置。用主机IP地址填充主机,以及使用端口8086.

  

  如果在提交SPark作业后立即从IDE运行此调试配置,则调试器将附加,SPark将在断点处停止。

  注意:要重新提交单词计数代码,我们必须首先删除前面创建的目录。使用命令:

hdfs dfs -rm -r /tmp/shakespeareWordCount

  在沙箱外壳上删除旧目录。再次在沙箱外壳上提交火花作业,并在执行spark-submit命令。请记住,为了运行您的代码,我们使用了以下命令:

spark-submit --class "Hortonworks.SparkTutorial.Main" --master yarn --deploy-mode client ./SparkTutorial-1.0-SNAPSHOT.jar

Spark的Java开发环境构建的更多相关文章

  1. Spark 1.0 开发环境构建:maven/sbt/idea

    因为我原来对maven和sbt都不熟悉,因此使用两种方法都编译了一下.下面记录一下编译时候遇到的问题.然后介绍一下如果使用IntelliJ IDEA 13.1构建开发环境. 首先准备java环境和sc ...

  2. java开发环境构建

    一. 基本工具安装 1. 配置终端命令别名 vim ~/.bash_profile *********************************************** # for colo ...

  3. centos7之Java开发环境构建

    CensOS7环境 我个人的博客环境如下: 希望这个教程可以帮助到linux新手朋友们或者其他在安装软件时遇到问题的朋友们 当然了,百度上也有很多类似这样的教程,我个人贴出来,一来为分享,二来以后自己 ...

  4. centos7 Java开发环境构建

    原帖 https://www.cnblogs.com/youcong/p/9118753.html Java开发基本环境 1.jdk的安装 https://www.cnblogs.com/zenghu ...

  5. spark JAVA 开发环境搭建及远程调试

    spark JAVA 开发环境搭建及远程调试 以后要在项目中使用Spark 用户昵称文本做一下聚类分析,找出一些违规的昵称信息.以前折腾过Hadoop,于是看了下Spark官网的文档以及 github ...

  6. 04_Windows平台Spark开发环境构建

    Spark的开发环境,可以基于IDEA+Scala插件,最终将打包得到的jar文件放入Linux服务器上的Spark上运行 如果是Python的小伙伴,可以在Windows上部署spark+hadoo ...

  7. Unit01: JAVA开发环境案例

    Top JAVA Fundamental DAY01 JDK及Eclipse目录结构操作 JDK的安装及配置 控制台版的JAVA HelloWorld 使用Eclipse开发Java应用程序 1 JD ...

  8. 实验一 Java开发环境的熟悉

    实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没 ...

  9. 20145225《Java程序设计》实验一 Java开发环境的熟悉(Linux + Eclipse)

    20145225<Java程序设计> 实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑 ...

随机推荐

  1. Java 并发:学习Thread 类

    Java 中 Thread类 的各种操作与线程的生命周期密不可分,了解线程的生命周期有助于对Thread类中的各方法的理解.一般来说,线程从最初的创建到最终的消亡,要经历创建.就绪.运行.阻塞 和 消 ...

  2. CENTOS服务器基础教程-U盘系统盘制作

    什么都要用到一点点,会一点点,现在的USB3.0基本上服务器都已经支持.小编给大家介绍基础篇:如何使用U盘制作系统安装盘   工具/原料   U盘 UltraISO工具 方法/步骤     准备一个U ...

  3. 解决 java Could not resolve resource location pattern [classpath:sql/*.xml] 的问题

    时间过的真快,转眼间已经有2年了.2年里发生了太多的事,有些事依稀还记得,但更多的已经忘记.忘记了那些烦恼与忧愁,以为自己会快乐,才发现一切并不是以自己的意志为转移.终于在迷途中迷失了自己, 再也回不 ...

  4. 【故障公告】阿里云 RDS 数据库服务器 CPU 100% 造成全站故障

    非常非常抱歉,今晚 19:34 ~ 21:16 园子所使用的阿里云 RDS 数据库服务器突然出现 CPU 100% 问题,造成全站无法正常访问,由此您带来了很大的麻烦,请您谅解. 故障经过是这样的.1 ...

  5. NLP(十七) 利用DNN对Email分类

    数据集 scikit-learn中20个新闻组,总邮件18846,训练集11314,测试集7532,类别20 from sklearn.datasets import fetch_20newsgrou ...

  6. 学习笔记(一)-PyTorch在Windows环境搭建

    一.安装Anaconda 3.5 Anaconda是一个用于科学计算的Python发行版,支持Linux.Mac和Window系统,提供了包管理与环境管理的功能,可以很方便地解决Python并存.切换 ...

  7. CF 551 D.Serval and Rooted Tree 树形DP

    传送门:http://codeforces.com/contest/1153/problem/D 思路: 这道题想了一天,突发奇想,就是维护每个点两个值,第几大和第几小,就可以有传递性了. #incl ...

  8. CodeForces 311 B Cats Transport 斜率优化DP

    题目传送门 题意:现在有n座山峰,现在 i-1 与 i 座山峰有 di长的路,现在有m个宠物, 分别在hi座山峰,第ti秒之后可以被带走,现在有p个人,每个人会从1号山峰走到n号山峰,速度1m/s.现 ...

  9. Python 单元测试框架系列:聊聊 Python 的单元测试框架(一):unittest

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  10. 让docker中的mysql启动时自动执行sql

    在用docker创建mysql容器的时,有时候我们期望容器启动后数据库和表已经自动建好,初始化数据也已自动录入,也就是说容器启动后我们就能直接连上容器中的数据库,使用其中的数据了. 其实mysql的官 ...