本文是对我使用Hadoop 2.x在CentOS 6.9 32位和Windows 10下的伪分布式部署的记录,使用的Java版本是jdk-7u80。因为时间跨度大,本文是我的一系列文章,我直接或间接的引用了多篇网络文章的解决办法,用于解决本文实践中遇到的问题,时间过于仓促,并没有完全标明引用地址,再次表示感谢。我自己也是作为一个使用者。

2020年2月16日对文章的截图进行了修改。

1. Linux环境

1.1. 配置防火墙

如果是测试环境最好是能够关闭防火墙,如果对安全有一定的简单的要求可以打开防火墙,放行相应的端口,具体放行的端口需要查阅手册或者手动修改端口(太麻烦)。我这里只是建立了测试环境,所以就直接关闭防火墙。如果是阿里云,腾讯云等云服务器,请自行放开安全组。如果是CentOS7或者其他发行版,按照安装的为准。
使用service iptables status查看当前主机的防火墙状态。

[root@vmcentos sbin]# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

使用service iptables stop暂时关闭防火墙。使用chkconfig iptables off关闭防火墙开机启动。

[root@vmcentos sbin]# service iptables stop
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
[root@vmcentos sbin]# chkconfig iptables off

如需查看防火墙开机启动状态则使用chkconfig iptables --list

1.2. 配置Hostname和Hosts

Haoop使用Hostname进行连接,于是我们需要修改本机的Hostname。可以参考:

CentOS(6、7)修改主机名(hostname)

在这里我使用的是CentOS6,如果你使用的是7,那么可以使用更加便捷的hostnamectl。你可以使用hostname+主机名的方式来进行修改,只不过这只是临时修改,重启以后会失效。

hostname cyqsd

要进行永久修改,则需要编辑vim /etc/sysconfig/network,我使用的腾讯云的服务器,下面的我的默认hostname,按照实际情况进行修改:

NETWORKING=yes
HOSTNAME=vmcentos

20200212233546428_31117.webp

我修改为了vmcentos,小写字母+数字比较友善。光修改这一处会导致出错,还需要修改hosts文件。

vim /etc/hosts

原机的hosts文件是这样的:

    127.0.0.1 VM_182_71_centos VM_182_71_centos
    127.0.0.1 localhost.localdomain localhost
    127.0.0.1 localhost4.localdomain4 localhost4

    ::1 VM_182_71_centos VM_182_71_centos
    ::1 localhost.localdomain localhost
    ::1 localhost6.localdomain6 localhost6

hosts文件配置不当会造成后面运行的各种问题,如:localhost: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

192.168.123.15为假设的内网IP,可以这样修改:

0.0.0.0 VMcentos VMcentos
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4
192.168.123.15   VMcentos

::1 VMcentos VMcentos
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6

我推荐这样修改:

127.0.0.1       localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.123.15      vmcentos

如果你只是在本地搭建了虚拟机,或者自建了服务器,IP就填写局域网IP。如果你是在云服务器上搭建的服务器,IP填写内网IP,不要填写公网IP。修改完成后推荐重新启动服务器,看是否生效。

1.3. 配置SSH

如果你使用的是密码进行登录,那么在接下来运行Hadoop时会老提示输入密码,所以在这里最好是使用密钥进行登录。设置的方法网上非常的多,只是当在一些云平台重装服务器时选择了,使用密钥登录服务器,要将公钥拷贝到要使用(免登陆密码)的机器上。
主要操作步骤就是:你的用户名的home目录->cd ~/.ssh

#生成公钥和私钥
ssh-keygen -t rsa

执行完成后,在该目录,会生成两个文件,分别是id_rsa(私钥)、id_rsa.pub(公钥),还需用下面的命令复制一份到本地。

ssh-copy-id localhost

类似于这个,连接权限被拒绝。
localhost: Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

主要就是id_rsa,得在服务器也保存一份。

authorized_keys  id_rsa  known_hosts

20200212232041119_17243.webp

使用puttygen.exe对私钥转换后可以用于WinSCP连接。

虚拟机安装的可能需要设置sshd为开机启动

chkconfig --list sshd

20200213013142549_9595.webp

chkconfig sshd on

附表配置参数,方便查阅:

参数作用
Port 22默认的sshd服务端口
ListenAddress 0.0.0.0设定sshd服务器监听的IP地址
Protocol 2SSH协议的版本号
HostKey /tc/ssh/ssh\_host\_keySSH协议版本为1时,DES私钥存放的位置
HostKey /etc/ssh/ssh\_host\_rsa_keySSH协议版本为2时,RSA私钥存放的位置
HostKey /etc/ssh/ssh\_host\_dsa_keySSH协议版本为2时,DSA私钥存放的位置
PermitRootLogin yes/no设定是否允许root管理员直接登录
StrictModes yes当远程用户的私钥改变时直接拒绝连接
MaxAuthTries 6最大密码尝试次数
MaxSessions 10最大终端数
PasswordAuthentication yes/no是否允许密码验证
PermitEmptyPasswords yes/no是否允许空密码登录(很不安全)

