zoukankan      html  css  js  c++  java
  • CentOS 6.7安装Hadoop 2.7.2

    用VMware虚拟机创建两个虚拟机,分别作为此次实验的master节点(主机)、slave节点(从机)。

    • 先新建一个内存为2G、硬盘占用为30G、CetnOS 6.7 64位的虚拟机(master),选择NAT网络模式(之前尝试过Bridged、Host-Only模式,感觉还是NAT模式方便快捷,这也是虚拟机默认的网络模式)。测试网络没问题后,克隆master机器,并将其命名为slave。
    主机名 IP地址
    master 192.168.229.130
    slave 192.168.229.131

    设置hosts、hostname

    master

    [root@localhost ~]# vi /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    

    内容修改为

    127.0.0.1   localhost
    192.168.229.130 master
    192.168.229.131 slave
    

    保存退出


    [root@localhost ~]# vi /etc/sysconfig/network
    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    

    内容修改为

    NETWORKING=yes
    HOSTNAME=master
    

    保存退出


    slave

    [root@localhost ~]# vi /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    

    内容修改为

    127.0.0.1   localhost
    192.168.229.130 master
    192.168.229.131 slave
    

    保存退出


    [root@localhost ~]# vi /etc/sysconfig/network
    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    

    内容修改为

    NETWORKING=yes
    HOSTNAME=slave
    

    保存退出


    • 可用 hostname your-hostname 命令作临时修改,但它只是临时地修改主机名,系统重启后会恢复原样的。但修改上面的文件是永久的,重启系统会得到新的主机名。因此,修改后需要重启虚拟机。

    关闭selinux

    master

    [root@master ~]# vim /etc/selinux/config

    修改

    SELINUX=enforcing

    SELINUX=disabled

    保存退出

    [root@master ~]# getenforce
    Enforcing
    
    • 可以使用getenforce 命令获得当前selinux的状态,可见修改配置文件后,需重启Linux方可生效。

    重启


    slave

    [root@slave ~]# vim /etc/selinux/config

    修改

    SELINUX=enforcing

    SELINUX=disabled

    保存退出,重启


    关闭firewall

    CentOS上默认是设有iptables规则的

    master

    [root@master ~]# iptables -F; /etc/init.d/iptables save
    iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
    

    重启系统后,通过 iptables -nvL 命令可查看规则已清除

    slave

    [root@slave ~]# iptables -F; /etc/init.d/iptables save
    iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
    

    -nvL 就是查看规则。 -F 是把当前规则清除,但这个只是临时的,重启系统或者重启 iptalbes 服务后还会加载已经保存的规则,所以需要使用 /etc/init.d/iptables save 保存一下规则,通过上边的命令输出我们也可以看到,防火墙规则保存在了/etc/sysconfig/iptables

    免密钥登录配置

    master

    [root@master ~]# ssh-keygen

    一直回车

    • 运行结束后,/root/.ssh目录下,会新生成两个文件:id_rsaid_rsa.pub。前者是私钥,后者是公钥。
    [root@master ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    [root@master ~]# scp ~/.ssh/authorized_keys slave:~/.ssh/
    

    slave

    [root@slave ~]# ls .ssh/
    authorized_keys
    

    master

    [root@master ~]# ssh slave
    [root@slave ~]# exit
    [root@master ~]#
    • 测试从master免密钥登录到slave,第一次会需要输入yes继续连接

    安装JDK

    检查是否已安装正确版本的JDK

    # java -version

    如果没有安装正确版本的JDK,先卸载自带的JDK,再安装

    master

    • 下载前,需要在官网点击接受许可证,之后获取链接
    [root@master ~]# wget http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz?AuthParam=1480051498_4f2fdb0325a457f4c7d33a69355b3560
    [root@master ~]# mv jdk-7u79-linux-x64.tar.gz?AuthParam=1480051498_4f2fdb0325a457f4c7d33a69355b3560  jdk-7u79-linux-x64.tar.gz
    [root@master ~]# tar zxvf jdk-7u79-linux-x64.tar.gz
    [root@master ~]# mv jdk1.7.0_79 /usr/local/
    

    JDK环境变量

    [root@master ~]# vi /etc/profile.d/java.sh

    添加

    export JAVA_HOME=/usr/local/jdk1.7.0_79
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    

    保存退出

    [root@master ~]# source /etc/profile.d/java.sh
    [root@master ~]# 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)
    
    [root@master ~]# scp jdk-7u79-linux-x64.tar.gz slave:/root/
    [root@master ~]# scp /etc/profile.d/java.sh slave:/etc/profile.d/
    

    slave

    [root@slave ~]# tar zxvf jdk-7u79-linux-x64.tar.gz
    [root@slave ~]# mv jdk1.7.0_79 /usr/local/
    

    JDK环境变量

    [root@slave ~]# source /etc/profile.d/java.sh
    [root@slave ~]# 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)
    

    安装Hadoop

    master

    [root@master ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz
    [root@master ~]# tar zxvf hadoop-2.7.2.tar.gz
    [root@master ~]# mv hadoop-2.7.2 /usr/local/
    [root@master ~]# ls /usr/local/
    bin  games         include      lib    libexec  share  etc  hadoop-2.7.2  jdk1.7.0_79  lib64  sbin     src
    [root@master ~]# ls /usr/local/hadoop-2.7.2/
    bin  include  libexec      NOTICE.txt  sbin  etc  lib      LICENSE.txt  README.txt  share
    [root@master ~]# mkdir /usr/local/hadoop-2.7.2/tmp /usr/local/hadoop-2.7.2/dfs /usr/local/hadoop-2.7.2/dfs/data /usr/local/hadoop-2.7.2/dfs/name
    
    • 目录/usr/local/hadoop-2.7.2/tmp,用来存储临时生成的文件
    • 目录/usr/local/hadoop-2.7.2/dfs,用来存储集群数据
    • 目录/usr/local/hadoop-2.7.2/dfs/data,用来存储真正的数据
    • 目录/usr/local/hadoop-2.7.2/dfs/name,用来存储文件系统元数据
    [root@master ~]# ls /usr/local/hadoop-2.7.2/
    bin  etc      lib      LICENSE.txt  README.txt  share  dfs  include  libexec  NOTICE.txt   sbin        tmp
    [root@master ~]# rsync -av /usr/local/hadoop-2.7.2 slave:/usr/local

    slave

    [root@slave ~]# ls /usr/local/hadoop-2.7.2
    bin  etc      lib      LICENSE.txt  README.txt  share  dfs  include  libexec  NOTICE.txt   sbin        tmp
    

    配置Hadoop

    master

    [root@master ~]# vi /usr/local/hadoop-2.7.2/etc/hadoop/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-2.7.2/tmp</value>
        </property>
        <property>
            <name>io.file.buffer.size</name>
            <value>131072</value>
        </property>
    </configuration>
    

    保存退出

    • 变量fs.defaultFS保存了NameNode的位置,HDFS和MapReduce组件都需要它。这就是它出现在core-site.xml文件中而不是hdfs-site.xml文件中的原因。

    [root@master ~]# vi /usr/local/hadoop-2.7.2/etc/hadoop/hdfs-site.xml

    添加

    <configuration>
        <property>
            <name>dfs.namenode.name.dir</name>
            <value>file:/usr/local/hadoop-2.7.2/dfs/name</value>
        </property>
        <property>
            <name>dfs.datanode.data.dir</name>
            <value>file:/usr/local/hadoop-2.7.2/dfs/data</value>
        </property>
        <property>
            <name>dfs.replication</name>
            <value>1</value>
        </property>
        <property>
            <name>dfs.namenode.secondary.http-address</name>
            <value>master:9001</value>
        </property>
        <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
        </property>
    </configuration>
    

    保存退出

    • 注意:变量dfs.replication指定了每个HDFS数据块的复制次数,即HDFS存储文件的副本个数,默认为3,如果不修改,DataNode少于3台就会报错。我的实验环境只有一台主机和一台从机(DataNode),所以值为1。

    [root@master ~]# mv /usr/local/hadoop-2.7.2/etc/hadoop/mapred-site.xml.template /usr/local/hadoop-2.7.2/etc/hadoop/mapred-site.xml
    [root@master ~]# vi /usr/local/hadoop-2.7.2/etc/hadoop/mapred-site.xml
    

    添加

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

    保存退出


    [root@master ~]# vi /usr/local/hadoop-2.7.2/etc/hadoop/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.auxservices.mapreduce.shuffle.class</name>
            <value>org.apache.hadoop.mapred.ShuffleHandler</value>
        </property>
        <property>
            <name>yarn.resourcemanager.address</name>
            <value>master:8032</value>
        </property>
        <property>
            <name>yarn.resourcemanager.scheduler.address</name>
            <value>master:8030</value>
        </property>
        <property>
            <name>yarn.resourcemanager.resource-tracker.address</name>
            <value>master:8031</value>
        </property>
        <property>
            <name>yarn.resourcemanager.admin.address</name>
            <value>master:8033</value>
        </property>
        <property>
            <name>yarn.resourcemanager.webapp.address</name>
            <value>master:8088</value>
        </property>
    
    </configuration>
    

    保存退出


    [root@master ~]# vi /usr/local/hadoop-2.7.2/etc/hadoop/hadoop-env.sh

    修改

    export JAVA_HOME=${JAVA_HOME}

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

    保存退出


    [root@master ~]# vi /usr/local/hadoop-2.7.2/etc/hadoop/yarn-env.sh

    修改

    # export JAVA_HOME=/home/y/libexec/jdk1.6.0/

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

    保存退出


    [root@master ~]# vi /usr/local/hadoop-2.7.2/etc/hadoop/mapred-env.sh

    修改

    # export JAVA_HOME=/home/y/libexec/jdk1.6.0/

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

    保存退出


    [root@master ~]# vi /usr/local/hadoop-2.7.2/etc/hadoop/slaves

    里面的内容

    localhost

    修改为

    slave
    • 这个文件保存所有slave节点

    [root@master ~]# rsync -av /usr/local/hadoop-2.7.2/etc/ slave:/usr/local/hadoop-2.7.2/etc/

    Hadoop环境变量

    [root@master ~]# vi /etc/profile.d/hadoop.sh

    添加

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

    保存退出

    [root@master ~]# source /etc/profile.d/hadoop.sh
    [root@master ~]# hadoop version
    Hadoop 2.7.2
    Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r b165c4fe8a74265c792ce23f546c64604acf0e41
    Compiled by jenkins on 2016-01-26T00:08Z
    Compiled with protoc 2.5.0
    From source with checksum d0fda26633fa762bff87ec759ebe689c
    This command was run using /usr/local/hadoop-2.7.2/share/hadoop/common/hadoop-common-2.7.2.jar
    

    [root@master ~]# scp /etc/profile.d/hadoop.sh slave:/etc/profile.d/

    slave

    Hadoop环境变量

    [root@slave ~]# source /etc/profile.d/hadoop.sh
    [root@slave ~]# hadoop version
    Hadoop 2.7.2
    Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r b165c4fe8a74265c792ce23f546c64604acf0e41
    Compiled by jenkins on 2016-01-26T00:08Z
    Compiled with protoc 2.5.0
    From source with checksum d0fda26633fa762bff87ec759ebe689c
    This command was run using /usr/local/hadoop-2.7.2/share/hadoop/common/hadoop-common-2.7.2.jar
    

    运行Hadoop

    master

    [root@master ~]# /usr/local/hadoop-2.7.2/bin/hdfs namenode -format
    [root@master ~]# echo $?
    0
    • 在执行格式化 -format 命令时,要避免NameNode的namespace ID与DataNode的namespace ID的不一致。这是因为每格式化一次就会产生Name、Data、temp等临时文件记录信息,多次格式化会产生很多的Name、Data、temp,这样容易导致ID的不同,使Hadoop不能正常运行。每次执行格式化-format命令时,就需要将DataNode和NameNode上原来的data、temp文件删除。
    • 建议只执行一次格式化。格式化NameNode的命令可以执行多次,但是这样会使所有的现有文件系统数据受损。只有在Hadoop集群关闭和你想进行格式化的情况下,才能执行格式化。但是在其他大多数情况下,格式化操作会快速、不可恢复地删除HDFS上的所有数据。它在大型集群上的执行时间更长。

    [root@master ~]# /usr/local/hadoop-2.7.2/sbin/start-all.sh
    [root@master ~]# jps
    5560 ResourceManager
    5239 NameNode
    5631 Jps
    5415 SecondaryNameNode
    

    slave

    [root@slave ~]# jps
    5231 DataNode
    5444 Jps
    5320 NodeManager
    

    master

    Web UI查看集群是否成功启动:

    • 在浏览器地址栏中输入 master:50070 ,检查namenode和datanode是否正常。
    • 在浏览器地址栏中输入 master:8088 ,检查Yarn是否正常。

    运行PI实例检查集群是否成功

    [root@master ~]# cd /usr/local/hadoop-2.7.2/
    [root@master hadoop-2.7.2]# bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar pi 10 10
    

    最后输出运算的结果。

    如果以上步骤都没有问题,说明集群正常启动。


    停止服务(关机前,要停止Hadoop集群)

    [root@master ~]# /usr/local/hadoop-2.7.2/sbin/stop-all.sh

    Active Nodes显示为0

    解决方案:

    每台机器上(master、slave)的/etc/hosts文件都修改为:

    127.0.0.1   localhost 
    192.168.229.130 master
    192.168.229.131 slave

    之前文件里有其他内容,删除之后,先停止服务再启动,Active Nodes显示为1。

    copyFromLocal: Cannot create directory /123/. Name node is in safe mode

    如果提示 copyFromLocal: Cannot create directory /123/. Name node is in safe mode.,这是因为开启了安全模式

    解决方法:

    [root@master ~]# /usr/local/hadoop-2.7.2/bin/hdfs dfsadmin -safemode leave

    • 安全模式(safe mode)

    作为一种附加的保护措施,NameNode进程会将HDFS文件系统保持在只读模式下,直到它确认DataNode上报的数据块数量达到了副本阈值。通常情况下,只需所有DataNode上报其数据块状态即可。但是,如果某些DataNode发生故障,NameNode需要安排重新复制部分数据块,然后集群才会达到离开安全模式的条件。



    Hadoop虐我千百遍,我待Hadoop如初恋(给自己挖的坑,跪着也要填平)

  • 相关阅读:
    关于闭包和作用域的问题
    中文字体@font-face的导入
    一个跑马灯插件(持续优化)
    关于JS的clone()函数编写的一些问题
    函数的自执行,变量提升和函数提升
    Android 之Map容器替换 SparseArray,ArrayMap,ArraySet
    Anndroid GC 那些事
    Spark Streaming实时计算
    REDIS基础要点
    zookeeper要点总结
  • 原文地址:https://www.cnblogs.com/Genesis2018/p/9079791.html
Copyright © 2011-2022 走看看