一、环境准备

1.查看系统版本

cat /etc/issue

CentOS release 6.8 (Final)   

2.软件准备

软件自行官网下载,但自己要统一规划方便后面操作,本文软件源目录/usr/local/src

安装目录/usr/local

赋权限,以备后续步骤安装软件[安装包都在/usr/local/src] 

chown hadoop.hadoop /usr/local/src –R


3.配置主机名和hosts

三台机器(内存大于2G) 分别写hosts、设定hostname

192.168.100.11  mylab1  ----master

192.168.100.12  mylab2  ----slave1

192.168.100.13  mylab3  -----slave2


4.关闭selinux

临时关闭:

[root@mylab1 ~]# getenforce

Enforcing

[root@mylab1 ~]# setenforce 0

[root@mylab1 ~]# getenforce

Permissive

永久关闭selinux:

vim /etc/selinux/config

修改SELINUX=enforcing为SELINUX=disabled

5.关闭防火墙iptables

service iptables stop或/etc/init.d/iptables stop

chkconfig iptables off

6.所有机器同步时间 

ntpdate time.windows.com

注:一定要做,集群对时间要求高,不然后面启动会报错,也可以自己搭建ntp服务器(正常线上肯定是要其中一台搭建时间服务器来同步时间的)

7.创建hadoop用户

Hadoop为了安装使用普通用户登录

useradd hadoop

echo "hadoop"|passwd --stdin hadoop

增加权限:

visudo

hadoop ALL=(ALL)  ALL


8.切换hadoop用户

su - hadoop


9.配置SSH无密码登陆

master可以通过密钥登陆本机和两台slave

master上生成密钥对:

执行ssh-keygen 命令后一直回车

[hadoop@mylab1 ~]$ ssh-keygen


生成.ssh目录

ls .ssh/

id_rsa  id_rsa.pub

复制~/.ssh/id_rsa.pub 内容到本机和两台slave的 ~/.ssh/authorized_keys

设置本机和两台slave机器上的~/.ssh/authorized_keys文件权限为600

chmod 600 ~/.ssh/authorized_keys

cp id_rsa.pub authorized_keys

scp ~/.ssh/authorized_keys [email protected]:/home/hadoop/.ssh/

scp ~/.ssh/authorized_keys [email protected]:/home/hadoop/.ssh/

测试:

在master上执行

ssh master

ssh slave1

ssh slave2

可以直接登陆,即实现master免密码登录slave1,slave2

10.创建备用目录

mkdir -pv /usr/local/storage/zookeeper/{data,logs}   #创建zookeeper数据目录和日志目录

11.同步:

由于所有软件,配置文件,环境配置基本相同,所有本文所有操作都可以在一台服务器上操作执行,之后通过rsync,或scp等同步工具,同步到其他服务器,可避免重复性操作,切记,切记,切记

例如:rsync –av /usr/local/storage/  mylab2:/usr/local



二、部署应用

1.安装JAVA环境

先除已有jdk(如果有) rpm -e jdk(之前版本)

安装jdk

 rpm -ivh jdk-7u79-linux-x64.rpm

修改环境变量:vim /home/hadoop/.bashrc

JAVA_HOME=/usr/java/jdk1.7.0_79

JRE_HOME=/usr/java/jdk1.7.0_79/jre

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

export JAVA_HOME JRE_HOME PATH CLASSPAT

使环境变量生效:

source /home/hadoop/.bashrc

验证jdk安装成功 

java -version 版本显示为安装版本即正常


#注:所有服务器都要安装jdk


2.安装hadoop2.7

把hadoop安装包解压到每一个节点(可以解压到一个节点,然后完成后续第2步的配置后,再scp拷贝到其余节点)的固定目录下


1.1解压hadoop,并修改用户及用户组为hadoop

cd /usr/local/src/

tar xf hadoop-2.7.1.tar.gz

chown -R hadoop.hadoop hadoop-2.7.1

mv hadoop-2.7.1  /usr/local/hadoop

1.2执行一下命令检查hadoop是否可用

cd /usr/local/hadoop

./bin/hadoop version

