Hadoop 2.6.0集群搭建(伪分布式+分布式)

来源:互联网 发布:福州网络推广 编辑:程序博客网 时间:2024/06/07 01:53
说明:
1、/etc/hosts中我配置的ip-hostname映射是hadoop1~hadoop7
2、配置jdk、hadoop环境变量就不做多说明了
3、建议先把本文看一遍,不要直接看一部就在自己机器上直接操作。先看一遍,把每个步骤、每个命令的作用的基本了解后,再照着本文操作。
4、本文中cluster1、cluster2、cluster3~cluster7代表的是在/etc/hosts中配置的ip-hostname映射的hostname,由于我最后一次搭建集群时,在/etc/hosts配置的ip-hostnaem映射值为hadoop1、hadoop2、~~~、hadoop7,所以看到cluster1~cluster7可以自行替换成hadoop1~hadoop7.
5、有问题,欢迎评论中提出。

一、Hadoop 单机节点安装
1.准备Linux环境
1>关闭
        #查看防火墙状态防火墙service iptables status        #关闭防火墙service iptables stop        #查看防火墙开机启动状态chkconfig iptables --list        #关闭防火墙开机启动chkconfig iptables off
2>安装JDK
3>安装SSH(如果没有)
2.上传hadoop
准备:
配置(单机节点只需要改3个配置文件)
配置linux 主机名和ip映射vim /etc/hosts
配置linux 主机名vim /etc/sysconfig/network(此操作必须重启)
     2.1配置hdfs主人(NameNode)
         etc/hadoop/core-site.xml
         <configuration>             <property>                 <name>fs.defaultFS</name>                 <value>hdfs://<span style="color:#FF0000;">localhost</span>:9000</value><!-- 红色地方最好直接写成/etc/hosts中的主机名,如果在其他机器上使用浏览器访问时,就需要写主机名-->             </property>         </configuration>
     2.2.配置hdfs 副本
      etc/hadoop/hdfs-site.xml
      <configuration>          <property>              <name>dfs.replication</name>              <value>1</value>          </property>      </configuration>
      2.3.配置jdk
    etc/hadoop/hadoop-env.sh在25行
     export JAVA_HOME=/usr/local/java/jdk1.7.0_45/<span style="color:#333333;"></span>
3.初始化NameNode
     老版本 :
          hadoop namenode -format
     新版本:
          hdfs namenode -format
4.启动hdfs
          start-dfs.sh<span style="color:#333333;"></span>
5.验证是否成功
     jps      2128 Jps      1761 NameNode      1849 DataNode      2026 SecondaryNameNode
   用WEBUI 验证 http://hadoop1:50070/
6.hdfs shell
   上传文件到HDFS
        hdfs dfs -put /linux本地目录 hdfs://hadoop1:9000(等于 /)<span style="color:#333333;"></span>
   下载HDFS文件到本地
        hdfs dfs -get hdfs://hadoop1:9000(等于 /) /linux本地目录
   说明:mv/cp/mkdir/chmod 等同于linux命令mv

7.Yarn

     7.1.配置mapreduce 运行在yarn上
etc/hadoop/mapred-site.xml:
    <property>         <name>mapreduce.framework.name</name>         <value>yarn</value>   </property>
etc/hadoop/yarn-site.xml:
      <configuration>          <property>              <name>yarn.nodemanager.aux-services</name>              <value>mapreduce_shuffle</value>          </property>      </configuration>

启动yarn:
    $ sbin/start-yarn.sh<span style="color:#333333;"></span>

验证
      2123 Jps      1668 DataNode      1578 NameNode      2004 ResourceManager      1801 SecondaryNameNode      2093 NodeManager
