1.基本公共搭建

NAT网络;

防火墙;

ssh免密;

主机名;

主机IP映射;

环境变量

JAVA_HOME=/home/hadoop/app/jdk
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ZOOKEEPER_HOME=/home/hadoop/app/zookeeper
HADOOP_HOME=/home/hadoop/app/hadoop
HIVE_HOME=/home/hadoop/app/hive
HBASE_HOME=/home/hadoop/app/hbase
SCALA_HOME=/home/hadoop/app/scala
SPARK_HOME=/home/hadoop/app/spark
PATH=/home/hadoop/tools:$JAVA_HOME/bin:$SCALA_HOME/bin:$SPARK_HOME/bin:$HBASE_HOME/bin:$HIVE_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL CLASSPATH ZOOKEEPER_HOME HADOOP_HOME JAVA_HOME
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 HIVE_HOME
export HBASE_HOME
export SCALA_HOME
export SPARK_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export JAVA_LIBRARY_PATH=$JAVA_HOME/lib/native
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export  HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"

2.jdk安装

3.zookeeper安装

4.hadoop安装

(1)创建Hadoop工作路径(在master节点上操作)

cd /home/hadoop/app/

(2)解压Hadoop到相应目录中改名

tar -zxvf /opt/soft/hadoop-2.7.3.tar.gz 
mv hadoop-2.7.3.tar.gz

(4)修改相关配置文件,编辑文件在 /hadoop/etc/hadoop/目录下

①添加jdk环境变量到hadoop-env.sh文件

cd /home/hadoop/app/hadoop/etc/hadoop/
vi hadoop-env.sh

添加如下内容

export JAVA_HOME=/home/hadoop/app/jdk

②编辑core-site.xml文件,并将内容添加到里面

vi core-site.xml

添加如下内容

<configuration>
<!-- 指定hdfs的nameservice为ns -->
  <property>
      <name>fs.defaultFS</name>
      <value>hdfs://zls1</value>
      <!--1.x中为fs.default.name, 一定得是namenode的hostname>或者 ip,并且不用加端口号(这里的名称与HA配置hdfs-site.xml中的
dfs.nameservices必须保持一致) -->
  </property>

  <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/hadoop/app/hadoop/tmp</value>
    <!-- 指定hadoop临时目录 -->
  </property>

  <!-- 配置HA时才用配置该项 -->
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>zls1:2181,zls2:2181,zls3:2181</value>
    <!--各个ZK节点的IP/host,及客户端连接ZK的端口,该端口需与zoo.cfg中的 clientPort一致! -->
  </property>
</configuration>

③编辑yarn-site.xml文件

vi yarn-site.xml

添加如下内容

<configuration>  
  
<!-- Site specific YARN configuration properties -->  
  
  <property>  
    <name>yarn.resourcemanager.ha.enabled</name>  
    <value>true</value>  
    <!-- 开启RM高可用 -->  
  </property>  
    
  <property>  
    <!--启动自动故障转移,默认为false-->  
    <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>  
    <value>true</value>  
  </property>  
  
  <property>  
    <!--启用一个内嵌的故障转移,与ZKRMStateStore一起使用。-->  
    <name>yarn.resourcemanager.ha.automatic-failover.embedded</name>  
    <value>true</value>  
  </property>  
   
  <property>  
    <name>yarn.resourcemanager.cluster-id</name>  
    <value>yrc</value>  
    <!-- 指定RM的cluster id -->  
  </property>  
  
  <property>  
    <name>yarn.resourcemanager.ha.rm-ids</name>  
    <value>rm1,rm2</value>  
    <!-- 指定RM的名字 -->  
  </property>  
   
  <property>  
    <name>yarn.resourcemanager.hostname.rm1</name>  
    <value>zls1</value>  
    <!-- 分别指定RM的地址 -->  
  </property>  
    
  <property>  
    <name>yarn.resourcemanager.hostname.rm2</name>  
    <value>zls2</value>  
    <!-- 分别指定RM的地址 -->  
  </property>  
  
  <property>  
    <name>yarn.resourcemanager.ha.id</name>  
    <value>rm1</value>       
    <!--<span style="font-size:18px;color:#ff0000;"><strong>如果是在主NN上 这里写rm1   如果这个配置文件是在备NN上 这里写rm2,否则RM的高可用会出问题</strong></span>-->  
    <description>If we want to launch more than one RM in single node, we need this configuration</description>  
  </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>      
  
  <property>  
    <name>yarn.resourcemanager.zk-address</name>  
    <value>zls1:2181,zls2:2181,zls3:2181</value>  
    <!-- 指定zk集群地址 -->  
  </property>  
  
  <property>  
    <name>yarn.nodemanager.aux-services</name>  
    <value>mapreduce_shuffle</value>  
  </property>  
  