1.4. 配置Java环境

要说现在配置个环境早已经不是啥稀罕事了,距离上一次写如何配置java环境:windows xp下java环境变量配置方法,时间已经过去了7年了。

我这里使用的JDK为:jdk-7u80-linux-i586.tar.gz,也就是JDK1.7。官网现在提供的最低都是1.8了,1.7归档了,但是依旧可以下载:Java SE 7 Archive Downloads

我将目录放到/usr/java中,这个可以自己设置,首先使用mkdir /usr/java创建文件夹。

#解压到/usr/java
tar -zxvf jdk-7u80-linux-i586.tar.gz -C /usr/java/

配置将java添加到环境变量中:

vi /etc/profile

20200213080006965_4651.webp

在配置文件的末尾,加入:

export JAVA_HOME=/usr/java/jdk1.7.0_80
export PATH=$PATH:$JAVA_HOME/bin

到这里保存了就完事了。但是Hadoop也需要配置,我们可以一并操作了,如果还没有解压Hadoop,可以接着往下看,然后返回这里。

20200213012912768_2785.webp

改为:

export JAVA_HOME=/usr/java/jdk1.7.0_80
export HADOOP_HOME=/itcast/hadoop-2.4.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

保存后,使用source /etc/profile使之生效。
使用java -version,查看。

20200213080025279_14682.webp

1.5. 配置hadoop配置文件

首先解压Hadoop:

tar -zxvf hadoop-2.4.1.tar.gz -C /

我为了方便解压到了根目录。然后进入hadoop的目录\etc\hadoop,配置下面加粗的文件。

core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://vmcentos:9000</value>
    </property>
    <!-- tmp缓存目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/hadoop-2.4.1/tmp</value>
    </property>
</configuration>

hdfs-site.xml

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

yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>vmcentos</value>
        </property>
        <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
        </property>
</configuration>

mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
        </property>
</configuration>

hadoop-env.sh

# 2. The java implementation to use.
export JAVA_HOME=/usr/java/jdk1.7.0_80

20200213080118795_6842.webp

上面的操作都完成了以后需要初始化(格式化)namenode

hdfs namenode -format (hadoop namenode -format)

1.6. 配置的其他问题

前面的操作已经可以解决绝大多数的问题,有一些其他问题可以探究一下。没有兴趣的可以跳过本小节。
腾讯云安装Hadoop遇到的问题中提到了类似的问题。

使用netstat -tpnl命令查看当前端口的状态。

20200212045546706_22663.webp

我在网上的一些博客上看见一些说法就是不要将主机名映射到127.0.0.1,这样会导致127.0.0.1:9000,9000端口不侦听到0.0.0.0,只侦听本地的127.0.0.1,这会导致公网无法访问,我的确遇到了。

这时候一切都是正常的,但是通过50070上的explorer.html,对文件进行下载时就会不正常。使用netstat -tpnl命令查看当前端口50070也是直接监听的0.0.0.0,没有问题。
通过50075上的dataNodeHome.jsp->Configuration查看配置。
这个是由hdfs-default.xml中的dfs.datanode.http.address0.0.0.0:50075
于是乎下载的地址就是:

http://vmcentos:50075/webhdfs/v1/logo.svg?op=OPEN&namenoderpcaddress=VMcentos:9000&offset=0

发现地址是走的http://vmcentos:50075/,就是hostname,如果你是在本地那么就是正常的,但是部署在远程的服务器上,将前一个vmcentos修改为你的公网IP也可以解决问题。

你可以修改本地的开发机,将hosts映射。如果在这里一步,地址是http://0.0.0.0:50075/webhdfs,则前面的配置中还是推荐使用hostname。

还有就是core-site.xmlfs.defaultFS的值可根据具体服务器情况,修改为内网IP。

<property>
    <name>fs.defaultFS</name>
    <value>hdfs://192.168.123.155:9000</value>
</property>

不然在Eclipse中连接时会报错。

Exception in thread "main" java.net.ConnectException: Call From DESKTOP-47RU81S/    192.168.123.29 to XXXXXXX:9000 failed on connection exception: java.net.ConnectException: Connection refused: no further information; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

2. 运行Hadoop

Linux还需要启动Hadoop,进入hadoop的目录\sbin,执行start-all.sh启动或者stop-all.sh关闭。
不过这样的命令并不被推荐,应使用下面的,应该先启动HDFS,再启动YARN,注意顺序。