MapReduce:
是一个并行计算框架(分布式计算模型)
MR的执行
    hadoop jar /tmp/wordcount.jar com.hadoop.mapreduce.WordCount /input2 /output2

     7. 2.MR执行流程

    (1).JobClient提交一个mr的jar包给ResourceManage(提交方式:hadoop jar ...)

    (2).JobClient通过RPC和ResourceManage(JobTracker)进行通信,返回一个存放jar包的地址(HDFS)和jobId

    (3).client将jar包写入到HDFS当中(path = hdfs上的地址 + jobId)

    (4).开始提交任务(任务的描述信息,不是jar, 包括jobid,jar存放的位置,配置信息等等)

    (5).ResourceManage(JobTracker)进行初始化任务

    (6).读取HDFS上的要处理的文件,开始计算输入分片,每一个分片对应一个MapperTask

    (7).TaskTracker通过心跳机制领取任务(任务的描述信息)

    (8).下载所需的jar,配置文件等

    (9).TaskTracker启动一个java child子进程,用来执行具体的任务(MapperTask或ReducerTask)

    (10).将结果写入到HDFS当中


     7. 3.Mapper执行过程
   第一阶段是把输入文件按照一定的标准分片(InputSplit),
   每个输入片的大小是固定的。默认情况下,输入片(InputSplit)的大小与
   数据块(Block)的大小是相同的。如果数据块(Block)的大小是默认值64MB,
   输入文件有两个,一个是32MB,一个是72MB。那么小的文件是一个输入片,
   大文件会分为两个数据块,那么是两个输入片。一共产生三个输入片。
   每一个输入片由一个Mapper进程处理。这里的三个输入片,
   会有三个Mapper进程处理。
   第二阶段是对输入片中的记录按照一定的规则解析成键值对。
   有个默认规则是把每一行文本内容解析成键值对。“键”是每一行的起始位置(
   单位是字节),“值”是本行的文本内容。
   第三阶段是调用Mapper类中的map方法。
   第二阶段中解析出来的每一个键值对,调用一次map方法。·
   如果有1000个键值对,就会调用1000次map方法。每一次调用map方法会输出
   零个或者多个键值对。
   第四阶段是按照一定的规则对第三阶段输出的键值对进行分区。
   比较是基于键进行的。比如我们的键表示省份(如北京、上海、山东等),
   那么就可以按照不同省份进行分区,同一个省份的键值对划分到一个区中。
   默认是只有一个区。分区的数量就是Reducer任务运行的数量。
   默认只有一个Reducer任务。
   第五阶段是对每个分区中的键值对进行排序。首先,按照键进行排序,
   对于键相同的键值对,按照值进行排序。比如三个键值对<2,2>、<1,3>、<2,1>,
   键和值分别是整数。那么排序后的结果是<1,3>、<2,1>、<2,2>。如果有第六阶段,
   那么进入第六阶段;如果没有,直接输出到本地的linux文件中。
   第六阶段是对数据进行归约处理,也就是reduce处理。
   键相等的键值对会调用一次reduce方法。经过这一阶段,数据量会减少。
   归约后的数据输出到本地的linxu文件中。本阶段默认是没有的,
   需要用户自己增加这一阶段的代码。
     7. 4.Reducer执行过程
第一阶段是Reducer任务会主动从Mapper任务复制其输出的键值对。Mapper任务可能会有很多,因此Reducer会复制多个Mapper的输出。
第二阶段是把复制到Reducer本地数据,全部进行合并,即把分散的数据合并成一个大的数据。再对合并后的数据排序。
第三阶段是对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对。最后把这些输出的键值对写入到HDFS文件中。
在整个MapReduce程序的开发过程中,我们最大的工作量是覆盖map函数和覆盖reduce函数。

     7. 5.InputSplits包括 <文件名,起始位置,长度,主机列表>
1,在缺省情况下,一个mapreduce的job只有一个reducer;在大型集群中,需要使用许多reducer,中间数据都会放到一个reducer中处理,如果reducer数量不够,会成为计算瓶颈。
2,reducer的最优个数与集群中可用的reducer的任务槽数相关,一般设置比总槽数稍微少一些的reducer数量;Hadoop文档中推荐了两个公式:
0.95*NUMBER_OF_NODES*mapred.tasktracker.reduce.tasks.maximum