</configuration>

④编写slaves文件

vi slaves

添加如下内容

zls3

⑤编写master文件

vi master

添加如下内容

zls1
zls2

⑥编辑hdfs-site.xml文件

vi hdfs-site.xml

添加如下内容

<configuration>  
<property>    
    <name>dfs.replication</name>    
    <value>2</value>    
  </property>    
  <property>    
    <name>dfs.namenode.name.dir</name>    
    <value>file:///home/hadoop/app/hadoop/dfs/name</value>    
  </property>    
  <property>    
    <name>dfs.datanode.data.dir</name>    
    <value>file:///home/hadoop/app/hadoop/dfs/data</value>    
  </property>    
  <property>  
    <name>dfs.webhdfs.enabled</name>  
    <value>true</value>  
    <!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->   
  </property>  
  
  <!-- HA配置需要加如下配置-->  
  <property>  
    <name>dfs.nameservices</name>  
    <value>zls1</value>  
    <!--给hdfs集群起名字,这个名字必须和core-site中的统一,且下面也会用到该名字,需要和core-site.xml中的保持一致 -->  
  </property>  
  
  <property>  
    <name>dfs.ha.namenodes.zls1</name>  
    <value>nn1,nn2</value>  
    <!-- master1下面有两个NameNode,分别是nn1,nn2,指定NameService是cluster1时的namenode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可 -->  
  </property>  
  
  <property>  
    <name>dfs.namenode.rpc-address.zls1.nn1</name>  
    <value>zls1:9000</value>  
    <!-- nn1的RPC通信地址 -->  
  </property>  
  
  <property>  
    <name>dfs.namenode.rpc-address.zls1.nn2</name>  
    <value>zls2:9000</value>  
    <!-- nn2的RPC通信地址 -->  
  </property>  
  
  <property>  
    <name>dfs.namenode.http-address.zls1.nn1</name>  
    <value>zls1:50070</value>  
    <!-- nn1的http通信地址 -->  
  </property>  
  <property>  
    <name>dfs.namenode.http-address.zls1.nn2</name>  
    <value>zls2:50070</value>  
    <!-- nn2的http通信地址 -->  
  </property>  
  
  <property>  
    <name>dfs.namenode.servicerpc-address.zls1.nn1</name>  
    <value>zls1:53310</value>  
  </property>  
  
  <property>  
    <name>dfs.namenode.servicerpc-address.zls.nn2</name>  
    <value>zls2:53310</value>  
  </property>  
  
  <property>  
    <name>dfs.namenode.shared.edits.dir</name>  
    <value>qjournal://zls1:8485;zls2:8485;zls3:8485/zls1</value>  
    <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->  
  </property>   
  
  <property>  
    <name>dfs.journalnode.edits.dir</name>  
    <value>/home/hadoop/data/hadoop/jndata</value>  
    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->  
  </property>  
  
  <property>  
    <name>dfs.ha.automatic-failover.enabled</name>    
    <value>true</value>  
    <!-- 开启NameNode失败自动切换 -->  
  </property>  
  
  <property>  
    <name>dfs.client.failover.proxy.provider.master</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>  
  
  <property>  
    <name>dfs.ha.fencing.ssh.private-key-files</name>  
    <value>/root/.ssh/id_rsa</value>  
    <!-- 使用sshfence隔离机制时需要ssh免登陆 -->  
  </property>  
  
  <property>  
    <name>dfs.ha.fencing.ssh.connect-timeout</name>  
    <value>3000</value>  
    <!-- 配置sshfence隔离机制超时时间 -->  
  </property>  
  
</configuration>

⑦编辑mapred-site.xmll文件

但是文件夹内并没有mapred-site.xml这个文件所以我们需要使用cp命令将mapred-site.xml.template 复制为 mapred-site.xml:

cp mapred-site.xml.template mapred-site.xml
vi mapred-site.xml

然后添加如下内容

<configuration> 
<property> 
 <name>mapreduce.framework.name</name> 
 <value>yarn</value> 
 </property>
 </configuration>

⑧分发Hadoop

scp -r /usr/hadoop root@slave1:/usr/
scp -r /usr/hadoop root@slave2:/usr/

启动hadoop:

每台机器上启动Zookeeper:bin/zkServer.sh start

