Hadoop运行环境搭建

Linux虚拟机安装请看:

主机规划:

虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_JAVA


虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_linux_02


虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_zookeeper_03

一、虚拟机环境准备

1. 克隆虚拟机

先选定要克隆的机器zaz01------菜单栏上的虚拟机------管理-------克隆

虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_JAVA_04

虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_zookeeper_05

虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_zookeeper_06

虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_JAVA_07

虚拟机的名字自己取,点完成即可,这样虚拟机就克隆好了。

2.修改主机名

打开虚拟机以后先root
然后执行:vi /etc/sysconfig/network 命令
将HOSTNAME= 后面的改成你想要改的名字。
按下esc。
:wq 保存退出。

3.虚拟机网络配置

先输入 ifconfig 看看有没有什么问题。

虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_JAVA_08


此时网络有问题。

执行:vi /etc/udev/rules.d/70-persistent-net.rules

虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_JAVA_09


把倒数第一行的eth1改为eth0

记住倒数第二行的00:0c:29:84:6d:7b


虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_zookeeper_10


删除或注释。

最后变成:

虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_虚拟机安装hadoop时出现错误_11

然后执行:vi /etc/sysconfig/network-scripts/ifcfg-eth0

虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_zookeeper_12

把HWADDR改成刚才记住的6对数据。

把BOOTPROTO改成dhcp

把:

虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_虚拟机安装hadoop时出现错误_13

这三行用#注释掉。

用:reboot 重启虚拟机

输入:ifconfig

虚拟机安装hadoop时出现错误 hadoop虚拟机环境准备步骤_linux_14

说明网络配置好了。

接着输入:vi /etc/sysconfig/network-scripts/ifcfg-eth0 把BOOTPROTO改成static
把注释的解开。

捆绑主机和IP地址:
输入: vi /etc/hosts

把最后一行的ip地址最后三个数改掉,主机名改成你现在的主机名。
这样网络就配置好了。

4.关闭防火墙

临时关闭: service iptables stop 永久关闭:chkconfig iptables off 重启:reboot 后生效

5.修改时间

date 查看当前时间
cd /usr/share/zoneinfo/ 进入时间区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 复制
yum install ntp 下载ntp
ntpdate pool.ntp.org 同步时间

运行完上面几个步骤就可以看到是你当前的电脑时间了。

6.配置免密码登录