#启动HDFS
sbin/start-dfs.sh

#启动YARN
sbin/start-yarn.sh

如果提示密码则返回上面的环境配置。

通过jps来查看运行情况。

[root@182centos sbin]# jps
10667 ResourceManager
6725 SecondaryNameNode
24125 Jps
6456 NameNode
6576 DataNode
10762 NodeManager

20200114205033.webp

确认都正常启动了以后,则可以进入管理界面:

http://IP:50070 (HDFS管理界面)
http://IP:8088 (MR管理界面)

20200114205010.webp

20200114205014.webp

20200114213518.webp

20200115000814.webp

20200114203608.webp

20200114203612.webp

3. Windows配置

如果你只是为了方便测试,无需考虑其他过多的要素,那可以直接在Windows上面配置并运行。这样对初学者更加直观,正式部署的时候还是不推荐。
Windows7-8-10安装部署hadoop-2.7.5(最详细的步骤,不需要cygwin)
windows下搭建hadoop 搭建本地hadoop开发环境

core-site.xml

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/D:/hadoop/workplace/tmp</value>
    </property>
    <property>
        <name>dfs.name.dir</name>
        <value>/D:/hadoop/workplace/name</value>
    </property>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

yarn-site.xml

<configuration>
<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
</configuration>

hdfs-site.xml

<configuration>
    <!-- 单机hadoop -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.data.dir</name>
        <value>/D:/hadoop/workplace/data</value>
    </property>
</configuration>

mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
         <name>mapred.job.tracker</name>
         <value>hdfs://localhost:9001</value>
    </property>
</configuration>

httpfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/hadoop/data/dfs/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/hadoop/data/dfs/datanode</value>
    </property>
</configuration>

hadoop-env.cmd

set JAVA_HOME=C:\PROGRA~1\Java\jre7

这里的目录问题,如果你和我一样,是将JDK安装到了Program Files目录下,则应该使用PROGRA~1来替换这个路径。

20200214113355385_1699.webp

除了上面的修改,还应该要有winutils.exe,特别是你需要从本机连接Hadoop,没有的话会提示下面的错误。

 java.io.IOException: Could not locate executable null/bin/winutils.exe in the Hadoop binaries.

解Windows系统下运行hadoop、spark程序出错Could not locate executablenull\bin\winutils.exe in the Hadoop binaries

hadoop2.2:https://github.com/srccodes/hadoop-common-2.2.0-bin

hadoop2.6:https://github.com/amihalik/hadoop-common-2.6.0-bin

public static final String getHadoopHome() throws IOException {
    if (HADOOP_HOME_DIR == null) {
        throw new IOException("Misconfigured HADOOP_HOME cannot be referenced.");
    } else {
        return HADOOP_HOME_DIR;
    }
}

于此同时配置Java环境。下面是winutils.exe路径判断的源码。

public static final String getQualifiedBinPath(String executable) throws IOException {
    String fullExeName = HADOOP_HOME_DIR + File.separator + "bin" + File.separator + executable;
    File exeFile = new File(fullExeName);
    if (!exeFile.exists()) {
        throw new IOException("Could not locate executable " + fullExeName + " in the Hadoop binaries.");
    } else {
        return exeFile.getCanonicalPath();
    }
}


public static final String getWinUtilsPath() {
    String winUtilsPath = null;

    try {
        if (WINDOWS) {
            winUtilsPath = getQualifiedBinPath("winutils.exe");
        }
    } catch (IOException var2) {
        LOG.error("Failed to locate the winutils binary in the hadoop binary path", var2);
    }

    return winUtilsPath;
}

可以看到路径是HADOOP_HOME_DIR + File.separator + "bin" + File.separator + executable这样拼接来的。所以不要直接把Path配置到hadoop下的bin。
应该先配置你的HADOOP_HOME到Hadoop的根目录。

20200217054713573_3737.webp

在Path配置到hadoop下的bin。

20200217054738948_25713.webp

格式化时输出的部分日志如下:

