之前搭建的hadoop环境,分享下。ps:本人水平有限,根据网上资料整理而来的教程。可能存在不足之处,欢迎指出。

主机配置

    笔记本型号:联想s410p;Windows版本:Windows10专业版;处理器:Intel(R) Core(TM) i5-4200U CPU @1.60GHz  2.30GHz;安装内存:8GB;系统类型:64位操作系统。

前提

   下载并安装好VMwareWorkstation12.0;在cents官网上下载CentOS-6.7-i386-bin-DVD1.iso。

安装centos:在VM上选择新建虚拟机,

hadoop 对电脑要求 hadoop要求电脑内存_hadoop集群

一般选择典型,找到CentOS-6.7-i386-bin-DVD1.iso,点击下一步,给虚拟机命名,可以在开始的就把用户名命名为hadoop.

hadoop 对电脑要求 hadoop要求电脑内存_Hadoop_02

之后进入到,选择的是将虚拟磁盘存储为单个文件。

hadoop 对电脑要求 hadoop要求电脑内存_xml_03

开始时可以直接按默认新建虚拟机,接着就等安装完成。

hadoop 对电脑要求 hadoop要求电脑内存_hadoop 对电脑要求_04

Hadoop账户权限

首先为hadoop账户增加管理员权限:

执行命令:visudo

如下图,找到 root ALL=(ALL) ALL 这行(应该在第98行,可以先按一下键盘上的 ESC 键,然后输入 :98 (按一下冒号,接着输入98,再按回车键),可以直接跳到第98行),然后在这行下面增加一行内容:hadoop ALL=(ALL) ALL (当中的间隔为tab),如下图所示

hadoop 对电脑要求 hadoop要求电脑内存_hadoop集群_05

添加好内容后,先按一下键盘上的 ESC 键,然后输入 :wq (输入冒号还有wq,这是vi/vim编辑器的保存方法),再按回车键保存退出就可以了。

安装SSH、配置SSH无密码登陆

集群需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),一般情况下,CentOS 默认已安装了 SSH client、SSH server,打开终端执行如下命令进行检验:

命令:rpm -qa | grep ssh

hadoop 对电脑要求 hadoop要求电脑内存_hadoop集群_06

如果返回的结果如上图所示,包含了 SSH client 跟 SSH server,则不需要再安装。(安装的命令为sudo yum install openssh-clients

sudoyum install openssh-server )

执行如下命令测试一下 SSH 是否可用:

命令:ssh localhost

hadoop 对电脑要求 hadoop要求电脑内存_xml_07

首次登陆输入 yes 。然后按提示输入密码 hadoop就可以登陆本机了。我们需要配置成SSH无密码登陆这样才比较方便。首先输入 exit 退出刚才的 ssh,就回到了我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中:

命令:ssh-keygen -t rsa             # 会有提示,都按回车就可以

catid_rsa.pub >> authorized_keys  # 加入授权

chmod600 ./authorized_keys    # 修改文件权限

此时再用 ssh localhost 命令,无需输入密码就可以直接登陆了,如下图所示。

hadoop 对电脑要求 hadoop要求电脑内存_xml_08

安装JAVA环境

通过 yum 进行安装 JDK,安装过程中会让输入 [y/N],输入 y 即可:

hadoop 对电脑要求 hadoop要求电脑内存_hadoop_09

安装位置可以通过执行

命令:rpm -qljava-1.7.0-openjdk-devel | grep '/bin/javac'

执行后会输出一个路径,除去路径末尾的 “/bin/javac”,剩下的就是正确的路径了。

接着需要配置一下JAVA_HOME 环境变量,为方便,我们在 ~/.bashrc 中进行设置:

命令:vim~/.bashrc

在文件最后面添加如下单独一行(指向 JDK 的安装位置),并保存:

如下图:

hadoop 对电脑要求 hadoop要求电脑内存_hadoop 对电脑要求_10

接着还需要让该环境变量生效,执行如下命令:

source~/.bashrc

设置好后我们来检验一下是否设置正确:

echo$JAVA_HOME     # 检验变量值

java -version

$JAVA_HOME/bin/java-version  # 与直接执行 java -version 一样

如下图所示Hadoop 所需的 Java 运行环境就安装好了