查看是否显示hadoop版本信息

Hadoop 2.7.1 显示即正常,否则软件包有问题重新下载。


1.3在hadoop目录下创建如下目录

cd /usr/local/hadoop

mkdir tmp dfs dfs/data dfs/name   

1.4、设置Hadoop环境变量

vim /home/hadoop/.bashrc

JAVA_HOME=/usr/java/jdk1.7.0_79

JRE_HOME=/usr/java/jdk1.7.0_79/jre

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

export JAVA_HOME JRE_HOME PATH CLASSPAT



export HADOOP_HOME=/usr/local/hadoop

export HIVE_HOME=/usr/local/hive

export HBASE_HOME=/usr/local/hbase

export ZOOKEEPER=/usr/local/zookeeper

export HADOOP_INSTALL=$HADOOP_HOME

export HADOOP_MAPRED_HOME=$HADOOP_HOME

export HADOOP_COMMON_HOME=$HADOOP_HOME

export HADOOP_HDFS_HOME=$HADOOP_HOME

export YARN_HOME=$HADOOP_HOME

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop

export HDFS_CONF_DIR=${HADOOP_HOME}/etc/hadoop

export YARN_CONF_DIR=${HADOOP_HOME}/etc/hadoop

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:$HIVE_HOME/bin:$ZOOKEEPER/bin使环境变量生效

source ~/.bashrc

同步至其他服务器:

例如:

rsync –av /home/hadoop/.bashrc mylab2:/home/hadoop/



1.4、配置文件修改:

集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5个配置文件,更多设置项可点击查看官方说明,这里仅设置了正常启动所必须的设置项: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml

1.1、core-site.xml 

master上 vim /usr/local/hadoop/etc/hadoop/core-site.xml

   

        fs.defaultFS

        hdfs://192.168.100.11:9000

   

   

        hadoop.tmp.dir

        file:/usr/local/hadoop/tmp

   

   

        io.file.buffer.size

        131702

   

 

    hadoop.proxyuser.hduser.hosts

    *

 

 

    hadoop.proxyuser.hduser.groups

    *

 

 

 

    ha.zookeeper.quorum

    mylab1:2181,mylab2:2181,mylab3:2181

 

1.2、hdfs-site.xml

dfs.replication 一般设为 3,但我们只有2个 Slave 节点,所以 dfs.replication 的值还是设为 2

master上  vi  /usr/local/hadoop/etc/hadoop/hdfs-site.xml

 

   

    dfs.ha.automatic-failover.enabled 

    true 

   

 

   

        dfs.namenode.name.dir

        file:/usr/local/hadoop/dfs/name

   

   

        dfs.datanode.data.dir

        file:/usr/local/hadoop/dfs/data

   

   

        dfs.replication

        2

   

   

        dfs.namenode.secondary.http-address

        192.168.100.11:9001

   

   

    dfs.webhdfs.enabled

    true

   

    

    ha.zookeeper.quorum 

    mylab1:2181,mylab2:2181,mylab3:2181 

    

1.3、mapred-site.xml

需要先重命名,默认文件名为 mapred-site.xml.template

master上  vi  /usr/local/hadoop/etc/hadoop/mapred-site.xml

 

   

        mapreduce.framework.name

        yarn

   

 

   

        mapreduce.jobhistory.address

        192.168.100.11:10020

   

 

   

        mapreduce.jobhistory.webapp.address

        192.168.100.11:19888

   


1.4、yarn-site.xml


master上  vi  /usr/local/hadoop/etc/hadoop/yarn-site.xml

        yarn.nodemanager.aux-services

        mapreduce_shuffle

   

   

        yarn.nodemanager.auxservices.mapreduce.shuffle.class

        org.apache.hadoop.mapred.ShuffleHandler

   

   

        yarn.resourcemanager.address

        192.168.100.11:8032

   

   

        yarn.resourcemanager.scheduler.address

        192.168.100.11:8030

   

   

        yarn.resourcemanager.resource-tracker.address

        192.168.100.11:8031

   

   

        yarn.resourcemanager.admin.address

        192.168.100.11:8033

   

   

        yarn.resourcemanager.webapp.address

        192.168.100.11:8088

   

     

         ha.zookeeper.quorum 

    mylab1:2181,mylab2:2181,mylab3:2181  

     

 

   

    yarn.resourcemanager.zk-state-store.address  

    mylab1:2181,mylab2:2181,mylab3:2181 

   


   

    yarn.resourcemanager.store.class  

    org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore  

   


   

    yarn.resourcemanager.zk-address 

    mylab1:2181,mylab2:2181,mylab3:2181 

   