zookeeper集群格式化(任意一个主节点上执行即可):bin/hdfs zkfc -formatZK

每台机器上启动 journalnode:sbin/hadoop-daemon.sh start journalnode (如果这里不启动的话,在进行hdfs格式化的时候就会报错,同时这个进程只需在格式化的时候启动,后续启动服务则不需要)

hdfs集群格式化(master1上进行):bin/hadoop namenode -format

看到 “0” 表示成功了

master1机器上启动服务:sbin/start-dfs.sh sbin/start-yarn.sh

备用NN同步主NN的元数据信息(master2上执行): bin/hdfs namenode -bootstrapStandby

启动备用NN(master2上执行): sbin/hadoop-daemon.sh start namenode

resourcemanager启动命令:yarn-daemon.sh start resourcemanager

5.hbase安装

8.3. 配置hbase-env.sh

在hmaster1上操作:vim /home/hadoop/hbase/conf/hbase-env.sh

export JAVA_HOME=/home/hadoop/jdk8
export HADOOP_HOME=/home/hadoop/hadoop
export HBASE_HOME=/home/hadoop/hbase
\#关闭自身zookeeper,采用外部的zookeeper
export HBASE_MANAGES_ZK=false
\#The directory where pid files are stored. /tmp by default.
 export HBASE_PID_DIR=/home/hadoop/hbase/pids

8.4. 配置hbase-site.xml

vim /home/hadoop/hbase/conf/hbase-site.xml

<!-- hadoop集群名称 -->
<property>
  <name>hbase.rootdir</name>
  <value>hdfs://zls1/hbase</value>
 </property>
 <property>
  <name>hbase.zookeeper.quorum</name>
  <value>zls1,zls2,zls3</value>
 </property>
 <property>
  <name>hbase.zookeeper.property.clientPort</name>
  <value>2181</value>
 </property>
<!-- 是否是完全分布式 -->
 <property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
 </property>
<!-- 完全分布式式必须为false -->
 <property>
  <name>hbase.unsafe.stream.capability.enforce</name>
  <value>false</value>
 </property>
<!-- 指定缓存文件存储的路径 -->
  <property>
<name>hbase.tmp.dir</name>
 <value>/home/hadoop/data01/hbase/hbase_tmp</value>
  </property>
<!-- 指定Zookeeper数据存储的路径 -->
  <property>
 <name>hbase.zookeeper.property.dataDir</name>
 <value>/home/hadoop/data01/hbase/zookeeper_data</value>
</property>

注意:hadoop高可用中zk的作用 hadoop高可用搭建_大数据HADOOP_HOME/conf/core-site.xml的fs.default.name的value值(包括主机和端口号)一致

1

8.5. 配置regionservers

修改文件: vim /home/hadoop/hbase/conf/regionservers。添加DataNode的IP或者机器名即可,这个文件把RegionServer的节点列了下来,内容为:

hslave1
hslave2
hslave3
8.6. 配置Hmaster高可用
为了保证HBase集群的高可靠性,HBase支持多Backup Master 设置。当Active Master挂掉后,Backup Master可以自动接管整个HBase的集群。
该配置极其简单:在 $HBASE_HOME/conf/目录下新增文件配置backup-masters,在其内添加要用做Backup Master的节点hostname。
vim /home/hadoop/hbase/conf/backup-masters
hmaster2
没设置backup-masters之前启动hbase, 只有一台有启动了HMaster进程
完成之后,重新启动整个集群,我们会发现,在backup-masters清单上的主机,都启动了HMaster进程
8.7. log4j冲突处理
启动hbase时 : /home/hadoop/hbase/bin/start-hbase.sh,
会报错
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hadoop/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/hadoop/hbase/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
1
2
3
4
5
原因是有两个log4j的jar起了冲突,只需要删除其中一个
Mv /home/hadoop/hbase/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar /home/hadoop/hbase/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar.bak
复制hmaster1的hbase目录到hmaster2, hslave1,hslave2,hslave3上面
scp -r /home/hadoop/hbase hmaster2:/home/hadoop/hbase 等等
至此Hbase配置完
8.8. 启动hbase
按照上面启动hadoop ha 的顺序 先启动好
/home/hadoop/hbase/bin/start-hbase.sh
[root@hmaster1 Desktop]# jps
31988 DFSZKFailoverController
524 Jps
32532 HMaster
32763 Main
31670 NameNode
HMaster进程已经启动
8.9. 停止hbase
/home/hadoop/hbase/bin/stop-hbase.sh

6.安装MySQL

7.安装hive