hadoop 对电脑要求 hadoop要求电脑内存_hadoop集群_11

安装Hadoop2

Hadoop 2 可以通过 http://mirror.bit.edu.cn/apache/hadoop/common/ 下载,我所选择的是 2.7.2版本,下载时下载 hadoop-2.x.y.tar.gz 这个格式的文件。下载时也下载 hadoop-2.x.y.tar.gz.mds 这个文件,该文件包含了检验值可用于检查hadoop-2.x.y.tar.gz 的完整性,否则若文件发生了损坏或下载不完整,Hadoop 将无法正常运行。

使用命令检测文件完整性:

cat~/Downloads/hadoop-2.6.0.tar.gz.mds | grep 'MD5'      # 列出md5检验值

md5sum~/Downloads/hadoop-2.6.0.tar.gz | tr "a-z" "A-Z"   # 计算md5值

若文件不完整则这两个值一般差别很大,可以简单对比下前几个字符跟后几个字符是否相等即可,如下图所示,如果两个值不一样,请务必重新下载。

hadoop 对电脑要求 hadoop要求电脑内存_hadoop集群_12

我们选择将 Hadoop 安装至 /usr/local/ 中:

命令:

sudo tar -zxf~/Downloads/hadoop-2.7.2.tar.gz -C /usr/local

cd /usr/local/

sudo mv./hadoop-2.7.2/ ./hadoop            # 将文件夹名改为hadoop

sudo chown -Rhadoop:hadoop ./hadoop        # 修改文件权限

Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:

cd/usr/local/hadoop

./bin/hadoopversion

如下图所示:

hadoop 对电脑要求 hadoop要求电脑内存_hadoop_13

集群搭建准备工作:

我们需要使用三个节点作为集群环境,刚才所创建的centos可以作为主节点:Master,接下来需要新建两个虚拟机作为Slave1和Slave2,在这两个Slave 节点上配置 hadoop 用户、安装 SSHserver、安装 Java 环境(略)。

网络配置:

我们选择的网络连接方式为NAT模式,Linux 中查看节点 IP 地址的命令为 ifconfig;即下图所示的 inet 地址

hadoop 对电脑要求 hadoop要求电脑内存_Hadoop_14

为了便于区分,可以修改各个节点的主机名(在终端标题、命令行中可以看到主机名,以便区分)。在 Centos 中,我们在 Master 节点上执行如下命令修改主机名的命令为:

sudo vim  /etc/sysconfig/network

改为HOSTNAME=Master,如下图

hadoop 对电脑要求 hadoop要求电脑内存_xml_15

然后执行如下命令修改自己所用节点的IP映射:


sudo vim/etc/hosts

改成如下图所示的IP和节点名;(需要在所有节点上完成网络配置

如上面讲的是 Master 节点的配置,而在其他的 Slave 节点上,也要对 /etc/sysconfig/network(修改为 Slave1、Slave2 等) 和/etc/hosts(跟 Master 的配置一样)这两个文件进行修改!)

hadoop 对电脑要求 hadoop要求电脑内存_xml_16

配置好后需要在各个节点上执行如下命令,测试是否相互 ping 得通,如果 ping 不通,后面就无法顺利配置成功:

在 Master 节点上 ping Slave1,ping 通的话会显示 time,显示的结果如下图所示:

hadoop 对电脑要求 hadoop要求电脑内存_hadoop_17

同样可以在Slave1上测试,比如可以试下ping Slave2,结果也显示ping得通。

hadoop 对电脑要求 hadoop要求电脑内存_hadoop_18

SSH无密码登陆节点

这个操作是要让 Master 节点可以无密码 SSH 登陆到各个 Slave 节点上。

首先生成 Master 节点的公匙,在 Master 节点的终端中执行(因为改过主机名,所以还需要删掉原有的再重新生成一次):

命令:cd~/.ssh               # 如果没有该目录,先执行一次ssh localhost

rm./id_rsa*            # 删除之前生成的公匙(如果有)

ssh-keygen -trsa       # 一直按回车就可以

如下图所示:

hadoop 对电脑要求 hadoop要求电脑内存_hadoop_19

让 Master 节点需能无密码 SSH 本机,在 Master 节点上执行命令:

