大概从这部分开始,我们讨论的方式画风会变成 "show me your code"。天才第一步,雀氏纸尿裤,今天我们把基础的开发环境搭建起来,经历一把从编码干到集群跑起的过程。
spark核心部分是scala语言写的,本身的项目是sbt管理项目依赖的,很多同学对sbt感到陌生,但是maven肯定是熟悉,sbt是简化了maven的构建配置,所以我们是可以直接使用maven来构建的。
我这边选用的工具是官网提供的Scala IDE,下载地址:
http://scala-ide.org/download/sdk.html,另外我们打开连接之后可以看到有Jdk的要求(图一):
图一:jdk的要求
所以,我们继续准备jdk,从requirements点击去便是jdk的下载地址...省掉这部分,java程序开发基础必修。安装好之后我们打开建立项目,我这边已经建立了一个spark的项目,先看下效果,有个期待^^
图二:spark项目导入的样子
看到这个很多人肯定很熟悉,其实就是eclipse的东西嘛。再仔细看看,发现其实里面写着的是scala代码来着,这个就是我们要的效果,java那部分还是和原来一样,但是同时也支持scala代码的编写。
下面我们来构建这个工程,这个是一个普通的maven工程,maven里面最头痛的就是包的依赖。不知道用什么包,什么版本。其实官网里面给了很多例子项目,只不过是和其他源码一起的,我们需要把这部分抠出来,这块便构成了我们最最权威的spark工程。这个事情之前在讨论yarn的时候做过,这次把方法给出来。
我们把spark源码解压,可以看到里面有个example的示例项目,
图三:源码中的examples的例子
我们用记事本打开examples/pom.xml文件,可以看到里面的内容
图四:pom.xml文件结构
可以看到examples其实是作为一个 spark 的模块被构建的,我们再查看里面的依赖:
图五:spark中的依赖
看到了么,里面有些依赖给了版本,但是用的是变量的方式给的,有些依赖是直接就没有给版本,这部分是因为在parent上面定义过的,所以在子模块中直接就引用了。有两种办法,我们可以去parent中找到,复制过来添加上,完全可以,就是要有点耐心;我们用第二招,第二招是我们解析出这部分依赖,mvn dependency:tree命令可以帮我们把依赖解析成一颗文本树。我们在目录下面调出控制台命令,注意目录不要弄错了,使用命令进行解析,图六
图六:解析依赖树
解析完成之后,我们打开刚刚生成的dept文件,查看内容(图七),看到了么,项目的依赖已经完全输出在这颗树中。
图七:依赖树的内容
接下来,我们复制examples下面的pom.xml文件,到我们目录下面,去掉parent部分,注意要添加groupID和version信息,因为已经不继承parent中的内容了,修改我们的项目名,取个好听的名字
图八:复制并且修改
在我们的ide中导入maven项目
图九:导入项目
导入之后,我们看到一堆错误,这个事情我们意料之中,我们已经导出了对应包的各个版本,我们从dept里面把对应的版本信息加到依赖文件中。
图十:缺少依赖的情况,错误提示
重复使用比较多的,我们定义成变量,然后直接在依赖文件中引用,单独使用的,我们加到后面的version上面就可以了。
图十一:定义变量以便引用
图十二:重复使用的替换一下
图十三:其他依赖从dept文本中替换就好了
修改完成之后会提示需要更新,右键quick Fix
图十四:fix maven project
修复完成之后我们建立src/main/java和src/main/scala目录,这个作为我们的源码路径,分别写java代码和scala代码
图十五:建立源码路径
回到eclipse,我们刷新一下工程,终于有点样子了。scala默认没有变成源码目录,我们右键build path,然后use as source,再看看。
图十六:构造完成的样子
到这一步已经没有报错信息了,一般情况会有点小开心,但是事情还没完,我们试试写下我们的第一个程序,还是那个老梗,JavaWordCount,从源码中例子拿过来改改就好。我们复制代码,报错,提示也还算清晰,lambda表达式要在1.8以上,jdk不行
图十七:jdk版本不对的报错
我们按照提示把jdk版本换一下,buildpath,选择jre那部分,edit
图十八:jdk版本切换
然后切换成1.8的就ok了
图十九:完成切换
换了之后,错误不报了,我们回到程序,再次运行,发现新的报错:
图二十:新的错误
这个是因为在执行的spark有调用hadoop命令去解析目录名字,具体的调用来自hadoop的源码中获取winutils.exe的操作,我们依照提示,把这部分文件加入到环境变量中
图二十一:寻找winutil.exe的路径找不到代码逻辑
这部分包的来源来自于在Windows环境下面编译hadoop源码获取,我们自己不想编译就直接下载一个就好了(我这里编译过一次)。
图二十一:寻找winutil.exe的包
图二十二:bin中的文件
我们把这部分文件配置到环境变量里面去:
重启eclipse,运行我们的程序:
图二十三:WordCount程序
图二十四:运行的结果
程序是我修改了一些,然后可以在本地运行的情况,运行成功了,写在最后小总结一下:
- maven工程中的依赖我们是直接提取官网最新的配置和版本,这部分的空目录可以作为蓝本保存,以后可以用作新工程或者发给小伙伴,而且是官网指定权威权威版本。
- 组件的选取,直接从官网获取,例如jdk的版本,scala的版本
- 在一步一步的构建过程中,了解这些错误的原因很重要,否则会手足无措
- 程序的模式是直接从本地构造数据进而调试我们的程序,在以后开发中的模式都会这样,后续会不断去用这种模式去开发
好了,下面我们来研究一下我们写下的这个程序,然后部署到集群上去,待续~~