1.5、 slaves 

文件 slaves,将作为 DataNode 的主机名写入该文件,每行一个,默认为 localhost,所以在伪分布式配置时,节点即作为 NameNode 也作为 DataNode。分布式配置可以保留 localhost,也可以删掉,让 Master 节点仅作为 NameNode 使用。

本教程让 Master 节点仅作为 NameNode 使用,因此将文件中原来的 localhost 删除,添加如下内容ip或数据节点主机名即可:

192.168.100.12  ---slave1

192.168.100.13 ----slave2


1.5、同步

rsync  av /usr/local/hadoop mylab2:/usr/local/

rsync  av /usr/local/hadoop mylab3:/usr/local/


3、Zookeeper集群部署

zookeeper集群搭建要至少3台服务器,所以三台服务器都要部署zookeeper;安装在hadoop用户上

tar xf zookeeper-3.4.6.tar.gz -C /usr/local/

mv /usr/local/zookeeper-3.4.6/ /usr/local/zookeeper


cp zoo_sample.cfg  zoo.cfg

 编辑配置文件

vim zoo.cfg

tickTime=2000

initLimit=5

syncLimit=2

#dataDir=/tmp/zookeeper

dataDir=/usr/local/storage/zookeeper/data

dataLogDir=/usr/local/storage/zookeeper/logs 

clientPort=2181

server.1=mylab1:2888:3888 

server.2=mylab2:2888:3888 

server.3=mylab3:2888:3888

创建zookeeper的数据文件和日志存放目录

mkdir  /usr/local/storage/zookeeper/data  /usr/local/storage/zookeeper/logs 

在三台zookeeper的/usr/local/storage/zookeeper/data目录下分别编辑myid

echo 1 > /usr/local/storage/zookeeper/data/myid

echo 2 > /usr/local/storage/zookeeper/data/myid

echo 3 > /usr/local/storage/zookeeper/data/myid


同步到其他hadoop节点 

scp -r /usr/local/zookeeper  mylab2:/usr/local/


4、部署hbase

tar xf hbase-1.2.1-bin.tar.gz

配置文件修改

regionservers 文件

mylab1

mylab2

mylab3


编辑修改hbase-site.xml文件

 

    hbase.rootdir 

    hdfs://192.168.100.11:9000/hbase 

   


   

    hbase.cluster.distributed 

    true 

   


   

    hbase.tmp.dir 

    /usr/loca/storage/hbase   

   


   

    hbase.zookeeper.quorum 

    mylab1,mylab2,mylab3 

   


   

    hbase.zookeeper.property.clientPort 

    2181 

 

  

   

    hbase.zookeeper.property.dataDir 

    /usr/local/storage/zookeeper/data 

   


禁用hbase自带的zookeeper 

vi /usr/local/hbase/conf/hbase-env.sh 

export HBASE_MANAGES_ZK=false


创建hbase-site.xml配置文件中的hbase目录

mkdir /usr/loca/storage/hbase


同步软件到其他节点

rsync av /usr/local/hbase mylab2:/usr/local/


5、部署hive

cp hive-env.sh.template  hive-env.sh

cp hive-site.xml.template hive-site.xml

编辑配置文件

