第一步搭建三节点的hdfs,没有故障转移功能
1.下载相关jar包:hadoop-3.3.0.tar.gz,apache-zookeeper-3.7.0-bin.tar.gz,spark-3.2.0-bin-hadoop3.2.tgz(后续使用)
2.虚拟机安装java环境,如果是yum安装openjdk,那么只有jre环境,没有jdk,此时还需要下载java-1.X.X-openjdk-devel这个包,通过yum list |grep jdk-devel来查询。
3.centos上新建一个用户,用来启动hadoop等组件:useradd atguigu(后续操作都使用这个用户,要将hadoop相关组件的目录都chown为此用户,还有要注意目录的读写权限,我就是忽略了这一点导致ssh免秘钥登录失败)。几台虚拟机建立ssh免秘钥登录,在新建用户的家目录下创建rsa秘钥,使用ssh-copy-id,将公钥分发到其它机器(也包括自己)(进入到家目录的.ssh目录下,使用ssh-keygen -t rsa生成公私钥id_rsa,id_rsa.pub(如果没有的话),执行ssh-copy-id 目标主机 的命令将公钥分发过去),测试使用ssh登录几台虚拟机。
4.开始安装hdfs,解压hadoop的tar包,进入etc/hadoop,编辑core-site.xml
fs.defaultFS
hdfs://cluster1/
hadoop.tmp.dir
/opt/ha/hadoop-3.3.0/data
hadoop.http.staticuser.user
atguigu
修改hdfs-site.xml
dfs.namenode.name.dir
file://${hadoop.tmp.dir}/dfs/name
dfs.datanode.data.dir
file://${hadoop.tmp.dir}/dfs/data
dfs.journalnode.edits.dir
${hadoop.tmp.dir}/jn
dfs.nameservices
cluster1
dfs.ha.namenodes.cluster1
nn1,nn2,nn3
dfs.namenode.rpc-address.cluster1.nn1
hadoop10:8020
dfs.namenode.rpc-address.cluster1.nn2
hadoop11:8020
dfs.namenode.rpc-address.cluster1.nn3
hadoop12:8020
dfs.namenode.http-address.cluster1.nn1
hadoop10:9870
dfs.namenode.http-address.cluster1.nn2
hadoop11:9870
dfs.namenode.http-address.cluster1.nn3
hadoop12:9870
dfs.namenode.shared.edits.dir
qjournal://hadoop10:8485;hadoop11:8485;hadoop12:8485/cluster1
dfs.client.failover.proxy.provider.cluster1
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
dfs.ha.fencing.ssh.private-key-files
/home/atguigu/.ssh/id_rsa
编辑workers文件,里面写上三台服务器的hostname(我第一次部署时没有编辑这里,发现在停止集群时(stop-dfs.sh)其他节点的datanode进程还在,要单独手动杀死,后来编辑了这里,再停止集群时,其它节点的datanode都停止了); 编辑hadoop-env.sh,末尾添加:export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64 (这一步我没有编辑,hdfs也正常启动了)
5.将hadoop的目录使用scp -r分发到其它几台服务器
6.启动journalnode:hdfs --daemon start journalnode (在三台服务器执行)
7.在任意一台服务器上(比如hadoop10)格式化namenode,然后启动namenode:hdfs namenode -format ; hdfs --daemon start namenode
8.在另外两台服务器执行同步namenode元数据:hdfs namenode -bootstrapStandby
9.然后另外两台执行启动namenode: hdfs --daemon start namenode (此时三台服务器都是standby(可在浏览器访问9870端口))
10.在三台机器启动datanode:hdfs --daemon start datanode
11.手动将其中某个节点置为avtive状态:hdfs haadmin -transitionToActive nn1(nn1是前面配置的NameNode的其中一台的名称,指定谁谁就是active状态,如果都不指定,hdfs集群无法使用)
12.测试:创建目录:hadoop fs -mkdir /huyao ;上传文件:hadoop fs -put ./1.txt /huyao
--------------------------------------------------------------------加入自动故障转移--------------------------------------------------------------------
1.先停止集群:stop-dfs.sh(通过jps确保所有相关进程都死掉了,没杀死的手动停止)
2.进入etc/hadoop目录,编辑core-site.xml,加入zookeeper的配置
ha.zookeeper.quorum
hadoop10:2181,hadoop11:2181,hadoop12:2181
再编辑hdfs-site.xml,加入
dfs.ha.automatic-failover.enabled
true
最后将两个配置文件分发至其它的节点
3.启动几个节点的zookeeper
4.在其中一台服务器执行命令初始化zkfc:hdfs zkfc -formatZK
5.启动hdfs集群:start-dfs.sh
6.进入zookeeper:./zkCli.sh 查看自动选举为active节点:get -s /hadoop-ha/cluster1/ActiveStandbyElectorLock,可看到当前active的节点,在浏览器查看确认,确实如此
7.尝试kill掉当前active的namenode,发现没有进行故障自动转移,查看几个standBy节点的zkfc的log:logs/hadoop-atguigu-zkfc-xxx.log,第一次报错说:ha.zookeeper.quorum这个配置不存在,原来是我分发core-site.xml时漏掉了,此时分发过去,重启集群,再kill掉当前的active的namenode,查看zkCLi,发现故障自动转移生效了,但是在两个节点间反复横跳,一直没有定下来,看来还是有问题,再次查看standby节点的zkfc日志,报错为:PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 8090 via ssh: bash: fuser: 未找到命令,原来系统是centos最小安装版,并没有fuser这个东西,在三个节点su到root后执行:yum -y install psmisc, 完成后此时不用重启集群,查看zkCli,发现active节点已经完成转移了。
8.将被杀死的namenode再单独启动:hdfs --daemon start namenode , 但此时只能作为standby节点了。 在standby节点和active节点执行上传文件:hadoop fs -put ./yy.txt /huyao , 会报错:Operation category READ is not supported in state standby,但最终可以上传成功(它自己会重试)。 可通过命令:hdfs haadmin -getServiceState nn1 来查看namenode的状态
9.另一种上传文件方式:hadoop fs -put a.json hdfs://cluster1/
--------------------------------------------------------------------加入yarn的高可用--------------------------------------------------------------------
1.编辑yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
cluster-yarn1
yarn.resourcemanager.ha.rm-ids
rm1,rm2,rm3
yarn.resourcemanager.hostname.rm1
hadoop10
yarn.resourcemanager.webapp.address.rm1
hadoop10:8088
yarn.resourcemanager.address.rm1
hadoop10:8032
yarn.resourcemanager.scheduler.address.rm1
hadoop10:8030
yarn.resourcemanager.resource-tracker.address.rm1
hadoop10:8031
yarn.resourcemanager.hostname.rm2
hadoop11
yarn.resourcemanager.webapp.address.rm2
hadoop11:8088
yarn.resourcemanager.address.rm2
hadoop11:8032
yarn.resourcemanager.scheduler.address.rm2
hadoop11:8030
yarn.resourcemanager.resource-tracker.address.rm2
hadoop11:8031
yarn.resourcemanager.hostname.rm3
hadoop12
yarn.resourcemanager.webapp.address.rm3
hadoop12:8088
yarn.resourcemanager.address.rm3
hadoop12:8032
yarn.resourcemanager.scheduler.address.rm3
hadoop12:8030
yarn.resourcemanager.resource-tracker.address.rm3
hadoop12:8031
yarn.resourcemanager.zk-address
hadoop10:2181,hadoop11:2181,hadoop12:2181
yarn.resourcemanager.recovery.enabled
true
yarn.resourcemanager.store.class
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
yarn.nodemanager.env-whitelist
JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME
分发到其它几个节点。
2.启动yarn集群:start-yarn.sh,启动完毕后查看jps,如果虚拟机内存没给够,是起不来的,也许会把datanode干掉,或者resourceManager起不来,以我部署的情况来看,每个节点至少需要3g的内存,保险起见给4g。
3.查看yarn状态:yarn rmadmin -getServiceState rm1(rm1为yarn-site.xml中配置的resourceManager名字)。在浏览器访问8088端口,yarn会自动重定向到active的机器。
4.手动kill掉active的resourceManager进程,yarn可以自动故障转移,其中另一个节点提升为active,然后在节点单独启动被kill掉的resourcemanager:yarn --daemon start resourcemanager,启动后为standby状态。
--------------------------------------------------------------------运行spark任务--------------------------------------------------------------------
1.解压spark压缩包,进入,编辑conf/spark-env.sh,加入:
export JAVA_HONE=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64
YARN_CONF_DIR=/opt/ha/hadoop-3.3.0/etc/hadoop
2.尝试提交一个任务,在shell执行:
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.12-3.2.0.jar 10
3.加入spark的日志服务器,vi spark-defaults.conf:
spark.eventLog.enabled true
spark.eventLog.dir hdfs://cluster1/directory
spark.yarn.historyServer.address=hadoop10:18080
spark.history.ui.port=18080
spark.eventLog.dir这个配置对应的hdfs上的目录,需要提前创建:hadoop fs -mkdir hdfs://cluster1/directory,再编辑spark-env.sh,加入:
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://cluster1/directory
-Dspark.history.retainedApplications=30"
4.启动日志服务器:./sbin/start-history-server.sh
5.再次尝试提交任务,可在yarn的界面上等到任务执行完后,点击任务对应的history,可进入到spark的日志服务器