Linux配置Hadoop环境相关问题解决记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37422289/article/details/80888852

系统环境

Windows Subsystem for Linux(WSL) Ubuntu 16.04.4 LTS

hadoop 版本:

Hadoop 3.0.3

安装教程:

Hadoop环境安装设置

问题1

新建hadoop用户,使用sudo命令出现”user is not in sudoers file”的错误.

解决方法:

在root用户下执行指令visudo 修改 /etc/sudoers 文件,在
root ALL=(ALL:ALL) ALL下补充一行
hadoop ALL=(ALL:ALL) ALL

问题2

ssh相关.在设置ssh处花了一些时间

ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

操作说明:
1) rsa为非对称加密,生成一对私钥和公钥id_rsa 和 id_rsa.pub. 要实现ssh免密码登录,就要先把id_rsa.pub放在远程服务器上,并加入到远程服务器的authorized_keys 列表当中.
2) 因为我们要进程ssh localhost连接本地的测试,所以要把自己的公钥以追加的方式加入到自己的authorized_keys.因此,如果是第一次操作ssh,.ssh文件下应该为空,使用

cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

直接复制一下文件也可以达到同样效果.

问题3

key_load_public: invalid format

解决方法: 彻底删除.ssh文件夹下的所有文件,再重新执行ssh-keygen -t rsa,过程中一切都按enter,以默认方式即可.

问题4

以上公钥配置完成后,执行ssh localhost之后直接提示仍要输入密码.

解决方法:

  1. 执行ps -e | grep ssh 查看ssh进程与sshd守护进程的状态.
    1) ssh-agent以发起链接的进程;
    2) sshd为接收ssh链接的进程.
    两个都应该在运行状态.否则先运行.

  2. 文件夹操作权限的问题.在目标目录下执行ls -a -l查看所有文件的权限.过程当中遇到权限有关的问题都要常用该指令,配合chmod和chown来改变文件权限.

  3. 因为我们使用一个hadoop用户来处理一切操作,因此要确保从根目录开始到目标文件的权限都符合要求.

  4. .ssh目录权限是700(drwx——), 两个dsa 和 rsa的 私钥权限是600(-rw——-),其余文件权限是644(-rw-r–r–)
  5. ssh的父目录的权限问题(我的问题就出现在这里):.ssh的父目录文件权限应该是755(drwxr-xr-x),即所属用户的用户文件.

上面操作都没有问题的话,ssh local执行正常免输入密码,即为正确配置ssh.

问题5

环境变量相关:

安装过程当中,~/.bashrc文件被我改了无数遍.
直接贴出我的配置:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_INSTALL=$HADOOP_HOME

备注:
JAVA_HOME 差异较大,视乎你安装JAVA的位置.通常是在java文件夹中bin,docs,jre三个文件夹都存在的地方.
默认你已经安装了java,执行whereis java可以看到.

相关知识:
~/.bashrc是属于用户设置的环境变量;
/etc/profile是属于所有用户的环境变量.
每次开机都会先加载后者,再加载前者.如果不想频繁重启,每次修改完应该执行

source ~/.bashrc或者/etc/profile

关于$PATH变量,后执行的bashrc会覆盖前者.因此使用语法:

export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

linux以冒号作为分隔符.以上语句的作用为在原来的$PATH中再追加环境变量.

问题6

如果source之后执行常见命令如ls,cd,sudo报错:

The command could not be located because '/usr/bin' is not included

多半是原有的$PATH忘了添加.

问题7

执行hadoop命令后,出现warning:

Unable to load native-hadoop library for your platform

解决方法:

确保配置文件中两项

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"

问题8

已经配置好用户环境变量文件 ~/.bashrc 或系统环境变量文件/etc/profile后,执行hadoop version测试,依然报错JAVA_HOME

JAVA_HOME is not set and could not be found

而在本地上执行$JAVA_HOME可以正确打印JAVA的位置.

解决方法:

在hadoop-env.sh文件当中(我的该文件位于/usr/local/hadoop/etc/hadoop也就是$HADOOP_HOME/etc/hadoop当中),再次声明JAVA_HOME变量:

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64

作用是让hadoop每次启动都确保添加JAVA_HOME变量.

问题9

运行hadoop version正常之后,
执行以下命令来实现伪分布式配置

hdfs namenode -format

start-hdfs.sh
start-yarn.sh

可以通过local:8088来访问所有应用程序的集群,但是没法访问localhost:50070查看hadoop状态.

解决方法:

在hdfs-site.xml当中添加节点

<property>
  <name>dfs.http.address</name>
  <value>0.0.0.0:50070</value>
</property>

再执行

stop-hdfs.sh
stop-yarn.sh
hdfs namenode -format

start-hdfs.sh
start-yarn.sh

重新启动hadoop即可.

经验总结:
1) 遇到问题多考虑文件权限,思考读写过程.特别是没有报错信息的异常.(如ssh提示输入密码)常常是因为权限问题.
2) 考虑环境配置问题,路径正确,且确保使用source正确执行了配置文件.

猜你喜欢

转载自blog.csdn.net/m0_37422289/article/details/80888852