cat./id_rsa.pub >> ./authorized_keys

完成后可执行 sshMaster 验证一下(可能需要输入 yes,成功后执行exit 返回原来的终端)。接着在 Master 节点将上公匙传输到 Slave1 节点:

scp~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/

scp 是 secure copy 的简写,用于在 Linux 下进行远程拷贝文件,类似于 cp 命令,不过 cp 只能在本机中拷贝。执行 scp 时会要求输入 Slave1 上hadoop 用户的密码(hadoop),输入完成后会提示传输完毕,如下图所示:

hadoop 对电脑要求 hadoop要求电脑内存_Hadoop_20

接着在 Slave1 节点上,将 ssh 公匙加入授权:

mkdir~/.ssh       # 如果不存在该文件夹需先创建,若已存在则忽略

cat~/id_rsa.pub >> ~/.ssh/authorized_keys

rm ~/id_rsa.pub    # 用完就可以删掉了

hadoop 对电脑要求 hadoop要求电脑内存_hadoop_21

同样的道理也要执行将Master 公匙传输到 Slave2 节点、在 Slave2节点上加入授权这两步。

这样,在 Master 节点上就可以无密码 SSH 到各个 Slave 节点了,可在 Master 节点上执行如下命令进行检验,如下图所示:

hadoop 对电脑要求 hadoop要求电脑内存_hadoop集群_22

配置PATH变量:

在单机伪分布式配置教程的最后,说到可以将 Hadoop 安装目录加入 PATH 变量中,这样就可以在任意目录中直接使用 hadoo、hdfs 等命令了,如果还没有配置的,需要在 Master 节点上进行配置。首先执行 vim ~/.bashrc,加入一行:

exportPATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin

如下图所示

hadoop 对电脑要求 hadoop要求电脑内存_hadoop 对电脑要求_23

保存后执行 source~/.bashrc 使配置生效。

配置集群/分布式环境

集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5个配置文件: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 。


1.首先修改文件 slaves,将作为 DataNode 的主机名写入该文件,每行一个,默认为 localhost,分布式配置让 Master 节点仅作为 NameNode 使用,因此将文件中原来的 localhost 删除,只添加两行内容:Slave1,Slave2。如下图

hadoop 对电脑要求 hadoop要求电脑内存_Hadoop_24

2, 文件 core-site.xml 改为下面的配置:

<configuration>

        <property>

                <name>fs.defaultFS</name>

               <value>hdfs://Master:9000</value>

        </property>

        <property>

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

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

                <description>Abase forother temporary directories.</description>

        </property>

</configuration>



3, 文件 hdfs-site.xml,dfs.replication 一般设为 3,但我们只有两个 Slave 节点,所以 dfs.replication 的值还是设为2

<configuration>

        <property>

                <name>dfs.namenode.secondary.http-address</name>

               <value>Master:50090</value>

        </property>

        <property>

               <name>dfs.replication</name>

                <value>2</value>

        </property>

        <property>

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

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

        </property>

        <property>

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

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

        </property>

</configuration>

 

4.文件 mapred-site.xml (需要先重命名,默认文件名为mapred-site.xml.template),然后配置修改如下:

 

<configuration>

        <property>

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

                <value>yarn</value>

        </property>

        <property>

               <name>mapreduce.jobhistory.address</name>

               <value>Master:10020</value>

        </property>

        <property>

                <name>mapreduce.jobhistory.webapp.address</name>

               <value>Master:19888</value>

        </property>

</configuration>



5, 文件 yarn-site.xml:

 

<configuration>

        <property>

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

                <value>Master</value>

        </property>

        <property>

               <name>yarn.nodemanager.aux-services</name>

               <value>mapreduce_shuffle</value>

        </property>

</configuration>



配置好后,将 Master 上的 /usr/local/Hadoop 文件夹复制到各个节点上。在 Master 节点上执行命令:

cd /usr/local

tar -zcf~/hadoop.master.tar.gz ./hadoop   # 先压缩再复制

cd ~

scp./hadoop.master.tar.gz Slave1:/home/hadoop

在 Slave1 节点上执行:

sudo rm -r/usr/local/hadoop    # 删掉旧的(如果存在)

