为开发和调试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. 马蜂窝视频编辑框架设计及在 iOS 端的业务实践

    (马蜂窝技术公众号原创内容,ID: mfwtech) 熟悉马蜂窝的朋友一定知道,点击马蜂窝 App 首页的发布按钮,会发现发布的内容已经被简化成「图文」或者「视频」. 长期以来,游记.问答.攻略等图文 ...

  2. Leetcode之深度优先搜索(DFS)专题-129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers)

    Leetcode之深度优先搜索(DFS)专题-129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers) 深度优先搜索的解题详细介绍,点击 给定一个二叉树,它的每个结点都存放 ...

  3. 【selenium】- 自动化框架环境搭建

    本文由小编根据慕课网视频亲自整理,转载请注明出处和作者. 1. 环境搭建 本课程选用的是selenium + java.   2. java环境的搭建 环境变量配置: 以win10为例,打开控制面板& ...

  4. CodeForces - 1150 D Three Religions

    题目传送门 题解: id[ i ][ j ] 代表的是在第j个位置之后的第i个字符的位置在哪里. dp[ i ][ j ][ k ] 代表的是 第一个串匹配到第i个位置, 第二个串匹配到第j个位置, ...

  5. lightoj 1068 - Investigation(数位dp)

    An integer is divisible by 3 if the sum of its digits is also divisible by 3. For example, 3702 is d ...

  6. codeforces 161 D. Distance in Tree(树形dp)

    题目链接:http://codeforces.com/problemset/problem/161/D 题意:给出一个树,问树上点到点的距离为k的一共有几个. 一道简单的树形dp,算是一个基础题. 设 ...

  7. CF989B A Tide of Riverscape 思维 第七题

    A Tide of Riverscape time limit per test 1 second memory limit per test 256 megabytes input standard ...

  8. Unity 3D,地形属性

    Terrain Width 地形高度 Terrain Height 地形宽度 Terrain Lenght 地形长度 HeughtMap Resolution  地形高度图的分辨率 Detail Re ...

  9. js 数组方法的作用,各方法是否改变原有的数组

    不会改变原来数组的有: concat()---连接两个或更多的数组,并返回结果. every()---检测数组元素的每个元素是否都符合条件. some()---检测数组元素中是否有元素符合指定条件. ...

  10. 【Redis】发布订阅

    一.概述 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 channel1 ...