windows+vmware+centos7+hadoop2.7搭建伪分布式集群

前言

折腾了几天,终于把伪分布式的Hadoop搭建起来了。对于没什么linux基础的我来说,这中间遇到的问题有时真能把我搞崩溃。皇天不负苦心人,总算是搭好了,wordcount也成功跑起来了。

首先说明,我的电脑是windows系统,平时做开发装了JDK、Eclipse等,但是连虚拟机都没有。所以这次就从装虚拟机开始,把搭建Hadoop的步骤好好整理一下。

1. 安装虚拟机软件

我选的VMware11 64位。虚拟机的安装没什么好说的,选好安装位置就行了。点此下载VMware11-x86_64位密码:gjua

2. 下载CentOS

我下载的是CentOS 7 minimal 64位版本,如果不需要图形界面的话minimal就够了。下载iso文件。点此下载CentOS-7-x86_64-Minimal-1503-01.iso密码:b0w1
下好放在一边备用。

3. 创建虚拟机

VMware11 安装好以后就可以创建一个空白虚拟机了。创建虚拟机的过程也很简单,当需要客户机操作系统的时候要选择 稍后安装操作系统。选好操作系统类型、版本安装位置就可以了,操作系统要和前面下载的一致。基本上一路默认配置就可以了。

4. 安装CentOS

VMware11支持简易安装CentOS。简易安装就是只需要输入一些用户名和密码,其他配置都交给VMware了。如果选择简易安装那么在创建虚拟机的时候就应该选好镜像文件的位置。

如果不想简易安装,那么就要像上一步一样创建一个空白的虚拟机,然后在虚拟机设置中选择CD/DVD光驱设备,然后选择使用镜像文件,选择之前下载好的CentOS镜像文件就可以了。当虚拟机启动的时候会自动安装系统。根据提示操作就行了。

5. 连接网络

系统安装好以后首先让它连上网络,否则后面的服务可能都无法安装。

如果不是简易安装的话,在安装过程中就会提示连接网络。
如果是简易安装的话,安装过程中是没有机会配置网络的。等安装好以后可以使用命令来配置。

输入命令

$ ifconfig

这个命令是用来查看IP地址的。通常minimal版本的CentOS没有安装网络工具,这个命令也是不存在与sbin目录下的。此时系统会提示:

[root@Master ~]# ifconfig
-bash: ifconfig: command not found

可以先安装网络工具,输入如下命令:

[root@Master ~]# yum search ifconfig

Loaded plugins: fastestmirror
base                                                                                                            
extras  
updates    
……   
Determining fastest mirrors
 * base: mirrors.163.com
 * extras: centos.ustc.edu.cn
 * updates: mirrors.pubyun.com
========================================================== Matched: ifconfig ==========================================================
net-tools.x86_64 : Basic networking tools

这个命令可以查看ifconfig命令所在的安装包 net-tools.x86_64。接下来安装这个软件:

yum -y install net-tools