vim hive-site.xml

 

 

   

    hive.metastore.warehouse.dir 

    hdfs://192.168.100.11:9000/user/hive/warehouse 

   

        datanucleus.readOnlyDatastore

        false

   

     

        datanucleus.fixedDatastore

        false 

   

     

        datanucleus.autoCreateSchema 

        true 

   

   

        datanucleus.autoCreateTables

        true

   

   

        datanucleus.autoCreateColumns

        true

   

 

    

    javax.jdo.option.ConnectionURL   

    jdbc:mysql://192.168.100.11:3306/hive?createDatabaseIfNotExist=true    

   


 

    

    javax.jdo.option.ConnectionDriverName   

    com.mysql.jdbc.Driver    

   


 

    

    javax.jdo.option.ConnectionUserName   

    hive     

    


    

    

    javax.jdo.option.ConnectionPassword   

    hive     

   


 

   

    hive.hwi.war.file 

    lib/hive-hwi-2.0.0.war 

   


 

 

  hive.metastore.uris 

  thrift://192.168.100.11:9083 

 


 

   

    hive.zookeeper.quorum 

    mylab1,mylab2,mylab3 

   


添加mysql驱动 

cp /usr/local/src/mysql-connector-java-5.1.38-bin.jar /usr/local/hive/lib/ 


添加hive web页面的war包 

下载hive源码包,apache-hive-2.0.0-src.tar.gz解压进入hwi/web 

