Hadoop生产环境的配置札记

1、目录规划



Master1/192.168.1.101

Master2/192.168.1.102

Slave1/192.168.1103

Slave2/192.168.1.17104

Slave3/192.168.1.17105

namenode

datanode

resourcemanager

journalnode

zookeeper


Journalnode和ZooKeeper保持奇数个,这点大家要有个概念,最少不少于 3 个节点

2、软件规划

软件

版本

位数

说明

jdk

jdk1.7

64位

最新稳定版本

centos

centos6.5

64位

 

zookeeper

Apache zookeeper3.4.6

 

稳定版本

hadoop

Apache hadoop2.6.0

 

稳定版本


3、用户规划

节点名称

用户组

用户

 

Master1

hadoop

hadoop

 

Master2

hadoop

hadoop

 

Slave1

hadoop

hadoop

 

Slave2

hadoop

hadoop

 

Slave3

hadoop

hadoop

 


4、目录规划

所有软件目录

/home/hadoop/app/

所有数据和日志目录

/home/hadoop/data/


5.时钟同步
所有节点的系统时间要与当前时间保持一致。
查看当前系统时间
date
Tue Nov  3 06:06:04 CST 2015
如果系统时间与当前时间不一致,进行以下操作。

[root@Master1 ~]# cd /usr/share/zoneinfo/
[root@Maseter1 zoneinfo]# ls                //找到Asia
[root@Master1 zoneinfo]# cd Asia/           //进入Asia目录
[root@Maseter1 Asia]# ls           //找到Shanghai
[root@Maseter1  Asia]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime              //当前时区替换为上海
我们可以同步当前系统时间和日期与NTP(网络时间协议)一致。

[root@Maseter1 Asia]# yum install ntp   //如果ntp命令不存在,在线安装ntp
[root@Maseter1 Asia]# ntpdate pool.ntp.org           //执行此命令同步日期时间
[root@Maseter1 Asia]# date          //查看当前系统时间
6.hosts文件检查

hosts文件检查
所有节点的hosts文件都要配置静态ip与hostname之间的对应关系。

[root@djt11 Asia]# vi /etc/hosts
192.168.1.101 Master1
192.168.1.102 Master2
192.168.1.103 Slave1
192.168.1.104 Slave2
192.168.1.105 Slave3
禁用防火墙
所有节点的防火墙都要关闭。
查看防火墙状态

[root@Master1 Asia]# service iptables status
iptables: Firewall is not running.
如果不是上面的关闭状态,则需要关闭防火墙。

[root@Master1  Asia]#  chkconfig iptables off                 //永久关闭防火墙
[root@Master1 Asia]#  service iptables stop          /
创建hadoop用户

[root@Master1 ~]# groupadd hadoop //创建用户组
[root@Master1 ~]# useradd -g hadoop hadoop //新建hadoop用户并增加到hadoop工作组
[root@Master1 ~]# passwd hadoop    //设置密码
配置SSH免密码通信