sudo tar -zxf~/hadoop.master.tar.gz -C /usr/local

sudo chown -Rhadoop:hadoop /usr/local/hadoop

同样,也要执行将hadoop.master.tar.gz 传输到 Slave2节点、在 Slave2节点解压文件的操作。如下图所示

hadoop 对电脑要求 hadoop要求电脑内存_xml_25

hadoop 对电脑要求 hadoop要求电脑内存_hadoop集群_26

首次启动需要先在 Master 节点执行 NameNode 的格式化:

hdfs namenode-format       # 首次运行需要执行初始化,之后不需要

CentOS系统需要关闭防火墙

CentOS系统默认开启了防火墙,在开启 Hadoop 集群之前,需要关闭集群中每个节点的防火墙。有防火墙会导致 ping 得通但 telnet 端口不通,从而导致 DataNode 启动了,但 Live datanodes 为 0 的情况。(Master,Slave1,Slave2都需要关)

在 CentOS中,可以通过如下命令关闭防火墙:

sudo serviceiptables stop   # 关闭防火墙服务

sudo chkconfigiptables off  # 禁止防火墙开机自启,就不用手动关闭了

如下图所示就是成功关闭了

hadoop 对电脑要求 hadoop要求电脑内存_hadoop_27

接着可以启动 hadoop 了,启动需要在 Master 节点上进行:

start-dfs.sh

start-yarn.sh

mr-jobhistory-daemon.shstart historyserver

通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 进程,如下图所示

hadoop 对电脑要求 hadoop要求电脑内存_hadoop_28

在 Slave 节点可以看到 DataNode 和 NodeManager 进程,如下图所示:

hadoop 对电脑要求 hadoop要求电脑内存_hadoop_29

还需要在 Master 节点上通过命令 hdfs dfsadmin -report 查看 DataNode 是否正常启动,如果 Live datanodes 不为 0 ,则说明集群启动成功。如下图所示为2

hadoop 对电脑要求 hadoop要求电脑内存_hadoop 对电脑要求_30

也可以通过 Web 页面看到查看 DataNode 和 NameNode 的状态:http://master:50070/。如果不成功,可以通过启动日志排查原因。

执行分布式实例

首先创建 HDFS 上的用户目录:

hdfs dfs -mkdir-p /user/hadoop

将/usr/local/hadoop/etc/hadoop 中的配置文件作为输入文件复制到分布式文件系统中:

hdfs dfs -mkdirinput

hdfs dfs -put/usr/local/hadoop/etc/hadoop/*.xml input

通过查看 DataNode 的状态(占用大小有改变),输入文件确实复制到了 DataNode 中,如下图所示:

hadoop 对电脑要求 hadoop要求电脑内存_Hadoop_31

接着就可以运行MapReduce 作业了:命令:

hadoop jar/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grepinput output 'dfs[a-z.]+'

运行时的输出信息会显示 Job的进度。可能会有点慢,但如果迟迟没有进度,比如 5 分钟都没看到进度,那不妨重启 Hadoop 再试试。若重启还不行,则很有可能是内存不足引起,建议增大虚拟机的内存,或者通过更改 YARN 的内存配置解决。如下图所示:

hadoop 对电脑要求 hadoop要求电脑内存_hadoop集群_32


同样可以通过 Web 界面查看任务进度 http://master:8088/cluster,在 Web 界面点击“Tracking UI” 这一列的 History 连接,可以看到任务的运行信息,如下图所示:

hadoop 对电脑要求 hadoop要求电脑内存_xml_33

hadoop 对电脑要求 hadoop要求电脑内存_xml_34

执行完毕后的输出结果:

hadoop 对电脑要求 hadoop要求电脑内存_xml_35

关闭 Hadoop 集群也是在 Master 节点上执行的:

stop-yarn.sh

stop-dfs.sh

mr-jobhistory-daemon.shstop historyserver

如下图

hadoop 对电脑要求 hadoop要求电脑内存_xml_36

注:如果集群以前能启动,但后来启动不了,特别是 DataNode 无法启动,不妨试着删除所有节点(包括 Slave 节点)上的 /usr/local/hadoop/tmp 文件夹,再重新执行一次 hdfsnamenode -format,再次启动试试。