1.75*NUMBER_OF_NODES*mapred.tasktracker.reduce.tasks.maximum
     备注:NUMBER_OF_NODES是集群中的计算节点个数;

     mapred.tasktracker.reduce.tasks.maximum:任管管理器可同时运行reduce任务数

     7. 6.Partitioner

Partitioner 对map输出的中间态数据按照reduce的数目进行分区,一般通过hash来进行划分。默认的实现是HashPartitioner。

8.杀死一个Job 命令

hadoop job -kill jobidmapreded job -kill jobidmapred job -kill job_1456150847800_0001hadoop fs -rmr /folderhdfs dfs -rm -R /folder

    WritableComparable<T> extends Writable, Comparable<T>    public interface Comparable<T> {        publicint compareTo(T o);    }

hadoop为Key的数据类型必须实现WritableComparable,而Value的数据类型只需要实现Writable即可.
能做Key的一定可以做Value,能做Value的未必能做Key.

二、伪分布式搭建
一)、linux环境配置
问题:vmware workstation 克隆后网卡eth0不能正常工作
解决方法:
  • 修改/etc/udev/rules.d/70-persistent-net.rules
  • 将eth0这行注释掉或者删除,这里记载的还是克隆系统时的MAC地址,但是新启动的系统MAC已经更改,
  • 将NAME="eth1" 改为 “eth0”,ATTR 标记的MAC地址,这个是虚拟机为这个虚拟网卡分配的MAC,
  • 用上面的MAC替换掉 /etc/sysconfig/network-scripts/ifcfg-eth0中的MAC
  • 重启
解决方法二:
     不用eth0,直接用eth1等,把/etc/sysconfig/network-scripts/ifcfg-eth0复制成/etc/sysconfig/network-scripts/ifcfg-eth1,并修改此文件中的 IPADDR 和 HWADDR

二)、集群规划:

    主机名        IP                            安装的软件                      运行的进程

    hadoop1    192.168.1.101    jdk、hadoop                    NameNode、DFSZKFailoverController(zkfc)

    hadoop2    192.168.1.102    jdk、hadoop                    NameNode、DFSZKFailoverController(zkfc)

    hadoop3    192.168.1.103    jdk、hadoop                    ResourceManager(JobTracker)

    hadoop4    192.168.1.104    jdk、hadoop                    ResourceManager

    hadoop5    192.168.1.105    jdk、hadoop、zookeeper        DataNode、NodeManager、JournalNode、QuorumPeerMain

    hadoop6    192.168.1.106    jdk、hadoop、zookeeper        DataNode、NodeManager、JournalNode、QuorumPeerMain

    hadoop7    192.168.1.107    jdk、hadoop、zookeeper        DataNode、NodeManager、JournalNode、QuorumPeerMain


三)、安装步骤:
         搭建zookeeper,可以参考:【zookeeper 入门讲解实例 && 张总的zookeeper笔记】
          在这之前一定要安装JDK等环境
1.安装配置zookeeper集群(在hadoop5上)
        1.1解压
          tar -zxvf zookeeper-3.4.5.tar.gz -C /cluster/
        1.2修改配置
cd /cluster/zookeeper-3.4.5/conf/cp zoo_sample.cfg zoo.cfgvim zoo.cfg
            修改:dataDir=/cluster/zookeeper-3.4.5/tmp 这个是zookeeper的数据目录,根据自己情况修改。
            在最后添加:
            server.1=cluster5:2888:3888            server.2=cluster6:2888:3888            server.3=cluster7:2888:3888
            保存退出
            然后创建一个tmp文件夹
mkdir /cluster/zookeeper-3.4.5/tmp
再创建一个空文件
          touch /cluster/zookeeper-3.4.5/tmp/myid
最后向该文件写入ID
echo 1 > /cluster/zookeeper-3.4.5/tmp/myid<span style="color:#333333;"></span>
        1.3将配置好的zookeeper拷贝到其他节点
          #首先分别在cluster6、cluster7根目录下创建一个cluster目录,然后拷贝 :
