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_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