安装好以后就可以通过ifconfig命令查看ip地址,如果只能看到如下信息

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 25169  bytes 4737269 (4.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 25169  bytes 4737269 (4.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

那就接着配置。

输入命令

vi  /etc/sysconfig/network-scripts/ifcfg-eht0

在这里的ETH0,指的第一个网卡接口,如果你的电脑(服务器有多个,请区分)。
注:在CentOS 7里面,网卡eth0被重命名为ifcfg-eno16777736,但是配置方式是一样的。如果希望改回eth0这样的名字,可以参考CentOS 7下网络设备命名(这个我没有试过,可行性需要自行验证)

如果文件是空白的,那就自己新建内容,大概是如下内容:

DEVICE=eth0
TYPE=Etherne
tUUID=58d64342-6bca-4156-8d4b-3bb092190644
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
# 这是网卡的MAC地址,根据自己的网卡输入
HWADDR=00:15:5D:01:44:11
IPADDR=192.168.1.103
PREFIX=24
GATEWAY=192.168.1.251
DNS1=202.96.128.86
DNS2=8.8.8.8
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"

配置好以后需要重新启动网卡:
先关闭:

[root@Master ~]# /sbin/ifdown eth0

再启动:

[root@Master ~]# /sbin/ifup eth0

网络连接好以后修改hosts文件,在其中添加IP-主机名的映射

[root@Master ~]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# 添加以下语句
192.168.186.130 Master

注:我一开始没配置hosts文件,刚开始没遇到问题,有一次突然发现ResourceManager起不起来了,最后通过修改hosts文件修复了这个问题。详见 附录 问题1

6. 配置防火墙

如果嫌防火墙太麻烦,可以直接关闭,反正后面启动Hadoop的时候还是要关闭的。

如果不想关闭防火墙,那么就需要配置一下端口,将ssh、ftp、http等端口开放。

CentOS 7中并没有安装我们熟悉的iptables,而是安装了firewalld。firewalld的用法还没有研究。如果想把firewalld换成我们熟悉的iptables,可以看这篇文章CentOS7将firewalld换成iptables

换成iptables以后,可以按照这篇文章来配置CentOS iptables防火墙的基本应用讲解

我配置好以后的iptables文件如下:

# Generated by iptables-save v1.4.21 on Thu Sep 10 02:27:20 2015
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
-A INPUT -p udp -m udp --dport 161 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j ACCEPT
COMMIT
# Completed on Thu Sep 10 02:27:20 2015

这里面将ftp的21、20端口,ssh的22端口和http的80、8080端口都开放了,除此以外的访问都是拒绝的。

7. 安装ssh

有了网络以后就可以用ssh来登录了,省的在VMware上操作蛋疼。

SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。透过 SSH 可以对所有传输的数据进行加密,也能够防止 DNS 欺骗和 IP 欺骗。

一般默认CentOS已经安装了OpenSSH,即使你是最小化安装也是如此。

如何检测ssh有没有安装呢?可以在shell中输入ssh命令看看,如果没有提示命令找不到而是提示ssh命令的用法那么说明已经安装了ssh服务了。

如果确实没有安装,可以输入如下命令安装:

yum install ssh

启动ssh

service sshd start

设置开机运行

chkconfig sshd on

可以在本地输入

$ ssh 127.0.0.1

测试ssh是否可用。如果可用,那么就可以使用SecureCRT来连接了。后面的操作都在SecureCRT上完成。

8. 安装ftp

安装ftp的过程可以参考这篇文章centos 启用ftp功能
如果前期已经把防火墙关掉了的话,这里应该会比较顺利。

9. 配置ssh免密码登录

Hadoop需要通过SSH来启动Slave节点的守护进程,即使安装伪分布式也需要SSH。
除了ssh外还需要rsync服务,rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。
判断ssh和rsync有没有安装

rpm –qa | grep openssh

rpm –qa | grep rsync

如果没有安装使用以下命令安装

yum install ssh 安装SSH协议
yum install rsync 

安装好以后配置免密码登录。
免密码登录的原理:

  /**
  Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,
  连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,
  包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。 
  当Master通过SSH连接Salve时,Salve就会生成一个随机数
  并用Master的公钥对随机数进行加密,并发送给Master。 
  Master收到加密数之后再用私钥解密,并将解密数回传给Slave, 
  Slave确认解密数无误之后就允许Master进行连接了。 
  这就是一个公钥认证过程,其间不需要用户手工输入密码。 
  重要过程是将客户端Master复制到Slave上。
  **/

使用普通用户登录CentOS。进入用户的home目录,执行如下命令

$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

# (注解:ssh-keygen表示生成密钥;-t指定密钥类型;-P 提供密语;-f生成的密钥文件)
# 这条语句表示生成了一个无密码密钥对,此时目录下会生成
# id_rsa和id_rsa.pub两个文件,前者是私钥,后者是公钥

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 将公钥追加到授权key中
$ chmod 600 ~/.ssh/authorized_keys
# 将授权key文件权限改为600(rr-------)

切换到root用户,修改ssh配置文件

# vim /etc/ssh/sshd_config

修改其中部分内容(去掉原来的注释符号)

RSAAuthentication yes # 启用 RSA 认证

PubkeyAuthentication yes # 启用公钥私钥配对认证方式

AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)

退出root用户,验证是否可以免密码登陆

$ ssh localhost\
Last login: Thu Sep 10 07:38:10 2015 from localhost

出现这样的信息,表示SSH免密码登录配置成功。
提示:第一次连接的时候可能会提示是否要连接,输入yes即可。

10. 安装JDK

下载JDK1.7压缩包(gz)或者安装文件(rpm)。我下载的是压缩包,点此下载jdk-7u79-linux-x64.gz密码:0ftp

在/usr目录下新建java目录

$ sudo mkdir java
$ ll /usr/ | grep java
drwxr-xr-x.  2 root root     6 Sep 15 09:01 java

使用ftp工具将下载的jdk压缩包上传到刚才新建的java目录,前提是要开放了ftp用户对java目录的读写权限。

上传好以后解压

[hadoop@Master java]$ ll
-rw-r--r--.  1 hadoop hadoop 153512879 Sep  8 10:38 jdk-7u79-linux-x64.gz

[hadoop@Master java]$ tar zxf jdk-7u79-linux-x64.gz 

[hadoop@Master java]$ ll
drwxr-xr-x. 8 hadoop hadoop      4096 Apr 11 02:53 jdk1.7.0_79
-rw-r--r--. 1 hadoop hadoop 153512879 Sep  8 10:38 jdk-7u79-linux-x64.gz

配置环境变量

$ vi /home/hadoop/.bash_profile
# 在文件末尾添加如下环境变量
# JAVA_HOME是自己的jdk安装目录(解压后生成的目录)
# JAVA Eniveronment
export JAVA_HOME=/usr/java/jdk1.7.0_79
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/rt.jar
export PATH=$JAVA_HOME/bin:$PATH

执行source命令,立即生效JDK环境变量

source /home/hadoop/.bash_profile

测试jdk是否安装成功

$ java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

出现以上信息就表示安装成功了。

11. 安装Hadoop

重要说明:根据我的安装经验,Hadoop、SSH等对于一些重要目录的权限比较敏感,权限赋予过多或者过少都有可能出现问题。所以建议在安装Hadoop时,新建目录一律用hadoop用户新建,用户组和其他用户尽量不要赋予写权限,我在安装过程中遇到的一些权限问题会附在后面。

首先下载Hadoop压缩包,目前最新的是Hadoop 2.7。点此下载hadoop-2.7.1.tar.gz

同JDK一样,Hadoop也是解压即可用的。
类似地在/usr目录下新建hadoop目录,赋予hadoop用户读写权限,通过ftp工具将hadoop压缩包上传到新建的hadoop目录下,输入命令解压。

进入到hadoop安装目录,接下来配置Hadoop:

Hadoop核心配置文件:

$ vi core-site.xml
<configuration>

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://192.168.186.130:9000</value>

    </property>

    <property>

        <name>hadoop.tmp.dir</name>

      <value>file:/usr/hadoop/tmp</value>

        <description>Abase for othertemporary directories.
        </description>

    </property>

</configuration>
<!--注释:fs.defaultFS指定HDFS的地址及端口,hadoop.tmp.dir可选配置-->

HDFS配置文件:

$ vi hdfs-site.xml
<configuration>

    <property>

      <name>dfs.replication</name>

      <value>1</value>

    </property>

    <property>

      <name>dfs.namenode.name.dir</name>

      <value>file:/usr/hadoop/dfs/name</value>

    </property>

    <property>

      <name>dfs.datanode.data.dir</name>

      <value>file:/usr/hadoop/dfs/data</value>

    </property>

    <property>

      <name>dfs.namenode.checkpoint.dir</name>

      <value>file:/usr/hadoop/dfs/namesecondary</value>

    </property> 

</configuration>

<!--注解:dfs.replication指定HDFS文件的备份方式默认3,由于是伪分布式,因此需要修改为1。其他为可选项-->

Map-reduce配置文件:

$ vi mapred-site.xml
<configuration>

    <property>

      <name>mapreduce.framework.name</name>

        <value>yarn</value>

    </property>

    <property>

      <name>yarn.app.mapreduce.am.staging-dir</name>

        <value>/usr/hadoop/staging</value>

    </property>

</configuration>

<!--注解:mapreduce.framework.name配置mapreduce框架,其他可选-->

YARN配置文件:

$ vi yarn-site.xml
<configuration>

    <!-- Site specific YARN configurationproperties -->

    <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>

    <property>

      <name>yarn.resourcemanager.hostname</name>

        <value>Master</value>

    </property>

</configuration>

<!--注解:配置YARN信息-->

接下来配置Hadoop环境变量:
同样是编辑.bash_profile文件,在末尾添加如下代码:

...
# Hadoop Environment
export HADOOP_HOME=/usr/hadoop/hadoop-2.7.1
export  HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"

并修改PATH:

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

使生效

$ source /home/.bash_profile

配置hadoop-env.sh

$ vi hadoop-env.sh

在文件末尾添加如下语句:

# set java environment

export JAVA_HOME=/usr/java/jdk1.7.0_79

以上配置文件都在Hadoop安装目录的/etc/hadoop目录下。

12. 启动Hadoop

在启动Hadoop前,需要格式化Hadoop的HDFS文件系统,如果配置Hadoop环境变量,可以直接执行hadoop命令。否则,进入Hadoop的bin目录执行文件格式命令:

$ hadoop namenode -format

此时,Hadoop整个安装与配置过程完成了。

进入Hadoop的sbin目录,启动Hadoop,验证是否安装成功!

$ ./start-all.sh

使用java的jps命令查看是否有hadoop的进程

[hadoop@Master ~]$ jps
3216 Jps
3064 ResourceManager
2792 DataNode
2919 SecondaryNameNode
2695 NameNode
3184 NodeManager

这里可以看到Hadoop的相关进程都起来了。

13. 运行wordcount程序

在Hadoop用户目录下新建两个文件file1.txt

[hadoop@Master ~]$ vi file1.txt

在file1.txt中输入

Hello World

再新建file2.txt

[hadoop@Master ~]$ vi file2.txt

在其中输入

Hello Hadoop

在Hdfs根目录下新建input目录

[hadoop@Master ~]$ hdfs dfs -mkdir /input

将file1.txt和file2.txt两个文件上传到HDFS中的input目录

[hadoop@Master ~]$ hdfs dfs -put file1.txt /input
[hadoop@Master ~]$ hdfs dfs -put file2.txt /input

执行hadoop自带的WordCount程序,统计单词数

$ cd $HADOOP_HOME/share/hadoop/mapreduce
# 注意:如果没有执行上面这条cd命令进入mapreduce目录,那么下面这条语句
# 的hadoop-mapreduce-examples-2.7.1.jar就需要添加完整的路径名,
# 否则会提示找不到该jar文件
$ hadoop jar hadoop-mapreduce-examples-2.7.1.jar wordcount  /input /output

执行的输出内容比较多,基本上看到如下输出结果并且过程中没有报错就是OK了

# …此处省略多条语句…
15/09/22 03:27:30 INFO mapreduce.Job:  map 100% reduce 100%
15/09/22 03:27:30 INFO mapreduce.Job: Job job_local1663000954_0001 completed successfully
15/09/22 03:27:30 INFO mapreduce.Job: Counters: 35

查看HDFS根目录,发现多了一个output目录

[hadoop@Master mapreduce]$ hdfs dfs -ls /

Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2015-09-21 09:30 /input
drwxr-xr-x   - hadoop supergroup          0 2015-09-22 03:27 /output

查看输出目录

[hadoop@Master mapreduce]$ hdfs dfs -ls /output

Found 2 items
-rw-r--r--   1 hadoop supergroup          0 2015-09-22 03:27 /output/_SUCCESS
-rw-r--r--   1 hadoop supergroup         25 2015-09-22 03:27 /output/part-r-00000

进一步查看输出文件内容

[hadoop@Master mapreduce]$ hdfs dfs -cat /output/part-r-00000

Hadoop  1
Hello   2
World   1

OK!结果正确。到此一个Hadoop伪分布式集群就算搭建好了。

搭建过程中会遇到很多问题,有些问题对于我这个linux小白来说确实难解。我觉得有些问题能避免尽量避免,否则会花费很多时间(linux基础很好,并且享受解决问题的快乐的话那就尽情折腾吧)。

哪些问题能尽量避免呢?
(1)防火墙带来的一系列问题。集群内部还是尽量关闭防火墙吧,否则会有各种各样的问题。
(2)文件权限问题。Hadoop尽量以普通用户身份安装,相关目录的所有者也设为该普通用户,尽量不要赋予其他用户和组写权限,因为Hadoop中的安全机制会检测文件权限,多余的权限会导致Hadoop的某些组件启动不了。

14. 附录

收录安装过程中遇到的一些问题

问题1:

java.net.BindException: Problem binding to [Master:8031] java.net.BindException: Cannot assign requested address;

查看详细log

[hadoop@Master logs]$ tail -n 100 yarn-hadoop-resourcemanager-Master.log

# 报如下错误
……
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.net.BindException: Problem binding to [Master:8031] java.net.BindException: Cannot assign requested address; For more details see:  http://wiki.apache.org/hadoop/BindException
       …此处省略…
        ... 17 more
Caused by: java.net.BindException: Cannot assign requested address
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:444)
        at sun.nio.ch.Net.bind(Net.java:436)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
        at org.apache.hadoop.ipc.Server.bind(Server.java:408)
        ... 25 more
2015-09-22 02:42:50,219 INFO org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down ResourceManager at Master/112.4.20.188
************************************************************/

这个问题并不是端口被占用,而是缺少hosts配置,我通过修改hosts文件修复了这个问题。

问题2:

2015-09-21 08:29:19,198 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Invalid dfs.datanode.data.dir /usr/hadoop/dfs/data : 
EPERM: Operation not permitted

   …此处省略…

2015-09-21 08:29:19,200 FATAL org.apache.hadoop.hdfs.   server.datanode.DataNode: Exception in secureMain
java.io.IOException: All directories in dfs.datanode.data.dir are invalid: "/usr/hadoop/dfs/data/" 

   …此处省略…

2015-09-21 08:29:19,201 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 1
2015-09-21 08:29:19,249 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down DataNode at Master/202.102.110.203
************************************************************/
2015-09-21 08:46:08,407 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: STARTUP_MSG: 

上网查了些资料,是说 dfs.datanode.data.dir 所指向的目录有了多余的写权限,只能是hadoop用户自己拥有写权限,其他用户和组不能有写权限,改过来datanode就可以启动了。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值