mkdir /clusterscp -r /cluster/zookeeper-3.4.5/ cluster6:/cluster/scp -r /cluster/zookeeper-3.4.5/ cluster7:/cluster/
            注意:修改cluster6、cluster7对应/cluster/zookeeper-3.4.5/tmp/myid内容
cluster6:echo 2 > /cluster/zookeeper-3.4.5/tmp/myidcluster7:echo 3 > /cluster/zookeeper-3.4.5/tmp/myid
          还需要修改文件权限,不能为root:root

2.安装配置hadoop集群(在hadoop1上操作)

        2.1解压
          tar -zxvf hadoop-2.6.0.tar.gz -C /cluster/<span style="color:#333333;"></span>
        2.2配置HDFS(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下)
          #将hadoop添加到环境变量中 
          vim /etc/profile            export JAVA_HOME=/usr/java/jdk1.7.0_55            export HADOOP_HOME=/cluster/hadoop-2.6.0            export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
          #hadoop2.x的配置文件全部在$HADOOP_HOME/etc/hadoop下
cd /cluster/hadoop-2.6.0/etc/hadoop<span style="color:#333333;"></span>
          2.2.1修改hadoo-env.sh(最好修改,有的时候就算配置了JAVA_HOME也可能出现问题。)
export JAVA_HOME=/usr/java/jdk1.7.0_55

          2.2.2修改core-site.xml
<configuration>    <!-- 指定hdfs的nameservice为mycluster -->    <property>        <name>fs.defaultFS</name>        <value>hdfs://hadoopcluster</value>    </property>    <!-- 指定hadoop临时目录 -->    <property>        <name>hadoop.tmp.dir</name>        <value>/usr/local/soft/hadoop-2.6.0/tmp</value>    </property>    <!-- 指定zookeeper地址 -->    <property>        <name>ha.zookeeper.quorum</name>        <value>hadoop5:2181,hadoop6:2181,hadoop7:2181</value>    </property></configuration>

          2.2.3修改hdfs-site.xml
<configuration>    <!--指定hdfs的nameservice为hadoopcluster,需要和core-site.xml中的保持一致 -->    <property>        <name>dfs.nameservices</name>        <value>hadoopcluster</value>    </property>    <!-- hadoopcluster下面有两个NameNode,分别是nn1,nn2 -->    <property>        <name>dfs.ha.namenodes.hadoopcluster</name>        <value>nn1,nn2</value>    </property>    <!-- nn1的RPC通信地址 -->    <property>        <name>dfs.namenode.rpc-address.hadoopcluster.nn1</name>        <value>hadoop1:9000</value>    </property>    <!-- nn1的http通信地址 -->    <property>        <name>dfs.namenode.http-address.hadoopcluster.nn1</name>        <value>hadoop1:50070</value>    </property>    <!-- nn2的RPC通信地址 -->    <property>        <name>dfs.namenode.rpc-address.hadoopcluster.nn2</name>        <value>hadoop2:9000</value>    </property>    <!-- nn2的http通信地址 -->    <property>        <name>dfs.namenode.http-address.hadoopcluster.nn2</name>        <value>hadoop2:50070</value>    </property>    <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->    <property>        <name>dfs.namenode.shared.edits.dir</name>        <value>qjournal://hadoop5:8485;hadoop6:8485;hadoop7:8485/hadoopcluster</value>    </property>    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->    <property>        <name>dfs.journalnode.edits.dir</name>        <value>/usr/local/soft/hadoop-2.6.0/journal</value>    </property>    <!-- 开启NameNode失败自动切换 -->    <property>        <name>dfs.ha.automatic-failover.enabled</name>        <value>true</value>    </property>    <!-- 配置失败自动切换实现方式 -->    <property>        <name>dfs.client.failover.proxy.provider.hadoopcluster</name>        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>    </property>    <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->    <property>        <name>dfs.ha.fencing.methods</name>        <value>            sshfence            shell(/bin/true)        </value>    </property>    <!-- 使用sshfence隔离机制时需要ssh免登陆 -->    <property>        <name>dfs.ha.fencing.ssh.private-key-files</name>        <value>/root/.ssh/id_rsa</value>    </property>    <!-- 配置sshfence隔离机制超时时间 -->    <property>        <name>dfs.ha.fencing.ssh.connect-timeout</name>        <value>30000</value>    </property>    <!-- hdfs认证权限是否开启 -->    <property>        <name>dfs.permissions</name>        <value>false</value>    </property></configuration>          2.2.4修改mapred-site.xml<configuration>    <!-- 指定mr框架为yarn方式 -->    <property>        <name>mapreduce.framework.name</name>        <value>yarn</value>    </property></configuration>

          2.2.5修改yarn-site.xml