************************************************************/
20/02/14 11:26:56 INFO namenode.NameNode: createNameNode [-format]
Formatting using clusterid: CID-40b53e07-1b3c-427d-acd2-d937ed42e85f
20/02/14 11:26:58 INFO namenode.FSNamesystem: fsLock is fair:true
20/02/14 11:26:58 INFO namenode.HostFileManager: read includes:
HostSet(
)
20/02/14 11:26:58 INFO namenode.HostFileManager: read excludes:
HostSet(
)
20/02/14 11:26:58 INFO blockmanagement.DatanodeManager: dfs.block.invalidate.limit=1000
20/02/14 11:26:58 INFO blockmanagement.DatanodeManager: dfs.namenode.datanode.registration.ip-hostname-check=true
20/02/14 11:26:58 INFO util.GSet: Computing capacity for map BlocksMap
20/02/14 11:26:58 INFO util.GSet: VM type       = 64-bit
20/02/14 11:26:58 INFO util.GSet: 2.0% max memory 889 MB = 17.8 MB
20/02/14 11:26:58 INFO util.GSet: capacity      = 2^21 = 2097152 entries
20/02/14 11:26:58 INFO blockmanagement.BlockManager: dfs.block.access.token.enable=false
20/02/14 11:26:58 INFO blockmanagement.BlockManager: defaultReplication         = 1
20/02/14 11:26:58 INFO blockmanagement.BlockManager: maxReplication             = 512
20/02/14 11:26:58 INFO blockmanagement.BlockManager: minReplication             = 1
20/02/14 11:26:58 INFO blockmanagement.BlockManager: maxReplicationStreams      = 2
20/02/14 11:26:58 INFO blockmanagement.BlockManager: shouldCheckForEnoughRacks  = false
20/02/14 11:26:58 INFO blockmanagement.BlockManager: replicationRecheckInterval = 3000
20/02/14 11:26:58 INFO blockmanagement.BlockManager: encryptDataTransfer        = false
20/02/14 11:26:58 INFO blockmanagement.BlockManager: maxNumBlocksToLog          = 1000
20/02/14 11:26:58 INFO namenode.FSNamesystem: fsOwner             = Administrator (auth:SIMPLE)
20/02/14 11:26:58 INFO namenode.FSNamesystem: supergroup          = supergroup
20/02/14 11:26:58 INFO namenode.FSNamesystem: isPermissionEnabled = true
20/02/14 11:26:58 INFO namenode.FSNamesystem: HA Enabled: false
20/02/14 11:26:58 INFO namenode.FSNamesystem: Append Enabled: true
20/02/14 11:26:58 INFO util.GSet: Computing capacity for map INodeMap
20/02/14 11:26:58 INFO util.GSet: VM type       = 64-bit
20/02/14 11:26:58 INFO util.GSet: 1.0% max memory 889 MB = 8.9 MB
20/02/14 11:26:58 INFO util.GSet: capacity      = 2^20 = 1048576 entries
20/02/14 11:26:58 INFO namenode.NameNode: Caching file names occuring more than 10 times
20/02/14 11:26:58 INFO util.GSet: Computing capacity for map cachedBlocks
20/02/14 11:26:58 INFO util.GSet: VM type       = 64-bit
20/02/14 11:26:58 INFO util.GSet: 0.25% max memory 889 MB = 2.2 MB
20/02/14 11:26:58 INFO util.GSet: capacity      = 2^18 = 262144 entries
20/02/14 11:26:58 INFO namenode.FSNamesystem: dfs.namenode.safemode.threshold-pct = 0.9990000128746033
20/02/14 11:26:58 INFO namenode.FSNamesystem: dfs.namenode.safemode.min.datanodes = 0
20/02/14 11:26:58 INFO namenode.FSNamesystem: dfs.namenode.safemode.extension     = 30000
20/02/14 11:26:58 INFO namenode.FSNamesystem: Retry cache on namenode is enabled
20/02/14 11:26:58 INFO namenode.FSNamesystem: Retry cache will use 0.03 of total heap and retry cache entry expiry time is 600000 millis
20/02/14 11:26:58 INFO util.GSet: Computing capacity for map NameNodeRetryCache
20/02/14 11:26:58 INFO util.GSet: VM type       = 64-bit
20/02/14 11:26:58 INFO util.GSet: 0.029999999329447746% max memory 889 MB = 273.1 KB
20/02/14 11:26:58 INFO util.GSet: capacity      = 2^15 = 32768 entries
20/02/14 11:26:58 INFO namenode.AclConfigFlag: ACLs enabled? false
Re-format filesystem in Storage Directory D:\hadoop\workplace\tmp\dfs\name ? (Y or N) Y
20/02/14 11:27:27 INFO namenode.FSImage: Allocated new BlockPoolId: BP-412767103-192.168.123.29-1581650847204
20/02/14 11:27:27 INFO common.Storage: Storage directory D:\hadoop\workplace\tmp\dfs\name has been successfully formatted.
20/02/14 11:27:27 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
20/02/14 11:27:27 INFO util.ExitUtil: Exiting with status 0
20/02/14 11:27:27 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at DESKTOP-47RU81S/192.168.123.29
************************************************************/

NameNode有SHUTDOWN_MSG,似乎可以忽略。

有4个CMD窗口。

20200217055150863_1101.webp

20200215044434591_5581.webp

文章目录