[root@Master1~]# su hadoop          //切换到hadoop用户下
[hadoop@Master1root]$ cd           //切换到hadoop用户目录
[hadoop@Master1~]$ mkdir .ssh
[hadoop@Master1~]$ ssh-keygen -t rsa                 //执行命令一路回车,生成秘钥
[hadoop@Master1~]$cd .ssh
[hadoop@Master1.ssh]$ ls
id_rsa  id_rsa.pub
[hadoop@Master1.ssh]$ cat id_ras.pub >> authorized_keys               //将公钥保存到authorized_keys认证文件中
[hadoop@Master1.ssh]$ ls
authorized_keys  id_rsa  id_rsa.pub
[hadoop@Master1.ssh]$ cd ..
[hadoop@Master1~]$ chmod 700 .ssh
[hadoop@Master1~]$ chmod 600 .ssh/*
[hadoop@Master1~]$ ssh Master1              //第一次执行需要输入yes
[hadoop@Master1~]$ ssh Master1
每个节点都同样的操作
将所有节点中的共钥id_ras.pub拷贝到Master1中的authorized_keys文件中。

cat ~/.ssh/id_rsa.pub | ssh hadoop@Master1 'cat >> ~/.ssh/authorized_keys  所有节点都需要执行这条命令
然后将Master1中的authorized_keys文件分发到所有节点上面。

scp -r authorized_keys hadoop@Master2:~/.ssh/
scp -r authorized_keys hadoop@Slave1:~/.ssh/
scp -r authorized_keys hadoop@Slave2:~/.ssh/
scp -r authorized_keys hadoop@Slave3:~/.ssh/
大家通过ssh 相互访问,如果都能无密码访问,代表ssh配置成功

脚本工具的使用
在Master1节点上创建/home/hadoop/tools目录。

[hadoop@Master1 ~]$ mkdir /home/hadoop/tools
cd /home/hadoop/tools
将本地脚本文件上传至/home/hadoop/tools目录下。这些脚本大家如果能看懂也可以自己写, 如果看不懂直接使用就可以,后面慢慢补补Linux相关的知识。

[hadoop@Master1tools]$ rz deploy.conf
[hadoop@Master1tools]$ rz deploy.sh
[hadoop@Master1tools]$ rz runRemoteCmd.sh
[hadoop@Master1tools]$ ls
deploy.conf  deploy.sh  runRemoteCmd.sh
查看一下deploy.conf配置文件内容。

[hadoop@Master1tools]$ cat deploy.conf
Master1,all,namenode,zookeeper,resourcemanager,
Master1,all,slave,namenode,zookeeper,resourcemanager,
Slave1,all,slave,datanode,zookeeper,
Slave2,all,slave,datanode,zookeeper,
Slave3,all,slave,datanode,zookeeper,
查看一下deploy.sh远程复制文件脚本内容。

[hadoop@Master1 tools]$ cat deploy.sh
#!/bin/bash
#set -x
if [ $# -lt 3 ]
then
  echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag"
  echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag confFile"
  exit
fi
src=$1
dest=$2
tag=$3
if [ 'a'$4'a' == 'aa' ]
then
  confFile=/home/hadoop/tools/deploy.conf
else
  confFile=$4
fi
if [ -f $confFile ]
then
  if [ -f $src ]
  then
    for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'`
    do
       scp $src $server":"${dest}
    done
  elif [ -d $src ]
  then
    for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'`
    do
       scp -r $src $server":"${dest}
    done
  else
      echo "Error: No source file exist"
  fi
 
else
  echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi
查看一下runRemoteCmd.sh远程执行命令脚本内容。

[hadoop@Master1 tools]$ cat runRemoteCmd.sh
#!/bin/bash
#set -x
if [ $# -lt 2 ]
then
  echo "Usage: ./runRemoteCmd.sh Command MachineTag"
  echo "Usage: ./runRemoteCmd.sh Command MachineTag confFile"
  exit
fi
 
cmd=$1
tag=$2
if [ 'a'$3'a' == 'aa' ]
then
  confFile=/home/hadoop/tools/deploy.conf
else
  confFile=$3
fi
if [ -f $confFile ]
then
    for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'`
    do
       echo "*******************$server***************************"
       ssh $server "source /etc/profile; $cmd"
    done
else
  echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi
以上三个文件,方便我们搭建hadoop分布式集群。具体如何使用看后面如何操作。

如果我们想直接使用脚本,还需要给脚本添加执行权限。

[hadoop@Master1 tools]$ chmod u+x deploy.sh
[hadoop@Master1 tools]$ chmod u+x runRemoteCmd.sh
同时我们需要将/home/hadoop/tools目录配置到PATH路径中。

[hadoop@Master1 tools]$ su root
Password:
[root@Master1 tools]# vi /etc/profile
PATH=/home/hadoop/tools:$PATH
export PATH
 

用脚本runRemoteCmd.sh “/home/hadoop/app”all
在所有节点上创建软件目录

jdk安装
将本地下载好的jdk1.7,上传至djt11节点下的/home/hadoop/app目录。

[root@Master1 tools]# su hadoop
[hadoop@Master1 tools]$ cd /home/hadoop/app/
[hadoop@Master1 app]$ rz           //选择本地的下载好的jdk-7u79-linux-x64.tar.gz
[hadoop@Master1 app]$ ls
jdk-7u79-linux-x64.tar.gz
[hadoop@Master1 app]$ tar zxvf jdk-7u79-linux-x64.tar.gz               //解压
[hadoop@Master1 app]$ ls
jdk1.7.0_79 jdk-7u79-linux-x64.tar.gz
[hadoop@Master1 app]$ rm jdk-7u79-linux-x64.tar.gz            //删除安装包
添加jdk环境变量。

[hadoop@Master1 app]$ su root
Password:
[root@Master1 app]# vi /etc/profile
JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
[root@djt11 app]# source /etc/profile                //使配置文件生效
查看jdk是否安装成功。

[root@Master1 app]# 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)
出现以上结果就说明Master1 节点上的jdk安装成功。

然后将Master1 下的jdk安装包复制到其他节点上。

[hadoop@Master1 app]$ deploy.sh jdk1.7.0_79 /home/hadoop/app/ slave
Master1,Master2,Master3,Master4节点重复Master1节点上的jdk配置环境变量即可

Zookeeper安装
将本地下载好的zookeeper-3.4.6.tar.gz安装包,上传至Master1节点下的/home/hadoop/app目录下。

[hadoop@Master1 app]$ rz           //选择本地下载好的zookeeper-3.4.6.tar.gz
[hadoop@Master1 app]$ ls
jdk1.7.0_79 zookeeper-3.4.6.tar.gz
[hadoop@Master1 app]$ tar zxvf zookeeper-3.4.6.tar.gz                 //解压
[hadoop@Master1 app]$ ls
jdk1.7.0_79 zookeeper-3.4.6.tar.gz zookeeper-3.4.6
[hadoop@Master1 app]$ rm zookeeper-3.4.6.tar.gz               //删除zookeeper-3.4.6.tar.gz安装包
[hadoop@Master1 app]$ mv zookeeper-3.4.6 zookeeper            //重命名
                  
修改Zookeeper中的配置文件。

[hadoop@Master1 app]$ cd /home/hadoop/app/zookeeper/conf/
[hadoop@Master1 conf]$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
[hadoop@Master1 conf]$ cp zoo_sample.cfg zoo.cfg              //复制一个zoo.cfg文件
[hadoop@Master1 conf]$ vi zoo.cfg
dataDir=/home/hadoop/data/zookeeper/zkdata          //数据文件目录
dataLogDir=/home/hadoop/data/zookeeper/zkdatalog             //日志目录
# the port at which the clients will connect
clientPort=2181           //默认端口号
#server.服务编号=主机名称:Zookeeper不同节点之间同步和通信的端口:选举端口(选举leader)
server.1=Master1:2888:3888
server.2=Master2:2888:3888
server.3=Slave1:2888:3888
server.4=Slave2:2888:3888
server.5=Slave3:2888:3888
通过远程命令deploy.sh将Zookeeper安装目录拷贝到其他节点上面。

[hadoop@Master1 app]$ deploy.sh zookeeer /home/hadoop/app  slave
通过远程命令runRemoteCmd.sh在所有的节点上面创建目录:

[hadoop@Master1 app]$ runRemoteCmd.sh "mkdir -p /home/hadoop/data/zookeeper/zkdata" all   //创建数据目录
[hadoop@Master1 app]$ runRemoteCmd.sh "mkdir -p /home/hadoop/data/zookeeper/zkdatalog" all   //创建日志目录
然后分别在Master1、Master2、Slave1、Slave2、Slave3上面,进入zkdata目录下,创建文件myid,里面的内容分别填充为:1、2、3、4、5, 这里我们以Master1为例。

[hadoop@Master1 app]$ cd /home/hadoop/data/zookeeper/zkdata
[hadoop@Master1 zkdata]$ vi myid
1        //输入数字1
                  
配置Zookeeper环境变量。

[hadoop@Master1 zkdata]$ su root
Password:
[root@Master1 zkdata]# vi /etc/profile
JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
ZOOKEEPER_HOME=/home/hadoop/app/zookeeper
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH ZOOKEEPER_HOME
[root@Master1 zkdata]# source /etc/profile           //使配置文件生效
runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh start" zookeeper
runRemoteCmd.sh “jps” all 查看是否安装成功
runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh stop" zookeeper
hadoop集群环境搭建
将下载好的apache hadoop-2.6.0.tar.gz安装包,上传至Master1 节点下的/home/hadoop/app目录下。

[hadoop@Master1 app]$ rz  //将本地的hadoop-2.6.0.tar.gz安装包上传至当前目录
[hadoop@Master1 app]$ ls
hadoop-2.6.0.tar.gz jdk1.7.0_79  zookeeper
[hadoop@Master1 app]$ tar zxvf hadoop-2.6.0.tar.gz            //解压
[hadoop@Master1 app]$ ls
hadoop-2.6.0 hadoop-2.6.0.tar.gz jdk1.7.0_79  zookeeper
[hadoop@Master1 app]$ rm hadoop-2.6.0.tar.gz                  //删除安装包
[hadoop@Master1 app]$ mv hadoop-2.6.0 hadoop                  //重命名
                  
切换到/home/hadoop/app/hadoop/etc/hadoop/目录下,修改配置文件。

[hadoop@Master1 app]$ cd /home/hadoop/app/hadoop/etc/hadoop/
配置HDFS
配置hadoop-env.sh
[hadoop@Master1 hadoop]$ vi hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
                  
配置core-site.xml
[hadoop@Master1 hadoop]$ vi core-site.xml<configuration>
         <property>
                  <name>fs.defaultFS</name>
                  <value>hdfs://cluster1</value>
         </property>
         < 这里的值指的是默认的HDFS路径 ,取名为cluster1>
         <property>
                  <name>hadoop.tmp.dir</name>
                  <value>/home/hadoop/data/tmp</value>
         </property>
         < hadoop的临时目录,如果需要配置多个目录,需要逗号隔开,data目录需要我们自己创建>
         <property>
                  <name>ha.zookeeper.quorum</name>
                  <value>master1:2181,Master2:2181,Slave1:2181,Slave2:2181,                            Slave3:2181</value>
    </property>
    < 配置Zookeeper 管理HDFS>
</configuration>
 
配置hdfs-site.xml
[hadoop@Master1hadoop]$ vi hdfs-site.xml<configuration>
         <property>
                  <name>dfs.replication</name>
                  <value>3</value>
    </property>
         < 数据块副本数为3>
         <property>
                  <name>dfs.permissions</name>
                  <value>false</value>
         </property>
         <property>
                  <name>dfs.permissions.enabled</name>
                  <value>false</value>
         </property>
         < 权限默认配置为false>
         <property>
                  <name>dfs.nameservices</name>
                  <value>cluster1</value>
         </property>
         < 命名空间,它的值与fs.defaultFS的值要对应,namenode高可用之后有两个namenode,cluster1是对外提供的统一入口>
         <property>
                  <name>dfs.ha.namenodes.cluster1</name>
                  <value>Master1,Master2</value>
         </property>
         < 指定 nameService 是 cluster1 时的nameNode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可>
         <property>
                  <name>dfs.namenode.rpc-address.cluster1.Master1</name>
                  <value>Master2:9000</value>
         </property>
         < djt11 rpc地址>
         <property>
                  <name>dfs.namenode.http-address.cluster1.Master1</name>
                  <value>Master2:50070</value>
         </property>
         < djt11 http地址>
         <property>
                  <name>dfs.namenode.rpc-address.cluster1.Master2</name>
                  <value>Master2:9000</value>
         </property>
         < djt12 rpc地址>
         <property>
                  <name>dfs.namenode.http-address.cluster1.Master2</name>
                  <value>Master2:50070</value>
         </property>
         < djt12 http地址>
         <property>
                  <name>dfs.ha.automatic-failover.enabled</name>
                  <value>true</value>
    </property>
         < 启动故障自动恢复>
         <property>
                  <name>dfs.namenode.shared.edits.dir</name>
                  <value>qjournal://Master1:8485;Master2:8485;Slave1:8485;Slave2:8485;Slave3:8485/cluster1</value>
         </property>
         < 指定journal>
         <property>
                  <name>dfs.client.failover.proxy.provider.cluster1</name>
                  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
         < 指定 cluster1 出故障时,哪个实现类负责执行故障切换>
    <property>
                  <name>dfs.journalnode.edits.dir</name>
                  <value>/home/hadoop/data/journaldata/jn</value>
    </property>
         < 指定JournalNode集群在对nameNode的目录进行共享时,自己存储数据的磁盘路径 >
         <property>
                  <name>dfs.ha.fencing.methods</name>
                  <value>shell(/bin/true)</value>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hadoop/.ssh/id_rsa</value>
    </property>
         <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>10000</value>
    </property>
         < 脑裂默认配置>
    <property>
                  <name>dfs.namenode.handler.count</name>
                  <value>100</value>
    </property></configuration>
配置 slave

[hadoop@Master1 hadoop]$ vi slaves
Slave1
Slave2
Slave3
YARN安装配置

配置mapred-site.xml

[hadoop@Master hadoop]$ vi mapred-site.xml<configuration>
         <property>
                  <name>mapreduce.framework.name</name>
                  <value>yarn</value>
         </property>
         <指定运行mapreduce的环境是Yarn,与hadoop1不同的地方></configuration>
                  
配置yarn-site.xml

[hadoop@Master1 hadoop]$ vi yarn-site.xml
<configuration><property>
         <name>yarn.resourcemanager.connect.retry-interval.ms</name>
         <value>2000</value></property>< 超时的周期><property>
         <name>yarn.resourcemanager.ha.enabled</name>
         <value>true</value></property>< 打开高可用><property>
         <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
         <value>true</value></property><启动故障自动恢复><property>
         <name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
         <value>true</value></property>
<failover使用内部的选举算法 style="box-sizing: border-box; margin: 0px; padding: 0px;"><property>
         <name>yarn.resourcemanager.cluster-id</name>
         <value>yarn-rm-cluster</value></property><给yarn cluster 取个名字yarn-rm-cluster><property>
         <name>yarn.resourcemanager.ha.rm-ids</name>
         <value>rm1,rm2</value></property><给ResourceManager 取个名字 rm1,rm2><property>
         <name>yarn.resourcemanager.hostname.rm1</name>
         <value>Master1</value></property><配置ResourceManager rm1 hostname><property>
         <name>yarn.resourcemanager.hostname.rm2</name>
         <value>Master2</value></property><配置ResourceManager rm2 hostname><property>
         <name>yarn.resourcemanager.recovery.enabled</name>
         <value>true</value></property><启用resourcemanager 自动恢复><property>
         <name>yarn.resourcemanager.zk.state-store.address</name>
         <value>Master1:2181,Master2:2181,Slave1:2181,Slave2:2181,Slave3:2181</value></property><配置Zookeeper地址><property>
         <name>yarn.resourcemanager.zk-address</name>
         <value>Master1:2181,Master2:2181,Slave1:2181,Slave2:2181,Slave3:2181</value></property><配置Zookeeper地址><property>
         <name>yarn.resourcemanager.address.rm1</name>
         <value>Master1:8032</value></property>< rm1端口号><property>
         <name>yarn.resourcemanager.scheduler.address.rm1</name>
         <value>Master1:8034</value></property>< rm1调度器的端口号><property>
         <name>yarn.resourcemanager.webapp.address.rm1</name>
         <value>Master1:8088</value></property>< rm1 webapp端口号><property>
         <name>yarn.resourcemanager.address.rm2</name>
         <value>Master2:8032</value></property>< rm2端口号><property>
         <name>yarn.resourcemanager.scheduler.address.rm2</name>
         <value>Master2:8034</value></property>< rm2调度器的端口号><property>
         <name>yarn.resourcemanager.webapp.address.rm2</name>
         <value>Master2:8088</value></property>< rm2 webapp端口号><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><执行MapReduce需要配置的shuffle过程></configuration>
向所有节点分发hadoop安装包。

[hadoop@Master1 app]$ deploy.sh hadoop /home/hadoop/app/ slave
1、启动所有Zookeeper

[hadoop@Master1 hadoop]$ runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh start" zookeeper
2、每个节点分别启动journalnode

[hadoop@Master1 hadoop]$ runRemoteCmd.sh "/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode" all
3、主节点执行格式化

[hadoop@Master1 hadoop]$ bin/hdfs namenode -format / /namenode 格式化
[hadoop@Master1 hadoop]$ bin/hdfs zkfc -formatZK //格式化高可用
[hadoop@Master1 hadoop]$bin/hdfs namenode //启动namenode
                  
4、备节点执行

[hadoop@Master1 hadoop]$ bin/hdfs namenode -bootstrapStandby //同步主节点和备节点之间的元数据
                  
5、停掉hadoop,在Master1按下ctrl+c结束namenode

[hadoop@Master1 hadoop]$ runRemoteCmd.sh "/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh stop journalnode" all       //然后停掉各节点的journalnode
6、一键启动hdfs相关进程

[hadoop@Master1 hadoop]$ sbin/start-dfs.sh
7、在Master1节点上执行。

[hadoop@Master2 hadoop]$ sbin/start-yarn.sh
                  
8、在Master2节点上面执行。

[hadoop@Master2 hadoop]$ sbin/yarn-daemon.sh start resourcemanager
9、验证namenode:

http://Master1:50070
http://Master2:50070
10、验证yarn:

http://Master1:8088
http://Master2:8088


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值