<configuration>    <!-- 开启RM高可靠 -->    <property>        <name>yarn.resourcemanager.ha.enabled</name>        <value>true</value>    </property>    <property>        <name>yarn.resourcemanager.recovery.enabled</name>        <value>true</value>    </property>    <property>        <name>yarn.resourcemanager.store.class</name>        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>    </property>    <!-- 指定RM的cluster id,详解:【Hadoop-2.4.1学习之高可用ResourceManager】 -->    <property>        <name>yarn.resourcemanager.cluster-id</name>        <value>yrc</value>    </property>    <!-- 指定RM的名字 -->    <property>        <name>yarn.resourcemanager.ha.rm-ids</name>        <value>rm1,rm2</value>    </property>    <!-- 分别指定RM的地址 -->    <property>        <name>yarn.resourcemanager.hostname.rm1</name>        <value>hadoop3</value>    </property>    <property>        <name>yarn.resourcemanager.hostname.rm2</name>        <value>hadoop4</value>    </property>    <!-- 指定zk集群地址 -->    <property>        <name>yarn.resourcemanager.zk-address</name>        <value>hadoop5:2181,hadoop6:2181,hadoop7:2181</value>    </property>    <property>        <name>yarn.nodemanager.aux-services</name>        <value>mapreduce_shuffle</value>    </property></configuration>

3.修改slaves

          #slaves是指定子节点的位置
          #因为要在cluster1上启动HDFS、在cluster3启动yarn
          #所以cluster1上的slaves文件指定的是datanode的位置
          #cluster3上的slaves文件指定的是nodemanager的位置
hadoop5hadoop6hadoop7

4.配置免密码登陆

          #首先要配置cluster1到cluster2、cluster3、cluster4、cluster5、cluster6、cluster7的免密码登陆
          #在cluster1上生产一对钥匙
          ssh-keygen -t rsa
          #将公钥拷贝到其他节点,包括自己
                ssh-copy-id cluster1                ssh-copy-id cluster2                ssh-copy-id cluster3                ssh-copy-id cluster4                ssh-copy-id cluster5                ssh-copy-id cluster6                ssh-copy-id cluster7
#配置cluster3到cluster4、cluster5、cluster6、cluster7的免密码登陆
#在cluster3上生产一对钥匙 (cluster3是resourcemanager,要把公钥配置到nodemanager和其他resourcemanager)
          ssh-keygen -t rsa
          #将公钥拷贝到其他节点
ssh-copy-id cluster4ssh-copy-id cluster5ssh-copy-id cluster6ssh-copy-id cluster7

#注意:两个namenode之间要配置ssh免密码登陆,别忘了配置cluster2到cluster1的免登陆
#(这里我又把hadoop2到每台机器的免密也给配置了,包括hadoop2)
#在cluster2上生产一对钥匙
ssh-keygen -t rsa
ssh-copy-id -i cluster1 #-i:指定公钥文件
               #备注:namenode到每台机器,resourcemanager到每台resourcemanager和namenode

