如何一步一步地在Intellij IDEA使用Maven搭建spark开发环境,并基于scala编写简单的spark中wordcount实例。java
1.准备工做
首先须要在你电脑上安装jdk和scala以及开发工具Intellij IDEA,本文中使用的是win7系统,环境配置以下:mysql
jdk1.7.0_15
scala2.10.4git
scala官网下载地址:http://www.scala-lang.org/download/
若是是windows请下载msi安装包。github
这两个能够在官网上下载jdk和scala的安装包就能够直接双击安装包运行安装便可。注意:若是之后是在本地编写好spark代码而后上传到spark集群上去运行的话,请必定保持二者的开发环境一致,否则会出现不少错误。sql
Intellij IDEA
在官网上下载通常选择右下角的Community版本,下载地址https://www.jetbrains.com/idea/download/#section=windowsapache
2.在Intellij IDEA中安装scala插件
安装好Intellij IDEA并进入idea的主界面
(1)找到右下角的Configure选项中Plugins并打开
windows
(2)点击左下角Browse repositories…
数组
(3)在搜索框里搜scala,出现相对于的Scala插件,这里面个人已经安装完成了,没安装的会显示install的字样以及相对于的版本,这里面不建议在线安装插件,建议根据Updated 2014/12/18去下载离线的scala插件,好比本文中的IDEA Updated日期是2014/12/18而后找到对应的插件版本是1.2.1,下载便可。下面是scala插件的离线下载地址。
ruby
scala插件离线下载地址:https://plugins.jetbrains.com/plugin/1347-scala
而后根据Update日期去找Intellij IDEA对应得scala插件,不一样版本的IDEA对应的scala插件不同,请务必下载对应的scala插件不然没法识别。
markdown
(4)离线插件下载完成后,将离线scala插件经过以下方式加入到IDEA中去:点击Install plugin from disk…,而后找到你scala插件的zip文件的本机磁盘位置,点ok便可
到这里,在Intellij IDEA中安装scala插件的步骤已经所有完成。接下来用IDEA来构建一个Maven工程,用来搭建spark开发环境。
3.Intellij IDEA经过Maven搭建spark环境
(1)打开IDEA新建一个maven项目,以下图:
注意:按照我步骤顺序便可。
注意:若是是第一次利用maven构建scala开发spark环境的话,这里面的会有一个选择scala SDK和Module SDK的步骤,这里路径选择你安装scala时候的路径和jdk的路径就能够了。
(2)填写GroupId和ArtifactId这里我就随便写了个名字,以下图,点Next。
(3)第三步很重要,首先是你的Intellij IDEA里有Maven,通常的新版本都会自带maven,并且maven的目录在IDEA安装路径下plugins下就能找到,而后再Maven home directory地址中填写maven相对应的路径,本文中的IDEA版本比较老,是本身下的Maven安装上的(不会的能够百度下,很简单,建议使用新的IDEA,不须要本身下载maven)。而后这里面的User settings file是你maven路径下conf里面的settings.xml文件,勾选上override便可,这里面的Local repository路径能够不用修改,默认就好,你也能够新建一个目录。点击Next。
注意:截图的时候忘了,把Local repository前面的override也勾选上,否则构建完会报错,至少个人是这样。
(4)填写本身的项目名,随意便可。点击finish。
(5)到这里整个流程已经结束,完成后会显示以下界面:
右上角的import须要点击一下便可。
(6)接下来在pom.xml文件中加入spark环境所须要的一些依赖包。以代码的方式给出,方便复制。
这里是个人pom文件代码,请各位自行按照本身的须要删减或添加依赖包。
//注意这里面的版本必定要对应好,我这里的spark版本是1.6.0对应的scala是2.10,由于我是经过spark-core_${scala.version}是找spark依赖包的,前些日子有个同事按照这个去搭建,因为版本的不同最后spark依赖包加载老是失败。请你们自行检查本身的版本
<?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>com.xudong</groupId> <artifactId>xudong</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spark.version>1.6.0</spark.version> <scala.version>2.10</scala.version> <hadoop.version>2.6.0</hadoop.version> </properties> <dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_${scala.version}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_${scala.version}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_${scala.version}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming_${scala.version}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka_${scala.version}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-mllib_${scala.version}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> <!-- maven官方 http://repo1.maven.org/maven2/ 或 http://repo2.maven.org/maven2/ (延迟低一些) --> <repositories> <repository> <id>central</id> <name>Maven Repository Switchboard</name> <layout>default</layout> <url>http://repo2.maven.org/maven2</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <build> <sourceDirectory>src/main/scala</sourceDirectory> <testSourceDirectory>src/test/scala</testSourceDirectory> </build> </project>
这里要注意下几个小问题:
这里面会有src/main/scala和src/test/scala须要你本身在对应项目目录下构建这两个文件夹路径,若不构建会报错。
到这里,基于scala的一个spark开发环境就基本结束了。接下来,用scala编写一个spark的简单示例,wordcount程序,若是有的同窗编写过MapReduce必定会很熟悉。
若是不能建立scala文件则
仍是在Project Structure界面,操做以下。
而后咱们右键咱们添加的SDK选择Copy to Project Libraries...OK确认。如图
配置好后咱们就能够建立工程文件了。
4.Spark简单示例Wordcount
src/main/scala文件夹下,右键新建Package,输入package的名字,我这里是com.xudong而后新建Scala class, 而后输入名字将类型改成object,以下图:
补充:
若是一开始没有在项目中加入scala的SDK,这个时候,新建Scala class会发现没有这个选项,这个时候你新建一个File文件,而后名字随便取一个,后缀改为 .scala* ,点ok后文件中空白区会显示没有scala的SDK,这个时候你点击提示信息就能够添加本地的scala SDK(提早你的电脑上已经安装了scala,这个时候它会自动的去识别SDK),之后新建Scala class就有这个选项,直接新建便可。*
建立完而后编写wordcount代码,代码以下(并注释了相关的解释):
package com.xudong import org.apache.spark.mllib.linalg.{Matrices, Matrix} import org.apache.spark.{SparkContext, SparkConf} /** * Created by Administrator on 2017/4/20. * xudong */ object WordCountLocal { def main(args: Array[String]) { /** * SparkContext 的初始化须要一个SparkConf对象 * SparkConf包含了Spark集群的配置的各类参数 */ val conf=new SparkConf() .setMaster("local")//启动本地化计算 .setAppName("testRdd")//设置本程序名称 //Spark程序的编写都是从SparkContext开始的 val sc=new SparkContext(conf) //以上的语句等价与val sc=new SparkContext("local","testRdd") val data=sc.textFile("e://hello.txt")//读取本地文件 data.flatMap(_.split(" "))//下划线是占位符,flatMap是对行操做的方法,对读入的数据进行分割 .map((_,1))//将每一项转换为key-value,数据是key,value是1 .reduceByKey(_+_)//将具备相同key的项相加合并成一个 .collect()//将分布式的RDD返回一个单机的scala array,在这个数组上运用scala的函数操做,并返回结果到驱动程序 .foreach(println)//循环打印 } }
建立数据集hello.txt测试文档以下:
启动本地spark程序,而后输出结果,能够在控制台查看结果:
若是能正确的打印出结果,说明spark示例运行成功。
到这里,Intellij IDEA使用Maven构建spark开发环境已经彻底结束,若是有疑问或者本文档有什么错误,请指出,不甚感激。
spark 远程调试./hdfs dfs -chmod -R 755 /tmp
或者
在 hdfs-site.xml 总添加参数:
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
改完后记得重启HDFS
null\bin\winutils.exe,这个错误很简单,是由于本win7压根就没装hadoop系统,解决办法是从集群上复制一份过来,放到F盘,而且配置好环境变量
HADOOP_HOME=F:\hadoop-2.6.0 Path=%HADOOP_HOME%\bin
接下来下载对应的版本的winutils放到 F:\hadoop-2.6.0\bin 文件夹下,应该就解决了
下载地址:https://github.com/steveloughran/winutils
问题以下:
java.lang.ClassNotFoundException: com.csu.basemods.Program
个人出错缘由是:打包jar时,将本地的Spark、Scala等library也添加进了jar里,可能会致使jar默认使用jar包里的library。使得Spark集群的运行环境识别不到本身写的代码类,运行出错。
1.解决方法其实就是在打包jar时,去除集群环境中已有的library,如Spark、Scala等,只保留项目代码和其它本身额外添加的jar包,就能够了。
由于咱们只是在Spark上运行的,因此咱们要删除下图红框里多余的部分,保留WordCount.jar以及‘WordCount’ compile output。小提示,这里能够利用Ctrl+A全选功能,选中所有选项,而后,配合Crtl+鼠标左键进行反选,也就是按住Ctrl键的同时用鼠标左键分别点击WordCount.jar和‘WordCount’ compile output,从而不选中这两项,最后,点击页面中的删除按钮(是一个减号图标),这样就把其余选项都删除,只保留了WordCount.jar以及‘WordCount’ compile output。
2.File=>Project Structure=>Modules 将该类所在的包设置为Sources