为hadoop用户配置SSH免密码登录功能:
su hadoop (切换到hadoop用户)
cd (回到hadoop用户的根目录下)
mkdir .ssh (创建一个.ssh文件夹或目录)
ssh-keygen -t rsa(ssh-keygen是密钥生成器,-t是一个参数,rsa是一种加密算法)
cd .ssh/(进行.ssh目录)
cat id_rsa.pub >> authorized_keys(将公钥文件id_rsa.pub中的内容复制到相同目录下的authorized_keys文件中)
cd ..(切换到hadoop用户的根目录)
chmod 700 .ssh (为.ssh目录设置目录所有者权限为可读、可写、可运行,群组或其它人员没有任何请问权限)
chmod 600 .ssh/* (设置.ssh目录下的文件所有者权限为可读、可写,群组或其它人员没有任何请问权限)

ssh zaz01(zaz01是我的主机名,这里你把它改成自己的主机名)(执行了这条命令后,在那上面输入yes就可以了)

7.集群脚本工具的使用。

在zaz01节点,hadoop3用户下创建/home/hadoop3/tools目录。 mkdir /home/hadoop3/tools 进入该目录:cd /home/hadoop3/tools 将本地脚本文件上传至/home/hadoop3/tools目录下,这些脚本大家可以自己写, 如果不熟练也可以直接使用。

[hadoop3@zaz01r tools]$ rz deploy.conf [hadoop3@zaz01 tools]$ rz deploy.sh [hadoop3@zaz01 tools]$ rz runRemoteCmd.sh [hadoop3@zaz01 tools]$ ls deploy.conf deploy.sh runRemoteCmd.sh

deploy.con的配置文件内容:

zaz01,all,namenode,zookeeper,resourcemanager,
zaz02,all,slave,namenode,zookeeper,resourcemanager,
zaz03,all,slave,datanode,zookeeper,

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/hadoop3/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远程执行命令脚本内容:

#!/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/hadoop3/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

三个文件,方便我们搭建hadoop3分布式集群。

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

[hadoop3@zaz01 tools]$ chmod u+x deploy.sh [hadoop3@zaz01 tools]$ chmod u+x runRemoteCmd.sh

同时我们需要将/home/hadoop3/tools目录配置到PATH路径中。

[hadoop3@zaz01 tools]$`vi ~/.bashrc`
 PATH=/home/hadoop3/tools:$PATH 
 export PATH

我们在zaz01节点上,通过runRemoteCmd.sh脚本,一键创建所有节点的软件安装目录.

[hadoop3@zaz01 tools]$ runRemoteCmd.sh "mkdir /home/hadoop3/app" all

安装JDK

查询是否安装Java软件:rpm -qa | grep java 如果安装的版本低于1.7,卸载该JDK: sudo rpm -e 软件包 查看JDK安装路径:which java 1

下载jdk1.8至本地,然后将jdk1.8上传至/home/hadoop3/app目录下。

导入文件:rz 导入你Windows的系统中下载好的jdk安装包。
rz 导入不进来 ,可以试试 rz -b 或者rz -wb

解压

[hadoop3@zaz01 app]$ tar –zxvf jdk-8u51-linux-x64.tar.gz

删除安装包:

[hadoop3@zaz01r app]$ rm –rf jdk-8u51-linux-x64.tar.gz [hadoop3@zaz01 app]$ ls jdk1.8.0_51

创建jdk软链接

[hadoop3@zaz01 app]$ ln –s jdk1.8.0_51 jdk

在hadoop3用户下,配置jdk环境变量

[hadoop3@zaz01 app]$ vi ~/.bashrc

JAVA_HOME=/home/hadoop3/app/jdk
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:/home/hadoop3/tools:$PATH
export JAVA_HOME CLASSPATH PATH

生效配置文件

[hadoop3@zaz01 app]$ source ~/.bashrc

确认jdk配置成功
[hadoop3@zaz01 app]$ java -version

java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

通过deploy.sh脚本将jdk安装目录分发到另外两个节点

[hadoop3@zaz01 app]$ deploy.sh jdk1.8.0_51 /home/hadoop3/app/ slave

在另外两个节点做相关操作,完成jdk配置.

Zookeeper安装

下载zookeeper-3.4.6.tar.gz安装包,然后上传至/home/hadoop3/app目录

解压、删除

[hadoop3@zaz01 app]$ tar –zxvf zookeeper-3.4.6.tar.gz

[hadoop3@zaz01 app]$ ls zookeeper-3.4.6

[hadoop3@zaz01 app]$ rm –rf zookeeper-3.4.6.tar.gz

修改配置文件
[hadoop3@zaz01 app]$ cd zookeeper-3.4.6/conf/ #进入这个目录
[hadoop3@zaz01 conf]$ cp zoo_sample.cfg zoo.cfg

[hadoop3@zaz01 conf]$vi zoo.cfg # 修改这个配置文件

#The number of milliseconds of each tick
 tickTime=2000
 #The number of ticks that the initial
 #synchronization phase can take
 initLimit=10
 #The number of ticks that can pass between
 #sending a request and getting an acknowledgement
 syncLimit=5
 #the directory where the snapshot is stored.
 #do not use /tmp for storage, /tmp here is just
 #example sakes.
 dataDir=/home/hadoop3/data/zookeeper/zkdata
 dataLogDir=/home/hadoop3/data/zookeeper/zkdatalog
 #the port at which the clients will connect
 clientPort=2181
 #the maximum number of client connections.
 #increase this if you need to handle more clients
 #maxClientCnxns=60
 #Be sure to read the maintenance section of the
 #administrator guide before turning on autopurge.
 #http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
 #The number of snapshots to retain in dataDir
 #autopurge.snapRetainCount=3
 #Purge task interval in hours
 #Set to “0” to disable auto purge feature
 #autopurge.purgeInterval=1
 server.1=zaz01:2888:3888
 server.2=zaz02:2888:3888
 server.3=zaz03:2888:3888

备注:
1 2 3代表服务编号;2888代表Zookeeper节点通信端口;3888代表zook选举端口

远程拷贝

通过远程脚本deploy.sh将Zookeeper安装目录拷贝到其他节点。
[hadoop3@zaz01 app]$ deploy.sh zookeeper-3.4.6 /home/hadoop3/app/ slave

所有节点创建数据目录和日志目录

[hadoop3@zaz01 app]$ runRemoteCmd.sh "mkdir -p /home/hadoop3/data/zookeeper/zkdata" all [hadoop3@zaz01 app]$ runRemoteCmd.sh "mkdir -p /home/hadoop3/data/zookeeper/zkdatalog" all

创建myid文件

在各个节点上,在 dataDir 所指定的目录下创一个名为 myid 的文件, 文件内容为各个server 点后面的数字。

[hadoop3@zaz01 zkdata]$ vi myid

输入一个1,然后:wq保存
三个节点都需要设置,第二个节点设置成2,第三个节点设置成3

测试运行:
使用runRemoteCmd.sh 脚本,启动所有节点上面的Zookeeper。

[hadoop3@zaz01 zookeeper-3.4.6]$runRemoteCmd.sh "/home/hadoop3/app/zookeeper-3.4.6/bin/zkServer.sh start" zookeeper

查看所有节点上面的QuorumPeerMain进程是否启动。

[hadoop3@zaz01 zookeeper-3.4.6]$ runRemoteCmd.sh "jps" all

查看所有Zookeeper节点状态。

[hadoop3@zaz01 zookeeper-3.4.6]$ runRemoteCmd.sh "/home/hadoop3/app/zookeeper-3.4.6/bin/zkServer.sh status"

如果一个节点为leader,另两个节点为follower,则说明Zookeeper安装成功。

Hadoop3.0分布式集群搭建

1配置HDFS

到Hadoop官网下载hadoop-3.0.0-alpha2.tar.gz,并上传至/home/hadoop3/app目录
解压、删除压缩包、重命名:

[hadoop3@zaz01 app]$tar –zxvf hadoop-3.0.0-alpha2.tar.gz #解压

[hadoop3@zaz01 app]$ ls#查看目录
hadoop-3.0.0-alpha2.tar.gz hadoop-3.0.0-alpha3

[hadoop3@zaz01 app]$ rm –rf hadoop-3.0.0-alpha2.tar.gz# 删除压缩包
[hadoop3@zaz01 app]$ mv hadoop-3.0.0-alpha3 hadoop-3.0.0#重命名

配置hadoop-env.sh

[hadoop3@zaz01 app]$ cd hadoop-3.0.0/etc/hadoop/ [hadoop3@zaz01 hadoop]$ vi hadoop-env.sh

export JAVA_HOME=/home/hadoop3/app/jdk
 export HADOOP_HOME=/home/hadoop3/app/hadoop

配置core-site.xml

[hadoop3@zaz01 hadoop]$ vi core-site.xml

fs.defaultFS
 hdfs://mycluster


hadoop.tmp.dir 
/home/hadoop3/data/tmp


ha.zookeeper.quorum   
zaz01:2181,zaz02:2181,zaz03:2181

配置hdfs-site.xml

[hadoop3@zaz01 hadoop]$ vi hdfs-site.xml

dfs.nameservices
  mycluster


  dfs.permissions.enabled
  false


  dfs.ha.namenodes.mycluster
  nn1,nn2,nn3


  dfs.namenode.rpc-address.mycluster.nn1
  zaz01:9820


  dfs.namenode.rpc-address.mycluster.nn2
  zaz02:9820


  dfs.namenode.rpc-address.mycluster.nn3
  zaz03:9820


  dfs.namenode.http-address.mycluster.nn1
  zaz01:9870


  dfs.namenode.http-address.mycluster.nn2
  zaz02:9870


  dfs.namenode.http-address.mycluster.nn3
  zaz03:9870


  dfs.ha.automatic-failover.enabled
  true
 

  dfs.namenode.shared.edits.dir
  qjournal://zaz01:8485;zaz02:8485;zaz03:8485/mycluster


  dfs.journalnode.edits.dir
  /home/hadoop3/data/journaldata/jn


  dfs.client.failover.proxy.provider.mycluster
  org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider


  dfs.ha.fencing.methods
  sshfence


  dfs.ha.fencing.ssh.private-key-files
  /home/hadoop3/.ssh/id_rsa


  dfs.ha.fencing.ssh.connect-timeout
  10000


  dfs.namenode.handler.count
  100


   dfs.ha.automatic-failover.enabled
   true

配置workers

[hadoop3@zaz01 hadoop]$ vi workers

zaz01
zaz02
zaz03

注意:hadoop2.x配置的是slaves文件,这里有所改变。

将hadoop3.0安装包分发到其他节点

[hadoop3@zaz01 app]$ deploy.sh hadoop-3.0.0 /home/hadoop3/app/ slave

创建hadoop3.0软连接

在所有节点上创建hadoop3.0软连接,这里以zaz01节点为例。

[hadoop3@zaz01 app]$ ln -s hadoop-3.0.0 hadoop
[hadoop3@zaz01 app]$ ls
hadoop  hadoop-3.0.0

配置hadoop3.0环境变量

在所有节点上配置hadoop3.0环境变量,这里以zaz01节点为例.

[hadoop3@zaz01 app]$ vi ~/.bashrc

JAVA_HOME=/home/hadoop3/app/jdk
HADOOP_HOME=/home/hadoop3/app/hadoop
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:HADOOP_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH HADOOP_HOME

格式化hdfs

第一次安装hdfs的时候,需要对hdfs进行相关的格式化操作,以后就不需要了。

先启动Zookeeper

[hadoop3@zaz01 app]$runRemoteCmd.sh "/home/hadoop3/app/zookeeper-3.4.6/bin/zkServer.sh start" al

接着启动journalnode

[hadoop3@zaz01 app]$ runRemoteCmd.sh "/home/hadoop3/app/hadoop/sbin/hadoop-daemon.sh start journalnode"

在zaz01节点上执行格式化

[hadoop3@zaz01 hadoop]$ bin/hdfs namenode -format #namenode 格式化
[hadoop3@zaz01 hadoop]$ bin/hdfs zkfc -formatZK #格式化高可用
[hadoop3@zaz01 hadoop]$bin/hdfs namenode #启动namenode

备用节点zaz02\zaz03通过zaz01节点元数据信息,分别在zaz02、zaz03节点上执行。

[hadoop3@zaz02 hadoop]$ bin/hdfs namenode -bootstrapStandby [hadoop3@zaz03 hadoop]$ bin/hdfs namenode -bootstrapStandby

zaz02 ,zaz03节点同步完zaz01上的元数据之后,在zaz01节点上按下ctrl+c来结束namenode进程。

关闭所有节点journalnode

[hadoop3@zaz01 app]$ runRemoteCmd.sh "/home/hadoop3/app/hadoop/sbin/hadoop-daemon.sh stop journalnode" all

启动HDFS

[hadoop3@zaz01 hadoop]$ sbin/start-dfs.sh

配置YARN

配置mapred-site.xml

[hadoop3@zaz01 hadoop]$ vi mapred-site.xml

mapreduce.framework.name
yarn


mapreduce.application.classpath

/home/hadoop3/app/hadoop/etc/hadoop,
    /home/hadoop3/app/hadoop/share/hadoop/common/*,
    /home/hadoop3/app/hadoop/share/hadoop/common/lib/*,
    /home/hadoop3/app/hadoop/share/hadoop/hdfs/*,
    /home/hadoop3/app/hadoop/share/hadoop/hdfs/lib/*,
    /home/hadoop3/app/hadoop/share/hadoop/mapreduce/*,
    /home/hadoop3/app/hadoop/share/hadoop/mapreduce/lib/*,
    /home/hadoop3/app/hadoop/share/hadoop/yarn/*,
    /home/hadoop3/app/hadoop/share/hadoop/yarn/lib/*

配置yarn-site.xml

[hadoop3@zaz01 hadoop]$ vi yarn-site.xml

yarn.resourcemanager.connect.retry-interval.ms
2000


yarn.resourcemanager.ha.enabled
true


yarn.resourcemanager.ha.automatic-failover.enabled
true


yarn.resourcemanager.ha.automatic-failover.embedded
true


yarn.resourcemanager.cluster-id
yarn-rm-cluster


yarn.resourcemanager.ha.rm-ids
rm1,rm2


yarn.resourcemanager.hostname.rm1
zaz01


yarn.resourcemanager.hostname.rm2
zaz02


yarn.resourcemanager.recovery.enabled
true

 The class to use as the persistent store.
 yarn.resourcemanager.store.class
 org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore


yarn.resourcemanager.zk.state-store.address
zaz01:2181,zaz02:2181,zaz03:2181


yarn.resourcemanager.zk-address
zaz01r:2181,zaz02:2181,zaz03:2181


yarn.resourcemanager.address.rm1
zaz01:8032


yarn.resourcemanager.scheduler.address.rm1
zaz01:8034


yarn.resourcemanager.webapp.address.rm1
zaz01:8088


yarn.resourcemanager.address.rm2
zaz02:8032


yarn.resourcemanager.scheduler.address.rm2
zaz02:8034


yarn.resourcemanager.webapp.address.rm2
zaz02:8088


yarn.nodemanager.aux-services
mapreduce_shuffle


yarn.nodemanager.aux-services.mapreduce_shuffle.class
org.apache.hadoop.mapred.ShuffleHandler

脚本分发修改的yarn配置

[hadoop3@zaz01 hadoop]$ deploy.sh mapred-site.xml /home/hadoop3/app/hadoop-3.0.0/etc/hadoop/ slave [hadoop3@zaz01 hadoop]$ deploy.sh yarn-site.xml /home/hadoop3/app/hadoop-3.0.0/etc/hadoop/ slave

启动yarn

在zaz01节点启动resourcemanager

[hadoop3@zaz01 hadoop]$ bin/yarn --daemon start resourcemanager

在zaz02节点启动resourcemanager

[hadoop3@zaz02 hadoop]$ bin/yarn --daemon start resourcemanager

在3个节点分别启动nodemanager

[hadoop3@zaz01 hadoop]$ bin/yarn --daemon start nodemanager [hadoop3@zaz02 hadoop]$ bin/yarn --daemon start nodemanager [hadoop3@zaz03 hadoop]$ bin/yarn --daemon start nodemanager

如果以上操作没有问题,说明Hadoop3.0分布式高可用集群成功搭建完毕。