Run App in Spark Cluster

今天终于在集群上测试了自己的毕业实验,遂将过程记录一下,以防后期用到。

整体步骤

- 在IntelliJ中打包程序,形成jar包

- 在集群master上submit程序运行

遇到的问题

上次集群环境是正常的,今天启动的时候,又遇到bug了,同样是ssh无密码访问问题。因为校园网动态ip的问题,关机重启之后,ip会有变化,所以之前在/etc/hosts 设置的ip地址需要更新,同时密钥需要重新生成。

解决方法:一不做二不休,将所有机器的~/.ssh下的所有文件删除,重新生成新的,按照之前配置集群相同的步骤执行。

但是过程中遇到了下面的问题:

1
Agent admitted failure to sign using the key

解决方法:在shell中执行ssh-add命令

第三个问题是:启动hadoop的时候,没有datanode;查看了hadoop日志,发现是因为namenode和datanode的不一致性引起的。
查看hadoop目录下的dfs/data/current/VERSION中的clusterIDdfs/name/current/VERSION中的clusterID 是否一致,确保一致即可。
重新启动hadoop就会发现datanode出现了。

步骤一:IntelliJ为应用打jar包

File –> Project Settings –> Artifacts –> Jar –> From module with Dependencies –> OK
可以将scala和hadoop的依赖文件去掉,降低包大小。

Build –> Build Artifact –> Build
会在out/artifact目录下生成.jar文件

步骤二:集群上运行

spark对于输入数据默认是从hdfs上读取,所以我们先将数据放到hdfs上。进入到hadoop安装目录下

1
2
3
4
5
6
7
8
9
10
11
# 新建文件夹放置输入数据
./bin/hadoop fs -mkdir input

# 新建文件夹放置输出结果
./bin/hadoop fs -mkdir output

# 上传文件到input文件夹中
./bin/hadoop fs -put ~/spark-app/**.txt input/

# 将结果下载到本地
./bin/hadoop fs -copyToLocal output/ LocalFile

调用submit命令执行代码,进入到spark安装目录

1
2
3
4
5
./bin/spark-submit \
--class AttributeReduction \ #打包的时候选择的主类
--master spark://master:7077 \ #采用standalone集群模式
~/spark-app/AttributeReduction.jar \ #jar所在位置
input/**.txt output/output_** #程序需要的参数

按回车运行,查看结果先将其从hdfs拷贝到本地。