Hadoop安装分为三种不同模式:
  本地模式:hadoop在运行时,不使用hdfs,而是使用linux操作系统的文件系统.(默认hadoop就是本地模式)
  伪分布模式:在一个节点上运行hadoop(指的是hadoop的各个进程都是在我们的一个节点上都是开启的).hadoop的"运行机制"和集群模式相似,
  集群模式:在生产中真正使用的,hadoop的各个进程运行在集群的很多节点上

集群开发环境部署:

  因为是在笔记本上做的实验,所以这里我选择三台机器安装,下面是各个节点的分配:

172.16.1.181    hadoop1    NameNode,JobTracker,TaskTracker,DataNode
     172.16.1.182    hadoop2    SecondaryNameNode,TaskTracker,DataNode
     172.16.1.183    hadoop3   TaskTracker,DataNode

  NameNode和JobTracker在生产中各自是一台机器,因为NameNode在运行时时需要消耗大量内存的,JobTracker接收用户的请求,对用户cpu要求稍微高一点,作为和我们用户直接做接口的这种进程,最好独立,保证资源的充分.
  使用阿里云和使用自己的机器的区别:最大的好处就是方便,我们不需要去维护这个集群,初期投资成本比较低
  机器采购硬件配置:cpu:2G的主频,内存越大越好,最小是32G或者是64G的,生产环境中32G或者是64G只能做一个节点来用.硬盘一般尽量去选择1T的多块硬盘

准备软件:

  虚拟机VMware,Linux Centos6.5,jdk-7u45-linux-x64.tar.gz,hadoop-1.1.2.tar.gz

配置静态ip地址:

  内网ip:我们的各个节点通过一台交换机或者一个路由在一起的.
  外网:虽然两台机器是在一起的,但是他们走的外网网络的话,它是从你的内网走出去到了外网,在进入到你的内网,再到另一台机器.
  外网配置后特别慢,内网相对比较快.

  DHCP动态的不利于我们去指定一个节点,静态管理还是比较方便的.
    (1)使用vi编辑文件vi /etc/sysconfig/network-scripts/ifcfg-Wired connectioin 1(不同的机器ifcfg-*文件名可能会不同)

BOOTPROTO=static    默认none,动态ip static表示静态ip
      IPADDR=172.16.1.181    指的是ip到底是什么
      NETMASK=255.255.255.0  掩码
      GATEWAY=172.16.1.1    网关,局域网中做交换机的那个,一般交换机扮演网关角色
      DNS1=172.16.1.1       DNS的配置
      保存退出

    (2)执行service network restart重启网卡设置
    (3)执行命令ifconfig查看配置结果是否正确

设置hostname:
   主机名:ip的一个代称,在当前网络环境中是有效的
    (1)使用vi编辑/etc/sysconfig/network
      把HOSTNAME的值改为hadoop1,保存退出.(重启之后永久生效)
    (2)执行hostname hadoop1,在当前环境中立即生效
    (3)执行命令hostname查看设置结果

绑定ip与hostname
   编辑文件/etc/hosts,增加ip与主机名的映射信息

172.16.1.181    hadoop1
     172.16.1.182    hadoop2
     172.16.1.183    hadoop3

关闭防火墙:
  用来拦截外部请求的,对于某个ip来访问某个端口等待,防火墙都会做拦截,关闭防火墙的目的,就是为了让我们的程序能够更容易的安装,部署.
  工作中hadoop集群内网的防火墙也是可以关闭的.内部的Hadoop集群不对外进行通信  

    (1)执行命令service iptables stop关闭防火墙
    (2)执行命令service iptables status查看防火墙是否正在运行.

关闭防火墙的自动运行:
  执行命令chkconfig iptables off

部署SSH(secure shell)免密码登陆:
  hadoop主节点启动的时候,会在我们的从节点启动进程,通过ssh 登陆之后,在他上面执行脚本之后登陆的
  ssh是一个加密的通信方式,这种加密是非对称加密,指的是我们有公钥和密钥这两个东西
    (1)执行命令 ssh-keygen -t rsa 产生公钥私钥文件,产生的文件位于~/.ssh目录下
    (2)执行命令ssh-copy-id -i hadoop2复制公钥文件到对方hadoop2中authorized_keys中去了.
    (3)ssh hadoop2,就可以实现真正的密码登录了
  只需要实现主节点到从节点的免密码登陆即可,不必要实现从节点到从节点的免密码登录.(因为我们的hadoop是主节点(hadoop1)去
  启动或关闭从节点(hadoop3,hadoop4,hadoop5)的进程,去调用脚本,我们的从节点不会调用主节点的脚本,所以ssh只需要主到从)
安装jdk

  将文件jdk-7u45-linux-x64.tar.gz上传到hadoop1上
    (1)cd /usr/locall
    (2)执行命令chmod u+x jdk-6u24-linux-i586.bin对文件赋执行权限
    (3)执行命令tar-zxvf jdk-7u45-linux-x64.tar.gz解压缩
    (4)mv jdk1.7.0_45 jdk
    (5)vi /etc/profile 增加如下内容:

export JAVA_HOME=/usr/local/jdl
     export PATH=.:$JAVA_HOME/bin:$PATH

    (6) source /etc/profile

以上步骤分别在hadoop2,hadoop3节点上执行配置.

部署hadoop:

  (1)在hadoop1上执行命令 /mnt/software/hadoop-1.1.2.tar.gz ~ 复制hadoop压缩包到home目录.
  (2)在hadoop1上执行命令tar -zxvf ~/hadoop-1.1.2.tar.gz 进行解压缩
    mv hadoop-1.1.2 hadoop
  (3)在hadoop1上执行命令vi /etc/profile 设置环境变量,增加了内容如下:

export HADOOP_HOME_WARN_SUPPRESS=1
     export HADOOP_HOME=/usr/local/hadoop
     export PATH=.:$HADOOP_HOME/bin:$PATH
     保存退出
     执行source /etc/profile
为了防止在启动的过程程序抛警告"Warning: $HADOOP_HOME is deprecated",加入如下代码:
     export HADOOP_HOME_WARN_SUPPRESS=1

  (4)编辑配置文件

    <1>conf/hadoop-env.sh
        修改第9行内容 export JAVA_HOME=/usr/local/jdk

    <2>conf/core-site.xml

        <configuration>
          <property>
            <name>fs.default.name</name>
            <value>hdfs://hadoop1:9000</value>
          </property>
          <property>
            <name>hadoop.tmp.dir</name>
            <value>/usr/local/hadoop/tmp</value>
          </property>
        </configuration>

    <3>conf/hdfs-site.xml

<configuration>
            <property>
                <name>dfs.http.address</name>
                <value>0.0.0.0:50070</value>
            </property>
            <property>
                <name>dfs.secondary.http.address</name>
                <value>0.0.0.0:0</value>
            </property>
            <property>
                <name>dfs.datanode.address</name>
                <value>0.0.0.0:0</value>
            </property>
            <property>
                <name>dfs.datanode.ipc.address</name>
                <value>0.0.0.0:0</value>
            </property>
            <property>
                <name>dfs.datanode.http.address</name>
                <value>0.0.0.0:0</value>
            </property>
            <property>
                <name>dfs.replication</name>
                <value>3</value>
            </property>
            <property>
                <name>dfs.permissions</name>
                <value>false</value>
            </property>
        </configuration>

    <4>conf/mapred-site.xml

<configuration>
            <property>
                <name>mapred.job.tracker</name>
                <value>hdfs://hadoop1:8000</value>
            </property>
            <property>
                <name>mapred.job.tracker.http.address</name>
                <value>0.0.0.0:50030</value>
            </property>
            <property>
                <name>mapred.task.tracker.http.address</name>
                <value>0.0.0.0:0</value>
            </property>
        </configuration>

    <5>修改masters文件(保存SecondaryNameNode)

hadoop2

    <6>修改slaves文件(指定从节点的位置)

hadoop3
            hadoop4
            hadoop5

  (5)在hadoop1上将配置好的/usr/local/hadoop分别复制到其他节点

scp -r hadoop* hadoop2:/usr/local/
        scp -r hadoop* hadoop3:/usr/local/
     scp /etc/profile hadoop2:/etc/ 
     scp /etc/profile hadoop3:/etc/

     分别在hadoop2,hadoop3上执行source /etc/profile

  (6)在hadoop1节点执行hadoop namenode -format 进行格式化
  (7)在hadoop1节点上执行命令start-all.sh 启动集群
  (8)检查是否启动成功:执行jps命令 浏览器访问hadoop1:50070(hdfs) hadoop1:50030(jobtracker)
    hadoop/logs 中查看启动日志 .out是临时文件
    查看端口:netstat -ant | grep 9000
    查看对应的进程号:ps -ef | grep 9000
    杀死进程 kill -9 9000

    关闭集群的方式:stop-all.sh 

以上的配置将NameNode和JobTracker都部署在一台机器上了,但是我们在生产中是分别将NameNode和JobTracker分别部署在不同的机器上的,所以我们做如下修改:

   我们假设NameNode在hadoop1上,JobTracker在hadoop2上

   (1)NameNode所在节点是通过core-site.xml中的fs.default.name的值体现出来的.
      这里不需要修改,还是hdfs://hadoop1:9000
   (2)JobTracker所在节点是通过mapred-site.xml的mapred.job.tracker的值体现的
      将值修改为hdfs://hadoop2:8000

   (3)重新启动集群:

      启动时不要使用start-all.sh,而应该使用hadoop-daemon.sh start ***命令启动:
      在hadoop1上执行命令hadoop-daemon.sh start namenode
      在hadoop2上执行命令hadoop-daemon.sh start jobtracker
      在hadoop2上执行命令hadoop-daemon.sh start secondarynamenode
      在hadoop1上执行命令hadoop-daemons.sh start datanode
      在hadoop1上执行命令hadoop-daemons.sh start tasktracker

关闭集群:
    按照启动相反的操作,将start改为stop即可.