背景
近日在看Hadoop相关内容,由于是入门,遇到一些问题,现记录如下.
软件环境:使用腾讯云服务器,操作系统为centos 7.4 64位.
Java打包问题
打包方式
由于Hadoop并不支持windows操作系统,因此学习思路是在windows上将代码打为jar包,上传至centos云服务器进行运行.打包方式有如下两种:
- 使用idea原生打包方式
- 使用Maven插件
Java运行时指定Main-Class
Java执行jar包的命令为java -jar [jar包路径]
,但是使用上述命令执行jar包要求在META-INF/MANIFEST.MF
中指明Main-Class
,无法在运行时确定Main-Class,使用java -cp [jar包路径] [main-class]
可以在运行时指定Main-Class
SSH问题
在执行./sbin/start-dfs.sh
时结果如下:
根据提示信息可以看出是由于权限被拒绝导致.其实是因为Hadoop各个节点之间通过SSH登录,但是现在无法使用SSH登录,因此导致此问题.而之所以无法使用SSH登录,是因为我是使用root
账户登录,而linux的默认配置是不允许root
账户使用SSH登录,因此将此配置项修改即可.
- 打开
/etc/ssh/sshd_config
,将PermitRootLogin without-password
修改为PermitRootLogin yes
- 使用
systemctl restart sshd.service
重启sshd服务
但修改配置后执行ssh localhost
仍然拒绝登录,如下:
在这个地方我卡了很久,因为以上的内容都可以在网上找到资料,执行上述步骤后一般都已解决问题.刚好学习过网络安全方面的内容,对ssh使用的非对称加密有些了解,此时我便使用自己购买的另一台阿里云服务器,在阿里云服务器上使用ssh登录腾讯云服务器,终于发现了问题所在.
在腾讯云服务器重装系统时有两种选项登录
- 使用账户密码登录
- 使用ssh登录
我的腾讯云服务器选择的是ssh登录,因此我的root账户是没有密码的,而ssh localhost
默认使用密码登录,这就产生了冲突,因此失败.
如果把尝试登录的计算机称为客户端,把被登录的计算机称为服务端,那么ssh登录需要生成一对非对称密钥,将私钥放在客户端,将公钥放在服务端,而ssh localhost
的客户端和服务端都是本机.解决方法如下:
- 使用
ssh-keygen
生成一对非对称密钥,默认情况私钥为id_rsa,公钥为id_rsa.pub,若将本机看做客户端,私钥无需更改位置即可使用 - 若将本机看做服务端,要将上步生成的公钥放入服务端的authorized_keys中,执行
cat id_rsa.pub >> authorized_keys
即可
注:生成的密钥在/root/.ssh
目录下,执行cat id_rsa.pub >> authorized_keys
的当前目录也是/root/.ssh
此时再执行ssh localhost
即可成功登陆.
总结
- 使用idea打jar包有两种方式,一为使用idea原始方法,一为使用maven插件
- 执行jar包有
java -jar
和java -cp
两种方式,其中java -cp
可以在运行时指定Main-Class
- root账户ssh登陆localhost除了修改
/etc/ssh/sshd_config
的PermitRootLogin yes
之外,若root账户无密码,则必须配置非对称密钥进行登录.