jar cvf hive-hwi-2.0.0.war ./* 

cp hive-hwi-2.0.0.war  /usr/local/hive/lib/ 


从hbase/lib下复制必要jar包到hive/lib下 

cp /usr/local/hbase/lib/hbase-client-1.2.1.jar /usr/local/hbase/lib/hbase-common-1.2.1.jar /usr/local/hive/lib 


同步hive和hadoop的jline版本 

cp /usr/local/hive/lib/jline-2.12.jar /usr/local/hadoop/share/hadoop/yarn/lib 

查看版本 

cd /home/hadoop/hadoop/share/hadoop/yarn/lib 

find ./ -name "*jline*jar" 

删除低版本的jline 0.9 

rm jline-0.9.94.jar 


复制jdk的tools.jar到hive/lib下 

cp $JAVA_HOME/lib/tools.jar /usr/local/hive/lib


6、部署mysql

下载集成包解压,安装mysql

MySQL-5.6.33-1.linux_glibc2.5.x86_64.rpm-bundle.tar

配置MySQL登录密码 

cat /root/.mysql_secret 

#获取MySQL安装时生成的随机密码aHoUaEJFav0X7hlG 

service mysql start 

#启动MySQL服务 

mysql -uroot -paHoUaEJFav0X7hlG 

#进入MySQL,使用之前获取的随机密码 

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');   

#在MySQL命令行中设置root账户的密码为123456


创建hive用户,密码hive 

CREATE USER hive IDENTIFIED BY 'hive';  

GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%' WITH GRANT OPTION; 

或:GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%'IDENTIFIED BY 'hive' WITH GRANT OPTION; 

flush privileges; 


用创建的hive用户登录mysql并创建hive库 

mysql -uhive -phive 

create database hive;

#注:此处我的mysql是在主节点部署的

7、启动

Hadoop集群首次启动过程

1.启动zookeeper

如果zookeeper集群还没有启动的话, 首先把各个zookeeper起来。 

/home/hadoop/zookeeper/bin/zkServer.sh start    (记住所有的zookeeper机器都要启动) 

/home/hadoop/zookeeper/bin/zkServer.sh status (1个leader,2个follower) 

输入jps,会显示启动进程:QuorumPeerMain

2、启动hadoop

首次启动需要先在 Master 节点执行 NameNode 的格式化:

/usr/local/hadoop/bin/hdfs namenode -format

显示无报错即为正常

在master上操作即可,两个slave会自动启动


启动服务

/usr/local/hadoop/sbin/start-all.sh

停止服务

/usr/local/hadoop/sbin/stop-all.sh

浏览器访问:

http://192.168.100.11:8088/

http://192.168.100.11:50070

3、启动hbase 

主master节点安装目录下

/bin/start-hbase.sh 

验证安装成功 

hbase shell   ----进入hbase命令行

list            ---输入list命令


hbase(main):001:0> list

TABLE                                                                                                                                

0 row(s) in 0.5530 seconds


=> []

help get 可以查看命令帮助

查看进程为:HMaster,HRegionServer ---主节点为2个

从节点进程为:HRegionServer

通过web UI访问hbase状态

http://192.168.100.11:16010/master-status


4.启动hive 

先在hdfs上创建好hive存储数据的目录 

/bin/hadoop fs -mkdir /tmp 

/bin/hadoop fs -mkdir -p /user/hive/warehouse 

/bin/hadoop fs -chmod g+w /tmp 

/bin/hadoop fs -chmod g+w /user/hive/warehouse

hive 远程服务 (端口号10000) 启动方式[metastore和hiveserver2在同一台上启动即可] 

nohup /usr/local/hive/bin/hive --service metastore &> metastore.log &  

nohup /usr/local/hive/bin/hive --service hiveserver2 &> hiveserver2.log & 

hive 命令行模式 

/home/hadoop/hive/bin/hive 

或者输入 

hive --service cli

查看进程为:2个RunJar

#注:可以在任意一台服务器上启动hive,都可以。

8、查看启动进程

通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode进程

Jps

Master上:


29162 RunJar

28442 HMaster

28049 ResourceManager

28999 RunJar

27607 NameNode

29328 Jps

28571 HRegionServer

27448 QuorumPeerMain

27802 SecondaryNameNode


在 Slave 节点可以看到 DataNode 和 NodeManager 进程

Slave上:

30086 RunJar

28962 DataNode

29834 HRegionServer

30245 RunJar

28868 QuorumPeerMain

29075 NodeManager

程序启动成功后可以在任意一台启动hive



可以在启动MR-JobHistory服务,

sbin/mr-jobhistory-daemon.sh start historyserver

Hadoop2 MR-JobHistory服务介绍

1)MR-JobHistory服务目标

主要是向用户提供历史的mapred Job 查询


详细解释:

a)在运行MR Job时,MR 的 ApplicationMaster会根据mapred-site.xml配置文件中的配置,将MR Job的job history信息保存到指定的hdfs路径(首先保存到临时目录,然后mv到最终目录)

b)如果在yarn-site.xml中,没有配置nodemanage的LogAggregation功能,则historyserver无法提供mr日志明细查询的功能(在提交mr job时,yarn和mapred的配置都是必须的)

c)historyserver向外提供两个接口,web接口可以提供jobhistory和明细日志查询的功能,而restApi只提供jobhistory查询的功能



9、测试

hdfs dfs -copyFromLocal ./LICENSE.txt  /123

hdfs dfs -ls  /123

用wordcount分析LICENSE.txt  

bin/hadoop  jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /123/LICENSE.txt /output/123

bin/hdfs dfs -ls /output/123  查看分析后的文件

bin/hdfs dfs -cat /output/123/part-r-00000  查看分析结果

执行分布式实例

首先创建 HDFS 上的用户目录

hdfs dfs -mkdir -p /user/hadoop

将 /usr/local/hadoop/etc/hadoop 中的配置文件作为输入文件复制到分布式文件系统中:

hdfs dfs -mkdir input

hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input

查看input目录下文件

hdfs dfs -ls input





报错总结:

若出现提示 “WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable”,该 WARN 提示可以忽略,不会影响 Hadoop 正常运行(可通过编译 Hadoop 源码解决,解决方法请自行搜索)。

若出现提示 “INFO metrics.MetricsUtil: Unable to obtain hostName java.net.UnknowHostException”,这需要执行如下命令修改 hosts 文件,为你的主机名增加IP映射:



Datanode不能启动

Initialization failed for Block pool (Datanode Uuid unassigned)

解决方案:

将目录、dfs、name、data清空

是重复启动到时key值不一样



Hmaster消失 ERROR: Can't get master address from ZooKeeper; znode data == null

这个问题这里是由于启动hbase失败造成,主要原因是因为配置文件hbase-site.xml中hdfs端口配置错误导致,帮助文档中使用的是8020,而我的hadoop分布集群用的是9000默认端口,修改配置如下:gedit hbase-site.xml                                        hbase.rootdir                        hdfs://hadoop0:9000/hbase               

参考:

http://f.dataguru.cn/thread-519459-1-1.html