5.将配置好的hadoop拷贝到其他节点
scp -r /cluster/ cluster2:/scp -r /cluster/ cluster3:/scp -r /cluster/hadoop-2.6.0/ root@cluster4:/cluster/scp -r /cluster/hadoop-2.6.0/ root@cluster5:/cluster/scp -r /cluster/hadoop-2.6.0/ root@cluster6:/cluster/scp -r /cluster/hadoop-2.6.0/ root@cluster7:/cluster/



6.启动zookeeper集群
          ###注意:严格按照下面的步骤
          #分别在cluster5、cluster6、tcast07上启动zk
cd /cluster/zookeeper-3.4.5/bin/./zkServer.sh start
          #查看状态:一个leader,两个follower
          ./zkServer.sh status
          #查看进程jps:
1131 QuorumPeerMain1205 Jps

7.启动journalnode
          #分别在在cluster5、cluster6、tcast07上执行
cd /cluster/hadoop-2.6.0sbin/hadoop-daemon.sh start journalnode

#运行jps命令检验,cluster5、cluster6、cluster7上多了JournalNode进程

8.格式化HDFS
#在cluster1上执行命令:
hdfs namenode -format

#格式化后,生成了namenode的版本号
/usr/local/soft/hadoop-2.6.0/tmp/dfs/name/current/VERSION:
#Sat Jun 11 14:33:32 CST 2016namespaceID=767803849clusterID=CID-7a5795c7-d6a1-4dc4-9396-1fa7f01ef8cdcTime=0storageType=NAME_NODEblockpoolID=BP-692324222-172.19.43.111-1465626812837layoutVersion=-60

#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,将hadoop.tmp.dir 对应的文件夹拷贝到cluster2的/cluster/hadoop-2.6.0/下:
scp -r /usr/local/soft/hadoop-2.6.0/tmp hadoop2:/usr/local/soft/hadoop-2.6.0/

9.格式化ZK(在cluster1上执行即可)
hdfs zkfc -formatZK

10.启动HDFS(在cluster1上执行)
sbin/start-dfs.sh

11.验证HDFS HA
          #首先向hdfs上传一个文件
hadoop fs -put /etc/profile /profilehadoop fs -ls /
          #通过浏览器访问:http://hadoop1:50070
Overview 'hadoop1:9000' (active)
          #通过浏览器访问:http://hadoop2:50070
Overview 'hadoop2:9000' (standby)
          #此时hadoop1上的进程:
[root@hadoop1 soft]# jps1475 NameNode2087 Jps<span style="color:#FF0000;">1740 DFSZKFailoverController</span>
          #然后再kill掉active的NameNode
kill -9 <pid of NN>
          #这个时候cluster2上的NameNode变成了active
          #在执行命令:
hadoop fs -ls /输出结果:-rw-r--r--   3 root supergroup       1926 2014-02-06 15:36 /profile
          #手动启动那个挂掉的NameNode
sbin/hadoop-daemon.sh start namenode
          #通过浏览器访问:http://192.168.1.101:50070
Overview 'hadoop1:9000' (standby)

12.启动YARN
          #在cluster3上执行
./start-yarn.sh
          #把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动
          #在cluster4上执行
yarn-daemon.sh start resourcemanager
    
     测试ResourceManager          
          #浏览器访问http://cluster3:8088/cluster
          #然后在cluster3上
kill -9 1964 ResourceManager
          #浏览器访问http://cluster4:8088/cluster
          #到这说明 ResourceManager的故障自动恢复已经配置完成!
          #备注:
    1. resourcemanager同时只有一个工作,如果有两个进程同时工作,其中一个为standby,此时用浏览器访问standby的节点,就会自动跳转到active的节点地址。
    2. resourcemanager在启动时,海量要手动使用yarn-daemon.sh start resourcemanager启动其他的RM。
     测试hdfs
          #hadoop-2.6.0配置完毕,可以浏览器访问:
http://192.168.1.101:50070
NameNode 'cluster1:9000' (active)
http://192.168.1.102:50070
NameNode 'cluster2:9000' (standby)

     验证YARN
          #运行一下hadoop提供的demo中的WordCount程序:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /profile /out

0 0
原创粉丝点击