为开发和调试SPark应用程序设置的完整的开发环境。这里,咱们将使用Java,其实SPark还支持使用Scala, Python和R。咱们将使用IntelliJ做为IDE,由于咱们对于eclipse再熟悉不过了,这里就使用IntelliJ进行练练手,因此咱们也将使用Maven做为构建的管理器。在本篇结束时,您将了解如何设置IntelliJ,如何使用Maven管理依赖项,如何将SPark应用程序打包并部署到集群中,以及如何将活动程序链接到调试器。java
(注意:指令可能因操做系统而异。在本教程中,咱们将使用IntelliJ版本:2018.2.1上的MAC OSX High Sierra. )node
经过选择File > New > Project: ,再选择 Maven > 单击Nextapache
将项目命名以下:api
Hortonworks
SparkTutorial
1.0-SNAPSHOT
而后单击下一个继续。eclipse
最后,选择项目名称和位置。这些字段应该是自动填充的,因此让咱们保持默认值便可:ssh
IntelliJ应该建立一个具备默认目录结构的新项目。生成全部文件夹可能须要一两分钟。socket
让咱们分解一下项目结构。maven
在继续以前,让咱们验证几个IntelliJ设置:分布式
1.核实import Maven projects automatically是ON.ide
2.核实Project SDK和Project language level设置为Java版本:
3.核实Language level 设置为Java版本:
在开始编写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>
保存文件后,IntelliJ将自动导入运行SPark所需的库和文档。
对于咱们的第一个应用程序,咱们将构建一个简单的程序,进行单词计数。Download the file,将文件保存为shakespeare.txt.
稍后,咱们但愿SPark从HDFS(HadoopDistributedFileSystem)检索这个文件,因此如今让咱们把它放在那里。要上传到HDFS,首先要确保咱们的Ambari 沙箱已经启动并运行。
如今咱们已经准备好建立应用程序了。在IDE中打开文件夹src/main/resources,这应该是自动为您生成的。
接下来,选择文件夹SRC/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。
虽然咱们仍然在一台机器上运行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