Hadoop有三种部署方式,分别为单机模式、伪集群模式、集群模式。
其中单机模式比较简单,自行查找;伪集群模式和集群模式基本一样,区别就是前者都在一台电脑上,后者在不同的电脑上。
下面以生产环境一般用的集群方式部署为例说明,按最小要求3台节点来介绍集群部署方式。本样例是在3台虚拟机下部署的,每个节点安装Centos7核心版(不带GUI)
3台机器分别规划如下:
hdp1:10.10.10.110
hdp2:10.10.10.112
hdp3:10.10.10.113
下面从如下几个方面介绍下其部署及应用:
相关配置
安装
固定配置
分发程序
启动
查看状态
基本操作
相关配置
挂载windows目录、 IP配置、hosts名称配置、关闭防火墙、SSH配置, 需要3台电脑网络互通且能相互SSH登录,
具体操作参见:
Linux系列——挂载Windows虚拟文件夹到Linux系统
安装
先在其中任意一台上面安装。
1、需要先搭建好Zookeeper集群
2、下载hadoop,直接解压就可以用(注意不是源码包)。例如:hadoop-3.3.1.tar.gz
下载地址
https://archive.apache.org/dist/hadoop/common/
3、解压到目标目录
$ cp /mnt/hdfs/vf/hadoopSetup/hadoop-3.3.1.tar /usr/proc/hadoop 从挂载目录将安装文件拷贝到目标路径
$ cd /usr/proc/hadoop 这里切换到zk安装目录(每台机器都要新建该目录,配好一台后后面两台直接用scp命令分发,具体路径可以自定义,推荐放在/usr下)
$ tar -zxvf hadoop-3.3.1.tar (解压后记着删除压缩文件)
固定配置
分别修改下列配置文件:位于/usr/proc/hadoop/hadoop-3.3.1/etc下
1、hadoop-env.sh
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_191
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFCNODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
其中用户可以新建一个专有用户例如:hadoop, 本例统一管理都用root用户了。
2、core-site.xml
<configuration>
<property>
<!-- 指定namenode的hdfs协议文件系统的通信地址 -->
<name>fs.defaultFS</name>
<value>hdfs://cluster007</value>
</property>
<property>
<!-- 指定hadoop集群存储临时文件的目录 -->
<name>hadoop.tmp.dir</name>
<value>/usr/proc/hadoop/tmpdata</value>
</property>
<property>
<!-- ZooKeeper集群的地址 -->
<name>ha.zookeeper.quorum</name>
<value>hdp1:2181,hdp2:2181,hdp3:2181</value>
</property>
<property>
<!-- ZKFC连接到ZooKeeper超时时长 -->
<name>ha.zookeeper.session-timeout.ms</name>
<value>10000</value>
</property>
</configuration>
3、hdfs-site.xml
<configuration>
<property>
<!-- 指定HDFS副本的数量 -->
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<!-- namenode节点数据(即元数据)的存放位置,可以指定多个目录实现容错,多个目录用逗号分隔 -->
<name>dfs.namenode.name.dir</name>
<value>/usr/proc/hadoop/namenode/data</value>
</property>
<property>
<!-- datanode节点数据(即数据块)的存放位置 -->
<name>dfs.datanode.data.dir</name>
<value>/usr/proc/hadoop/datanode/data</value>
</property>
<property>
<!-- 集群服务的逻辑名称 -->
<name>dfs.nameservices</name>
<value>cluster007</value>
</property>
<property>
<!-- NameNode ID列表-->
<name>dfs.ha.namenodes.cluster007</name>
<value>nn1,nn2</value>
</property>
<property>
<!-- nn1的RPC通信地址 -->
<name>dfs.namenode.rpc-address.cluster007.nn1</name>
<value>hdp1:8020</value>
</property>
<property>
<!-- nn2的RPC通信地址 -->
<name>dfs.namenode.rpc-address.cluster007.nn2</name>
<value>hdp2:8020</value>
</property>
<property>
<!-- nn1的http通信地址 -->
<name>dfs.namenode.http-address.cluster007.nn1</name>
<value>hdp1:50070</value>
</property>
<property>
<!-- nn2的http通信地址 -->
<name>dfs.namenode.http-address.cluster007.nn2</name>
<value>hdp2:50070</value>
</property>
<property>
<!-- NameNode元数据在JournalNode上的共享存储目录 -->
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hdp1:8485;hdp2:8485;hdp3:8485/cluster007</value>
</property>
<property>
<!-- Journal Edit Files的存储目录 -->
<name>dfs.journalnode.edits.dir</name>
<value>/usr/proc/hadoop/journalnode/data</value>
</property>
<property>
<!-- 配置隔离机制,确保在任何给定时间只有一个NameNode处于活动状态 -->
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<!-- 使用sshfence机制时需要ssh免密登录 -->
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<!-- SSH超时时间 -->
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<!-- 访问代理类,用于确定当前处于Active状态的NameNode -->
<name>dfs.client.failover.proxy.provider.cluster007</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<!-- 开启故障自动转移 -->
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
4、 mapred-site.xml
<configuration>
<property>
<!--指定mapreduce作业运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
5、 yarn-site.xml
<configuration>
<property>
<!--配置NodeManager上运行的附属服务。需要配置成mapreduce_shuffle后才可以在Yarn上运行MapReduce程序。-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!-- 是否启用日志聚合(可选) -->
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<!-- 聚合日志的保存时间(可选) -->
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<property>
<!-- 启用RM HA -->
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<!-- RM集群标识 -->
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-cluster007</value>
</property>
<property>
<!-- RM的逻辑ID列表 -->
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<!-- RM1的服务地址 -->
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hdp2</value>
</property>
<property>
<!-- RM2的服务地址 -->
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hdp3</value>
</property>
<property>
<!-- RM1 Web应用程序的地址 -->
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hdp2:8088</value>
</property>
<property>
<!-- RM2 Web应用程序的地址 -->
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hdp3:8088</value>
</property>
<property>
<!-- ZooKeeper集群的地址 -->
<name>yarn.resourcemanager.zk-address</name>
<value>hdp1:2181,hdp2:2181,hdp3:2181</value>
</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>
</configuration>
6、 workers(之前版本是slaves,注意查看)
hdp1
hdp2
hdp3
分发程序(有点慢约10分钟,等待完成停止不动后,回车)
scp -r /usr/proc/hadoop root@hdp2:/usr/proc/hadoop 分发到hdp2
scp -r /usr/proc/hadoop root@hdp3:/usr/proc/hadoop 分发到hdp3
启动
1、分别启动3台机器上的ZooKeeper进程
$ cd /usr/proc/zk/apache-zookeeper-3.5.9-bin/ 切换到进程目录
$ ./zkServer.sh start
2、分别启动3台机器上的Journalnode进程,(注意进程路径是sbin)
$ cd /usr/proc/hadoop/hadoop-3.3.1/sbin 切换到进程目录
$ ./hadoop-daemon.sh start journalnode
3、初始化NameNode(Active状态)(注意进程路径是bin)
然后将格式化后的元数据目录(dfs.namenode.name.dir约定目录)复制到另外一台namenode(Standby)上(scp xxx xxx)
$ cd /usr/proc/hadoop/hadoop-3.3.1/bin 切换到进程目录
$ hdfs namenode -format
scp -r /usr/proc/hadoop/namenode/data
root@hdp2:/usr/proc/hadoop/namenode/data 分发到hdp2
4、初始化HA在任意一台namenode上,推荐在Active上做(注意进程路径是bin)
$ cd /usr/proc/hadoop/hadoop-3.3.1/bin 切换到进程目录
$ hdfs zkfc -formatZK
5、启动HDFS (所有namenode和datanode都会启动,注意进程路径是sbin)
$ cd /usr/proc/hadoop/hadoop-3.3.1/sbin 切换到进程目录
$ ./start-dfs.sh
6、启动Yarn(所有RM和NodeM都会启动,注意进程路径是sbin)
$ cd /usr/proc/hadoop/hadoop-3.3.1/sbin 切换到进程目录
$ ./start-yarn.sh
查看状态
1、Zookeeper状态:
在3台机器都正确启动ZooKeeper进程后,进行查看状态,
$ cd /usr/proc/zk/apache-zookeeper-3.5.9-bin/ 切换到进程目录
$ ./zkServer.sh status
3台机器的状态,其中有一台是:leader,另外2台是:follower
2、执行JPS查看各进程状态
hdp1:
NameNode
DataNode
Journalnode
ZKFC
ResourceManager(Active)
hdp2:
SecondaryNameNode
DataNode
Journalnode
ZKFC
NodeManager
hdp3:
ResourceManager(Standby)
DataNode
Journalnode
NodeManager
3、查看Web UI
HDFS:见hdfs-site.xml配置
dfs.namenode.http-address.cluster007.nn1
Yarn:见yarn-site.xml配置
yarn.resourcemanager.webapp.address.rm1
基本操作
分别启停Hdfs
bin/hadoop-daemon.sh start/stop
namenode/datanode/secondarynamenode
分别启停Yarn
bin/yarn-daemon.sh start/stop resourcemanager/nodemanager
集群整体启停Hdfs
bin/start-dfs.sh / stop-dfs.sh
集群整体启停Yarn
bin/start-yarn.sh / stop-yarn.sh
查看当前目录
bin/hadoop dfs -ls /
查看hdfs中的目录,例如:/user/proc/xx目录下的文件
bin/hadoop fs -lsr /user/proc/xx
创建目录,例如:/user/proc/tmp
bin/hadoop fs -mkdir /user/proc/tmp
递归创建多层文件夹输入, 例如:/usr/proc/a/b/c/file1.txt
bin/hadoop fs -mkdir -p /usr/proc/a/b/c/file1.txt
重命名目录,例如:tmp重命名tmp1
bin/hadoop dfs -mv /user/proc/tmp /user/proc/tmp1
删除文件,例如:/user/proc/tmp/fileX
bin/hadoop fs -rm /user/proc/tmp/fileX
删除目录下所有文件,例如:/user/proc/tmp
bin/hadoop fs -rmr /user/proc/tmp
上传文件,例如:上传file1文件到newTmp目录
bin/hadoop fs –put /usr/proc/tmp/file1 /usr/proc/newTmp/
下载文件,例如:下载file1到tmp目录
bin/hadoop fs –get /usr/proc/newTmp/file1 /usr/proc/tmp
将指定目录下的所有内容merge成一个新文件,下载到本地
bin/hadoop dfs -getmerge /usr/proc /usr/home/newfile
查看文件,例如:/usr/proc/tmp/file1
bin/hadoop fs –cat /usr/proc/tmp/file1
将目录拷贝到本地
bin/hadoop dfs -copyToLocal /home localdir
查看dfs的情况
bin/hadoop dfsadmin -report