实验室项目需要用到HDFS,因此需要搞个单机版的hadoop做测试。重装系统的时候,我又作死地把虚拟机 搞坏了,快照识别不了了,因此又要装一遍,这次就记录下来吧。

首先配置一下虚拟机

1.下载hadoop及JDK8

首先,从宿主机下载hadoop以及JDK8,将其传到虚拟机中

yieldnull@inspiron$ scp Engineer/hadoop-2.7.2.tar.gz yieldnull@hadoop:/home/yieldnull/
yieldnull@inspiron$ scp Engineer/jdk-8u101-linux-x64.tar.gz yieldnull@hadoop:/home/yieldnull

登陆虚拟机,解压上述文件,并将其移动到/opt目录下,更改ownerroot:root。创建hadoop的配置文件目录的符号链接/etc/hadoop

yieldnull@hadoop$ tar xvzf hadoop-2.7.2.tar.gz
yieldnull@hadoop$ tar xvzf jdk-8u101-linux-x64.tar.gz
yieldnull@hadoop$ sudo mv hadoop-2.7.2 /opt
yieldnull@hadoop$ sudo mv jdk1.8.0_101 /opt/
yieldnull@hadoop$ sudo chown root:root -R /opt/hadoop-2.7.2/
yieldnull@hadoop$ sudo chown root:root -R /opt/jdk1.8.0_101/
yieldnull@hadoop$ sudo ln -s /opt/hadoop-2.7.2/etc/hadoop /etc/hadoop

2.创建hadoop用户

创建一个新用户,用来运行hadoop.

yieldnull@hadoop$ sudo adduser hadoop

3.配置 hadoop

3.1更改配置项

然后,删除所有windows下需要的文件。这些东西没啥用,bash提示文件时免去了很多烦恼。

yieldnull@hadoop$ sudo rm /opt/hadoop-2.7.2/bin/*.cmd
yieldnull@hadoop$ sudo rm /opt/hadoop-2.7.2/sbin/*.cmd
yieldnull@hadoop$ sudo rm /etc/hadoop/*.cmd

3.1.1 hadoop-env.sh

然后,配置hadoop。编辑/etc/hadoop/hadoop-env.sh。更改下面的配置项为:

export JAVA_HOME=/opt/jdk1.8.0_101/
export HADOOP_LOG_DIR=/var/log/hadoop

3.1.2 core-site.xml

默认值见hadoop-common/core-default.xml

编辑 /etc/hadoop/core-site.xml,如下

<configuration>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/srv/hadoop</value>
        </property>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://master:9000</value>
        </property>
</configuration>

3.1.3 hdfs-site.xml

默认值见hadoop-hdfs/hdfs-default.xml

<configuration>
        <property>
             <name>dfs.replication</name>
             <value>1</value>
        </property>
</configuration>

3.2 创建需要的文件夹

上面的配置中,有些文件夹需要创建,并更改权限

yieldnull@hadoop$ sudo mkdir /srv/hadoop
yieldnull@hadoop$ sudo chown hadoop:hadoop -R /srv/hadoop
yieldnull@hadoop$ sudo mkdir /var/log/hadoop
yieldnull@hadoop$ sudo chown hadoop:hadoop -R /var/log/hadoop

3.3 更改 hosts

上述core-site.xml配置中,master 为虚拟机的ip地址,例如192.168.56.101。在/etc/hosts文件中加入192.168.56.101 master

为什么要将Hadoop IPCHost设置为虚拟机的IP呢? 因为设成localhost,则宿主机访问不了;

java.net.ConnectException: Call From Inspiron/127.0.1.1 to hadoop:9000 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused

设成0.0.0.0则在HDFS中创建文件时会出现如下错误:

org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /app could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and 1 node(s) are excluded in this operation.

4.启动HDFS

下面的命令使用用户hadoop执行

4.1 将hadoop的执行文件加入PATH

~/.bashrc中加入

export HADOOP_HOME=/opt/hadoop-2.7.2
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

然后source ~/.bashrc

4.2 格式化NameNode

hadoop@hadoop$ hdfs namenode -format

4.3 配置SSH密钥

启动hadoop时,会使用hadoop@localhost,hadoop@master,hadoop@0.0.0.0这三个用户来进行SSH登陆。(我也不知道为什么,使用过程中就是这样)

因此,要配置SSH-Server保证免密登陆。

hadoop@hadoop$ ssh-keygen -P '' -f ~/.ssh/hadoop
hadoop@hadoop$ cat ~/.ssh/hadoop.pub >> ~/.ssh/authorized_keys
hadoop@hadoop$ chmod 0600 ~/.ssh/authorized_keys

然后创建~/.ssh/config,内容如下

Host master
    User hadoop
    IdentityFile ~/.ssh/hadoop

Host localhost
    User hadoop
    IdentityFile ~/.ssh/hadoop

Host 0.0.0.0
    User hadoop
    IdentityFile ~/.ssh/hadoop

4.4 启动HDFS

start-dfs.sh

启动过程中会有提示讲host加入konwn_hosts中,键入yes即可。

在宿主机中访问http://hadoop:50070/,即可查看HDFS状态。hadoop为虚拟机hostname

4.5 设置开机自启

/etc/rc.local文件中加入

su hadoop -c "/opt/hadoop-2.7.2/sbin/start-dfs.sh >/dev/null 2>&1 &"