本例用4台主机模拟Hadoop高可用+自动切换NameNode(真实环境中的百台、千台主机也是如此配置)
四台主机的hostname分别是node01、node02、node03和node04.
各主机节点在HA中的角色如下:
NN表示NameNode
DN表示DataNode
ZK表示Zookeeper
ZKFC表示Zookeeper Failover Controller
JNN表示JournalNode
本例中,
node01、node02节点启动NameNode
node01、node02节点启动ZKFC
node02、node03、node04节点启动DataNode
node02、node03、node04节点启动zookeeper集群
node01、node02、node03阶段启动JournalNode集群
node01节点为启动脚本节点。
(请务必保证所有集群的机器的系统时间一致!!!)
一、更新系统并安装文件传输
sudo yum update -y
sudo yum install -y lrzsz
二、在各自的主机中, 将node01到node04配置到hosts中, 方便后续的部署操作。
#编辑hosts文件
vim /etc/hosts
#添加hosts
172.18.44.81 node01
172.18.44.82 node02
172.18.44.83 node03
172.18.44.84 node04
#关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
#将SELINUX的值改成disabled
vim /etc/selinux/config
SELINUX=disabled
#重启服务器
reboot
三、配置免密登陆
其中,用于启动hadoop集群的节点主机需要配置与其他所有节点的免密登陆;多个NameNode节点之间需要互相免密登陆,NameNode节点自己与自己也要免密登陆。
#如果root下没有.ssh文件夹请自行创建
cd /root/.ssh
ssh-keygen -t dsa -P '' -f ./id_dsa
cat ./id_dsa.pub > ./authorized_keys
#将生成的公钥文件id_dsa.pub,发送到需要免密登陆的所有节点主机的/root/.ssh路径上,并将其内容加入到authorized_keys文件中. >:表示覆盖 >>:表示追加
cat ./id_dsa.pub >> ./authorized_keys
四、在所有节点主机上安装JDK(本demo以jdk8-download为例)
#配置环境变量
vim /etc/profile
#在文件末尾添加
export JAVA_HOME=/usr/local/jdk1.8.0_181
export CLASS_PATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
#保存并刷新文件
source /etc/profile
五、ZooKeeper集群的搭建(node02, node03, node04)
#下载ZooKeeper包并解压
tar -zxf /usr/local/zookeeper-3.4.13.jar
#配置环境变量
vim /etc/profile
#添加环境变量
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.13
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
#保存刷新配置
source /etc/profile
#配置ZooKeeper的配置文件
cd /usr/local/zookeeper-3.4.13/conf
#拷贝一份配置文件
cp zoo_sample.cfg zoo.cfg
编辑配置文件
vim zoo.cfg
#修改配置
dataDir=/var/kid/zk
#在文件末尾添加配置
server.1=172.18.44.82:2888:3888
server.2=172.18.44.83:2888:3888
server.3=172.18.44.84:2888:3888
#创建文件夹
mkdir -p /var/kid/zk
#创建myid文件
echo 1 > /var/kid/zk/myid
node01的ZooKeeper配置完成。 在node03和noded04上页做同样的环境变量配置。然后将整个hadoop文件夹拷贝到node03和node04上, 并在其上创建相同的myid文件, 内容分别是2和3
#node03和node04配置环境变量
vim /etc/profile
#node03和node04添加环境变量
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.13
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
#node03和node04保存刷新配置
source /etc/profile
#拷贝到node03节点
scp -r ./zookeeper-3.4.12/ node03:`pwd`
#创建文件夹
mkdir -p /var/kid/zk
#创建myid文件
echo 2 > /var/kid/zk/myid
#拷贝到node04节点
scp -r ./zookeeper-3.4.12/ node04:`pwd`
#创建文件夹
mkdir -p /var/kid/zk
#创建myid文件
echo 3 > /var/kid/zk/myid
#分别在node02, node03, node04启动ZooKeeper
zkServer.sh start
#分别在node2,node03, node04查看ZooKeeper运行状态
zkServer.sh status
#出现以下提示表示启动成功
#node02提示:
#ZooKeeper JMX enabled by default
#Using config: /usr/local/zookeeper-3.4.13/bin/../conf/zoo.cfg
#Mode: follower
#node03提示
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: leader
#node04提示
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: follower
六、Hadoop的安装
#在node01创建hadoop文件夹
cd /usr/local
mkdir hadoop
cd hadoop
#解压hadoop
tar -zxvf hadoop-3.1.0.tar.gz
#修改环境变量
vim /etc/profile
#在文件最后添加
export HADOOP_HOME=/usr/local/hadoop/hadoop-3.1.0
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
#刷新配置文件
source /etc/profile
六、修改hadoop配置文件(/usr/local/hadoop/etc/hadoop下)
vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
#修改文件中的JAVA_HOME为:
export JAVA_HOME=/usr/local/jdk1.8.0_181
#修改hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node02:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/kid/hadoop/ha/jn</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
#修改core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/kid/hadoop/ha</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
</configuration>
#修改DataNode节点, Hadoop 2.X中是修改Slaves文件, Hadoop 3.x中则是修改workers文件
node02
node03
node04
将node01节点配置好的Hadoop文件夹整个拷贝到其他所有节点上
scp -r /usr/local/Hadoop node02:/usr/local/Hadoop
scp -r /usr/local/Hadoop node03:/usr/local/Hadoop
scp -r /usr/local/Hadoop node04:/usr/local/Hadoop
#在其中一台NameNode上格式化ZooKeeper
hdfs zkfc -formatZK
#手动启动所有journalNode节点的journalNode功能(Node01, Node02, Node03)
#Hadoop 2.X启动方式
hadoop-daemon.sh start journalnode
#Hadoop 3.X启动方式
hdfs --daemon start journalnode
#在其中一台NameNode上格式化NameNode
hdfs namenode -format
#启动这台NameNode,以便于其他所有的NameNode同步
#Hadoop 2.X启动方式
hadoop-daemon.sh start namenode
#Hadoop 3.x启动方式
hdfs --daemon start namenode
#其他NameNode同步(ha模式, 本例和企业中大部分使用此模式)
hdfs namenode -bootstrapStandby
#其他NameNode同步(非ha模式,本例中不启用此模式)
hdfs namenode -initializeSharedEdits
#启动Hadoop
start-dfs.sh
通过浏览器浏览:http://node01:50070或http://node02:50070可以查看hadoop状态页面
七、YARN的安装配置
YARN主从模式, 高可用。 跟上面配置一样, YARN中的ResourceManager(承载调度)安装在node03和node04中, 而NodeManager随DataNode一起启动(承载计算)
#在mapred-site.xml中进行配置, 开启yarn
vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
#在yarn-site.xml中进行配置
vim yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node03</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node04</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
</configuration>
#将上述两个配置文件分发到其他所有节点主机中
scp mapred-site.xml yarn-site.xml node02:`pwd`
scp mapred-site.xml yarn-site.xml node03:`pwd`
scp mapred-site.xml yarn-site.xml node04:`pwd`
#启动YARN
start-yarn.sh
#如果node03和node04节点上的resourcemanager没有启动,则手动启动
yarn-daemon.sh start resourcemanager
Eclipse开发Hadoop
一、 设置环境变量
设置HADOOP_HOME环境变量, 值为本地Hadoop的文件夹路径
设置HADOOP_USER_NAME环境变量, 值为root
重启计算机
二、创建MAVEN工程
#在POM文件中引入jar包
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kid</groupId>
<artifactId>example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>example</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-hadoop-boot</artifactId>
<version>2.5.0.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
</dependencies>
</project>
将Hadoop中的core-site.xml和hdfs-site.xml拷贝到项目中的resources文件夹下.
如果配置文件中使用了别名,一定要在hdfs-site.xml中加入如下配置,否则无法连接
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
并在resources文件夹下建立log4j.properties文件, 内容如下:
log4j.rootLogger=WARN, stdout
# log4j.rootLogger=WARN, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern= %d %p [%c] - %m%n
#在App.java中代码如下:
package com.kid.example;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Override
public void run(String... args) throws Exception {
Configuration config = new Configuration(true);
FileSystem fs = FileSystem.get(config);
Path dirs = new Path("/data");
if (fs.exists(dirs)) {
fs.delete(dirs, true);
}
fs.create(dirs);
fs.close();
System.out.println("OK");
}
}
HIVE安装
node01:数据库
node02:metastoreserver
node03:client
一、在node01节点上安装mysql数据库(参考文章)
二、安装hive的1.2.1版本,将apache-hive-1.2.1-bin.tar.gz上传到node02节点,并上传与mysql版本对应的连接驱动mysql-connector-java-8.0.11到node02节点上。
三、在node02上安装hive
tar -zxf apache-hive-1.2.1-bin.tar.gz
将驱动jar包拷贝到hive的lib文件夹中
mv mysql-connector-java-8.0.11.jar apache-hive-1.2.1-bin/lib/
设置环境变量
export HIVE_HOME=/usr/local/apache-hive-1.2.1-bin
添加path
...:$HIVE_HOME/bin:...
进入hive的conf文件夹下,编辑相关配置文件
mv hive-default.xml.template hive-site.xml
vim hive-site.xml
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>数据库账号(root)</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>数据库密码(123)</value>
</property>
</configuration>
四、在node03上安装hive, 作为我们的客户端
将node02上的hive文件夹拷贝到node03上
scp -r apache-hive-1.2.1-bin/ node03:`pwd`
进入到conf文件夹中编辑相关配置文件
vim hive-site.xml
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://node02:9083</value>
</property>
</configuration>
替换掉node03下的jLine jar包
cp /usr/local/apache-hive-1.2.1-bin/lib/jline-2.12.jar /usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/
五、在node02启动hive metastore
hive --service metastore
#后台启动
hive --service metastore &
六、在node03启动hive客户端进行访问
hive
HBASE的安装
node01: HMaster
node02: HRegionServer
node03: HRegionServer
node04: HMaster(backup)
安装的hbase-0.98.12.1-hadoop2-bin.tar版本
一、解压hbase-0.98.12.1-hadoop2-bin.tar
tar -zxf hbase-0.98.12.1-hadoop2-bin.tar.gz
二、在node01~node04上修改环境变量
vim /etc/profile
export HBASE_HOME=/usr/local/hbase-0.98.12.1-hadoop2
export PATH = ...:$HBASE_HOME/bin:...
三、修改配置文件
vim /usr/local/hbase-0.98.12.1-hadoop2/conf/hbase-env.sh
#修改JAVA_HOME
export JAVA_HOME=export JAVA_HOME=/usr/local/jdk1.8.0_181
修改最后几行
export HBASE_MANAGES_ZK=false
vim /usr/local/hbase-0.98.12.1-hadoop2/conf/hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://mycluster/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node02, node03, node04</value>
</property>
</configuration>
vim /usr/local/hbase-0.98.12.1-hadoop2/conf/regionservers
node02
node03
vim backup-masters
node04
拷贝hdfs-site.xml到hbase的conf文件夹下
cp /usr/local/hadoop-2.6.5/etc/hadoop/hdfs-site.xml /usr/local/hbase-0.98.12.1-hadoop2/conf/
四、将hbase文件夹拷贝到node02, node03和node04上
scp -r hbase-0.98.12.1-hadoop2/ node02:`pwd`
scp -r hbase-0.98.12.1-hadoop2/ node03:`pwd`
scp -r hbase-0.98.12.1-hadoop2/ node04:`pwd`
四、在node01上启动hbase
start-hbase.sh