Bootstrap

大数据系列——Hadoop部署及应用

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系统

Linux系列——配置SSH免密登录

Linux系列——常规基础操作

安装

先在其中任意一台上面安装。

1、需要先搭建好Zookeeper集群

   具体参见:大数据系列——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下

1hadoop-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用户了。

2core-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>

3hdfs-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 (所有namenodedatanode都会启动,注意进程路径是sbin

$ cd /usr/proc/hadoop/hadoop-3.3.1/sbin 切换到进程目录

$ ./start-dfs.sh

6、启动Yarn(所有RMNodeM都会启动,注意进程路径是sbin

$ cd /usr/proc/hadoop/hadoop-3.3.1/sbin 切换到进程目录

$ ./start-yarn.sh

查看状态

1Zookeeper状态:

在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

;