因为前段时间比赛用到spark,而实验室集群的spark版本还是1.6,带来了不少麻烦,于是便想着把集群的Hadoop和spark更新一下版本,另外,因为项目需要,再补装个storm,一边日后要用。

说句题外话。spark,storm,Hadoop三者取首字母是SSH,这让我想起以前做web开发,Struts2,spring,hibernate三个也是简称SSH,另外ssh还是linux之间一种主机连接的方式。

实验室集群由16台主机组成,这里将第一台主机作为主节点,剩余15台作为从节点。关于SSH免密码连接,管理集群的师兄只设置了主节点到15个从节点的免密码连接,从节点到主节点以及从节点之间都无法免密码连接。我觉得这是有问题的,毕竟当分布式存储的文件重分区的时候,是有从节点之间的通信的,另外,从节点肯定也需要向主节点传输信息。所以首先就先把SSH免密码连接给完善了。16台主机,除了自己跟自己连,也就是有16x15种连接,挺麻烦的,于是想写个脚本来自动执行,但是在执行完ssh命令后,就跳转到其他主机了,脚本也就暂停执行了,还是不行,于是只好就一个一个手敲了。

先说Hadoop吧,其实用的是Hadoop中的hdfs。以前弄过,这次弄又有了新的体会。记得刚开始学大数据时,只会对着博客敲配置文件,出了问题也不知道去看日志文件。Hadoop的配置文件主要就是core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、slave。其实其他博客中的很多配置都是可配可不配的,无关紧要的项不配置也不影响hdfs的启动。最后有一个关键的步骤hdfs namenode -format 。之后才能正常启动hdfs。对了,还有环境变量也要配置好。最后要说的是hdfs 的ui端口在3.0版本中从以前的50070变成了9870。挺好奇50070用着好好的,为什么要改成9870的。

然后装spark。spark其实和Hadoop的过程差不多。在spark-env.sh中要export好多变量,这使我想起之前1.6版本的集群的一个问题:当每个节点使用的内存大于5G时,spark就会报错。当时不知道为什么,现在想想可能是spark-env.sh中spark_worker_memory的值设的小了。

最后装一下storm,装storm前,要先装zookeeper。zookeeper要在配置文件中写各个主机的ip,主机太多写起来麻烦,我就想能不能用主机名来代替,毕竟hosts中有主机名和ip的对应关系。然后试了一下证明这么做是可以的。然后就拷贝到各个节点开始启动storm,当启动了5个节点时,我就迫不及待的查看各个节点的状态,看看是leader,还是follower。结果提示zookeeper可能没启动,于是查看日志文件,日志中报错道:与xxx.xxx.xxx.xxx的连接失败。这时我才意识到,应该先启动全部节点,再查看状态。启动了zookeeper后,修改写下storm的配置,然后启动storm 的nimbus、UI、supervisor。想通过浏览器查看storm的状态,发现storm和spark的ui都使用8080端口,因为先装的spark,我想storm可能是在8081上,试了一下,8081上没有。后来查了一下配置说明,ui.prot项可以改Ui端口,于是在配置中将ui.port手动设为8081。用浏览器打开8081,一切正常。

过了几个小时,当我再去查看8081端口时,发现storm已经停止了。于是去查看日志文件,发现日志里也显示storm停止了,但是没有报任何错误。这时想起来以前通过远程连接运行spark程序时,远程连接断开后,程序也就停止了。我启动storm也是用的远程连接,这两者应该是同一个道理吧。我跑到机房把storm再次启动,果然,这次storm就不会再自己停止了。