小小千想和您聊一聊

当前位置: 首页> 技术分享> 第 3 章 认识Hadoop

第 3 章 认识Hadoop

  本章学习目标

  l 熟悉Hadoop的安装模式

  l 掌握用Shell命令和Java 程序操作HDFS

  l 理解HDFS架构的原理

  l 理解Yarn架构的原理

  Hadoop是一个开源框架,也是大数据主要框架之一。Hadoop最核心的设计是:HDFS和MapReduce。其中,HDFS为海量数据提供了存储,MapReduce为海量数据提供了计算。Hadoop可以让用户在不了解分布式底层细节的情况下,根据需求进行应用程序开发。

  3.1 Hadoop简介

  3.1.1 什么是Hadoop

  1. Hadoop概念

  Hadoop是一个大数据分布式存储和分析框架。Hadoop旨在从单个服务器扩展到数千台计算机,每台计算机都提供本地计算和存储,充分体现了大数据集群进行高速运算和存储的特点。

  2. Hadoop的产生和发展

  Hadoop最早起源于Nutch。Nutch 是一个Java实现的开源搜索引擎。Nutch的设计目标是构建一个大型的全网搜索引擎,这个搜索引擎包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的问题——如何存储数十亿个网页和对信息建立索引。

  2003年、2004年谷歌发表的两篇论文为以上问题提供了解决方案。论文内容主要涉及以下两个框架。

  (1)分布式文件系统(GFS),主要用于海量数据的存储。

  (2)分布式计算框架(MapReduce),主要用于海量数据的索引计算问题。

  Nutch的开发人员根据谷歌的GFS和MapReduce,完成了开源版本的NDFS和MapReduce。2006年2月,Nutch的NDFS和MapReduce发展成独立的项目Hadoop。

  2008年,Hadoop成为Apache的顶级项目。同年,Hadoop成为最快的TB级数据排序系统。自此以后,Hadoop逐渐被企业应用于生产,处理大数据的速度越来越快。目前,Hadoop已经被主流企业广泛使用。

  3.1.2

  3.1.4 Hadoop生态圈的相关组件

  除了HDFS、MapReduce 、Yarn三大核心组件,Hadoop生态圈的其他组件主要有Zookeeper、MySQL、Hive、Hbase、Flume、Sqoop。Hadoop生态圈各组件的含义,如表3.1所示。

  表3.1 Hadoop生态圈各组件的含义

  对于这些组件,在接下来的章节中,会一一讲解。

  3.2 Hadoop的安装模式

  使用Hadoop才能更好地理解其特点,在使用之前,首先要了解Hadoop的安装模式,Hadoop的安装模式分为单机模式(Standalone)、伪分布式(Pseudo-Distributed)、全分布式(Fully-Distributed)三种模式。在虚拟机qfedu上安装Hadoop。

  3.2.1 Hadoop的单机模式

  Hadoop的默认模式是单机模式。在不了解硬件安装环境的情况下,Hadoop第一次解压其源码包时,它保守地选择了最小配置。Hadoop会完全运行在本地。因此它不需要与其他节点进行交互,那么它也就不使用HDFS,也不加载任何Hadoop的守护进程。单机模式不需要启动任何服务即可使用,一般只用于调试。Linux环境下Hadoop单机模式的安装过程如下。

  1.安装JDK

  一般安装Oracle JDK,这里安装1.8版本的JDK。

  (1)将JDK安装包jdk-8u121-linux-x64.rpm(见附件A)放到/home/qfedu/Downloads/目录下。

  (2)切换到root用户,解压JDK安装包。

  [qfedu@localhost ~]$ su root

  [root@localhost ~]# rpm -ivh /home/qfedu/Downloads/jdk-8u121-linux-x64.rpm

  2.安装Hadoop

  (1)将安装包hadoop-2.7.3.tar.gz(见附件A)放到虚拟机中的/home/qfedu/Downloads/目录下,并解压到/usr/local/下。

  [root@localhost Downloads]# tar -zxvf hadoop-2.7.3.tar.gz -C /usr/local/

  (2)打开文件/etc/profile,配置hadoop环境变量。

  [root@localhost Downloads]# vi /etc/profile

  (3)编辑/etc/profile时,依次按下G键,o键,将光标移动到文件末尾,添加如下内容。编辑完成后,先按Esc键,后按:wq保存退出。

  # Hadoop environment variables

  export JAVA_HOME=/usr/java/jdk1.8.0_121/

  export HADOOP_HOME=/usr/local/hadoop-2.7.3/

  export PATH=$PATH:JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

  (4)使配置文件生效。

  [root@localhost Downloads]# source /etc/profile

  3.测试Hadoop是否安装成功

  (1)查看Hadoop版本,输入以下内容。

  [root@localhost Downloads]# hadoop version

  输出如下内容即正确:

  Hadoop 2.7.3

  (2)查看hadoop安装路径,输入如下内容。

  [root@localhost Downloads]# which hadoop

  输出如下内容即正确:

  /usr/local/hadoop-2.7.3/bin/hadoop

  3.2.2 Hadoop的伪分布式

  上一小结对Hadoop单机模式的安装进行了讲解,下面对Hadoopd伪分布式的安装进行讲解。这里会用到对JDK和Hadoop环境变量的配置,配置方式和上一小结相同,不再赘述。下面讲述在配置环境变量文件生效后,对Hadoop配置文件的配置及其后面的步骤。

  1.配置hadoop-env.sh文件

  (1)切换到/usr/local/hadoop-2.7.3/etc/hadoop/目录下,打开hadoop-env.sh文件。

  [root@localhost hadoop]# vi hadoop-env.sh

  (2)在hadoop-env.sh文件中,将export JAVA_HOME=${JAVA_HOME}修改为以下内容。

  export JAVA_HOME=/usr/java/jdk1.8.0_121/

  2.配置core-site.xml文件

  (1)打开core-site.xml文件

  [root@localhost qfedu]# cd /usr/local/hadoop-2.7.3/etc/hadoop/

  [root@localhost hadoop]# vi core-site.xml

  (2)在core-site.xml文件中输入以下内容。

  fs.defaultFS

  hdfs://localhost:9000

  3.配置HDFS的hdfs-site.xml文件

  (1)打开hdfs-site.xml文件。

  [root@localhost hadoop]# vi hdfs-site.xml

  (2)在hdfs-site.xml文件中输入以下内容。

  dfs.replication

  1

  4.配置MapReduce的mapred-site.xml文件

  (1)创建mapred-site.xml文件。

  [root@localhost hadoop]# vi mapred-site.xml

  (2)在mapred-site.xml文件中输入以下内容。

  mapreduce.framework.name

  yarn

  5.配置Yarn的yarn-site.xml文件

  (1)打开yarn-site.xml文件。

  [root@localhost hadoop]# vi yarn-site.xml

  (2)在yarn-site.xml文件中输入以下内容。

  yarn.nodemanager.aux-services

  mapreduce_shuffle

  6.格式化HDFS文件系统

  [root@localhost hadoop]# hdfs namenode -format

  7.启动Hadoop集群

  (1)启动Hadoop集群。

  [root@localhost hadoop]# start-all.sh

  (2)用jps命令查看Hadoop集群的相关进程。

  [root@localhost hadoop]# jps

  6208 ResourceManager

  5674 NameNode

  6028 SecondaryNameNode

  5823 DataNode

  6527 NodeManager

  6591 Jps

  从上面结果可以看到相关进程全部启动。

  8.检测

  (1)上传当前文件夹下的mapred-site.xml.template文件到HDFS的/目录下。

  [root@localhost hadoop]# hdfs dfs -put ./mapred-site.xml.template /

  (2)查看上传的mapred-site.xml.template文件。

  [root@localhost hadoop]# hdfs dfs -cat /mapred-site.xml.template

  (3)查看本地mapred-site.xml.template文件。

  [root@localhost hadoop]# cat mapred-site.xml.template

  如果两个文件的内容一致,表明Hadoop的伪分布式集群搭建成功。

  3.2.3 Hadoop的全分布式

  重要提示:在Hadoop全分布式搭建前,需要先关闭hadoop集群,关闭命令如下。

  [root@localhost hadoop]# stop-all.sh

  Hadoop全分布式搭建规划,如表3.2所示。

  表3.2 Hadoop全分布式搭建规划

  本书的Hadoop全分布式搭建基于Hadoop伪分布式,具体步骤如下。

  1.克隆虚拟机

  克隆3台虚拟机qf01、qf02、qf03,具体克隆步骤,见第1章 1.5.2 克隆。

  2.修改主机名

  分别修改虚拟机qf01、qf02、qf03的主机名(hostname)。

  (1)分别打开虚拟机qf01、qf02、qf03的/etc/hostname文件。

  [root@localhost ~]# vi /etc/hostname

  (2)分别修改主机名,具体做法如下。

  ①将虚拟机qf01的hostname文件中的内容替换为qf01。

  ②将虚拟机qf02的hostname文件中的内容替换为qf02。

  ③将虚拟机qf03的hostname文件中的内容替换为qf03。

  3.修改网络设置

  (1)分别打开虚拟机qf01、qf02、qf03的/etc/sysconfig/network-scripts/ifcfg-ens33文件。

  [root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33

  (2)分别修改网络设置,具体做法如下。

  ①将虚拟机qf01的ifcfg-ens33文件中的IPADDR=192.168.11.1修改为IPADDR=192.168.11.11。

  ②将虚拟机qf02的ifcfg-ens33文件中的IPADDR=192.168.11.1修改为IPADDR=192.168.11.12。

  ③将虚拟机qf03的ifcfg-ens33文件中的IPADDR=192.168.11.1修改为IPADDR=192.168.11.13。

  (3)重启虚拟机qf01、qf02、qf03。

  单击VMware Workstation中的▼下拉菜单,在出现的下拉菜单中,单击“重新启动客户机”选项。

  4.修改/etc/resolv.conf文件

  resolv.conf是指DNS域名解析配置文件。

  (1)分别打开虚拟机qf01、qf02、qf03的/etc/resolv.conf文件。

  [root@qf01 ~]# vi /etc/resolv.conf

  [root@qf02 ~]# vi /etc/resolv.conf

  [root@qf03 ~]# vi /etc/resolv.conf

  (2)分别将文件中的内容替换为以下内容。

  nameserver 192.168.11.2

  5.分别关闭虚拟机qf01、qf02、qf03的防火墙

  [root@localhost ~]# systemctl stop firewalld.service

  6.配置SSH免密登录

  此处的SSH免密登录是指虚拟机qf01通过SSH免密登录虚拟机qf02、qf03。

  (1)分别删除虚拟机qf01、qf02、qf03的~/.ssh目录。注意:在使用rm -rf命令时,要特别小心,避免误删文件。

  [root@qf01 ~]# rm -rf .ssh

  [root@qf02 ~]# rm -rf .ssh

  [root@qf03 ~]# rm -rf .ssh

  (2)在虚拟机qf01上新建SSH公私秘钥对。

  [root@qf01 ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

  (3)在虚拟机qf01上修改/etc/hosts文件。

  ①打开/etc/hosts文件。

  [root@qf01 ~]# vi /etc/hosts

  ②在文件末尾,换行添加以下内容。

  192.168.11.11 qf01

  192.168.11.12 qf02

  192.168.11.13 qf03

  (4)在虚拟机qf01上配置免密登录虚拟机qf01、qf02、qf03。

  在实际工作中,ssh-copy-id命令的作用:复制本地用户的公钥到远程主机指定用户的认证库中,实现本地用户通过SSH免密登录远程主机指定用户。本书进行模拟操作,实现虚拟机qf01(本地root用户)通过SSH免密登录虚拟机qf01、qf02、qf03(3台远程主机的root用户)。

  [root@qf01 ~]# ssh-copy-id root@qf01

  [root@qf01 ~]# ssh-copy-id root@qf02

  [root@qf01 ~]# ssh-copy-id root@qf03

  提示:出现(yes/no)?,输入yes,按下回车键。

  (5)将虚拟机qf01的hosts文件分发到虚拟机qf02、qf03。

  为了便于在虚拟机qf01向虚拟机qf02、qf03分发目录或文件,此处编写一个Shell脚本xsync.sh。

  ①在虚拟机qf01上的/usr/local/bin目录下新建xsync.sh文件。在/usr/local/bin目录下的Shell脚本文件可以在任意位置被调用,使用起来比较方便。

  [root@qf01 ~]# cd /usr/local/bin

  [root@qf01 bin]# vi xsync.sh

  ②在文件中输入以下内容。

  #!/bin/bash

  if [ $# -lt 1 ] ; then echo no params ; exit ; fi

  user=`whoami`

  # 取出目录(或文件)名称

  filename=`basename $1`

  dir=`dirname $1`

  # 切换到目录(或文件)所在的路径下

  cd $dir

  # 获取当前路径的绝对路径

  fullpath=`pwd -P`

  for (( i=2; i<=3 ; i++ )) ; do

  tput setaf 5

  echo ============ qf0$i $@ ============

  tput setaf 9

  rsync -lr $filename $user@qf0$i:$fullpath

  done

  其中,rsync命令的作用是:实现本地用户和远程主机指定用户的文件同步和本地不同路径下文件的同步。

  ③为xsync.sh文件的所有者添加执行权限。

  [root@qf01 bin]# chmod u+x xsync.sh

  ④使用xsync.sh将虚拟机qf01的/etc/hosts文件分发到虚拟机qf02、qf03。

  [root@qf01 ~]# xsync.sh /etc/hosts

  (6)验证SSH免密登录是否配置成功。

  [root@qf01 bin]# ssh qf02

  出现如下内容,表明虚拟机qf01通过SSH成功登录虚拟机qf02。

  [root@qf02 ~]#

  输入exit,按下回车键,退回到虚拟机qf01。

  7.修改相关配置文件

  (1)在虚拟机qf01上,切换到/usr/local/hadoop-2.7.3/etc/hadoop/目录下。

  [root@qf01 ~]# cd /usr/local/hadoop-2.7.3/etc/hadoop/

  (2)配置core-site.xml文件。

  ①打开core-site.xml文件。

  [root@qf01 hadoop]# vi core-site.xml

  ②将core-site.xml文件中的内容替换为以下内容。

  fs.defaultFS

  hdfs://qf01:9000

  hadoop.tmp.dir

  /tmp/hadoop-qf01

  io.file.buffer.size

  4096

  (3)配置hdfs-site.xml文件。

  ①打开hdfs-site.xml文件。

  [root@qf01 hadoop]# vi hdfs-site.xml

  ②将hdfs-site.xml文件中的内容替换为以下内容。

  dfs.replication

  3

  dfs.blocksize

  134217728

  dfs.namenode.name.dir

  /home/hadoopdata/dfs/name

  dfs.datanode.data.dir

  /home/hadoopdata/dfs/data

  dfs.namenode.http-address

  qf01:50070

  dfs.namenode.secondary.http-address

  qf03:50090

  dfs.webhdfs.enabled

  true

  dfs.permissions.enabled

  false

  (4)配置mapred-site.xml文件。

  ①打开mapred-site.xml文件。

  [root@qf01 hadoop]# vi mapred-site.xml

  ②将mapred-site.xml文件中的内容替换为以下内容。

  mapreduce.framework.name

  yarn

  (5)配置yarn-site.xml。

  ①打开yarn-site.xml文件。

  [root@qf01 hadoop]# vi yarn-site.xml

  ②将yarn-site.xml文件中的内容替换为以下内容。

  yarn.resourcemanager.hostname

  qf01

  yarn.nodemanager.aux-services

  mapreduce_shuffle

  yarn.resourcemanager.address

  qf01:8032

  yarn.resourcemanager.scheduler.address

  qf01:8030

  yarn.resourcemanager.resource-tracker.address

  qf01:8031

  yarn.resourcemanager.admin.address

  qf01:8033

  yarn.resourcemanager.webapp.address

  qf01:8088

  (6)设置从节点(slave),即修改slaves文件。

  ①打开slaves文件。

  [root@qf01 hadoop]# vi slaves

  ②此处填写所有需要配置成从节点的主机名。具体做法:将slaves文件中的内容替换为以下内容。注意:每个主机名占一行。

  qf01

  qf02

  qf03

  8.分发配置文件

  [root@qf01 hadoop]# xsync.sh /usr/local/hadoop-2.7.3/etc/hadoop

  9.初始化HDFS

  初始化HDFS,只能进行一次,如果初始化HDFS不成功,需要重新搭建。由于Hadoop集群搭建涉及细节较多,建议在初始化HDFS之前,先对每个虚拟机拍摄快照。拍摄快照后,在虚拟机qf01的终端,输入以下命令,初始化HDFS。

  [root@qf01 hadoop]# hdfs namenode -format

  倒数第9行,出现INFO common.Storage: common.Storage: Storage directory /home/hadoopdata/dfs/name has been successfully formatted,表明初始化HDFS已成功。

  10.启动和查看Hadoop进程

  (1)启动Hadoop进程。

  [root@qf01 hadoop]# start-all.sh

  (2)查看Hadoop进程。

  ①在虚拟机qf01中查看Hadoop进程。

  [root@qf01 hadoop]# jps

  17089 ResourceManager

  17427 Jps

  16917 SecondaryNameNode

  16699 DataNode

  17196 NodeManager

  16590 NameNode

  以17089 ResourceManager为例,17089是指进程ID。

  ②在虚拟机qf02中查看Hadoop进程。

  [root@qf02 hadoop]# jps

  3140 Jps

  2968 NodeManager

  2877 DataNode

  ③在虚拟机qf03中查看Hadoop进程。

  [root@qf03 hadoop]# jps

  16512 NodeManager

  16682 Jps

  16412 DataNode

  如果看到规划的Hadoop进程均已启动,表明Hadoop全分布式搭建成功。

  注意:由于只在root用户下搭建了Hadoop全分布式,再次启动虚拟机时,需要切换到root用户下,进行相关操作。

  (3)编写脚本查看Hadoop进程。

  目前在3台虚拟机上查看Hadoop进程,操作相对简单。在实际工作中,可能会查看几十台服务器上的Hadoop进程,操作起来就比较烦琐。以当前的Hadoop全分布式集群为例,可以编写Shell脚本xcmd.sh来简化操作。

  xcmd.sh的具体用途:在虚拟机qf01上查看虚拟机qf01、qf02、qf03上执行相同命令操作的结果。编写xcmd.sh脚本和查看Hadoop进程的步骤如下。

  ①在虚拟机qf01上的/usr/local/bin目录下新建xcmd.sh文件,输入以下内容。

  #!/bin/bash

  if [ $# -lt 1 ] ; then echo no params ; exit ; fi

  for (( i=1 ; i<=3 ; i++ )) ; do

  tput setaf 5

  echo ============ qf0$i $@ ============

  tput setaf 9

  ssh qf0$i "$@"

  done

  ②为xcmd.sh文件的所有者添加执行权限。

  [root@qf01 hadoop]# chmod u+x xcmd.sh

  ③在虚拟机qf01上,使用xcmd.sh脚本查看Hadoop的所有进程,具体如下。

  [root@qf01 bin]# xcmd.sh jps

  ============ qf01 jps ============

  25604 ResourceManager

  25718 NodeManager

  25147 NameNode

  26221 Jps

  25295 DataNode

  ============ qf02 jps ============

  10731 Jps

  10252 DataNode

  10414 NodeManager

  ============ qf03 jps ============

  21699 DataNode

  21813 SecondaryNameNode

  21948 NodeManager

  22270 Jps

  3.2.4 查看Web界面

  1.查看NameNode的Web界面

  (1)方法一:在windows系统的浏览器中输入网址http://192.168.11.11:50070。

  (2)方法二:在CentOS系统的浏览器中输入网址http://192.168.11.11:50070,或者http://qf01:50070。

  50070是NameNode的默认端口号。NameNode的Web界面,如图3.1所示。

  图3.1 NameNode的Web界面

  2. 查看ResourceManager的Web界面

  在浏览器中输入网址http://192.168.11.11:8088或者http://qf01:8088,查看ResourceManager的Web界面,如图3.2所示。8088是ResourceManager的默认端口号。

  图3.2 ResourceManager的Web界面

  3.2.5 SSH免密登录

  SSH,Secure Shell,专为远程登录会话和其他网络服务提供安全保障的协议。

  当1台计算机的某些软件需要频繁使用SSH协议远程连接其他计算机时,这时需要人工填写大量其他计算机的密码,这会存在大量无用操作,影响工作效率。在为了避免这类问题的出现,同时兼顾安全问题,可以设置SSH免密登录。

  如果1台机器需要SSH远程登录其他机器,就在这台机器上配置SSH免密登录。SSH免密登录是通过配置公钥和私钥(“公私钥”认证)来实现的。配置SSH免密登录的方法见本章“3.2.3 Hadoop的全分布式”的“6.配置SSH免密登录”。

  3.2.6 启动和关闭Hadoop进程的命令

  启动和关闭Hadoop进程的常用命令及含义,如表3.3所示。

  表3.3启动和关闭Hadoop进程的常用命令及含义

  3.3 HDFS

  3.3.1 HDFS简介

  1.HDFS概念

  HDFS(Hadoop Distributed File System,Hadoop分布式文件系统)是一种通过网络实现文件在多台主机上进行分布式存储的文件系统。分布式存储是指数据在存储时,可以分发到多台机器上进行存储。分布式存储比普通存储方式节省时间。

  例如,现有10台计算机,每台计算机上有1TB的硬盘。如果将Hadoop安装在这10台计算机上,可以使用HDFS进行分布式的文件存储。如果现在需要存储1个5TB的文件,用HDFS分布式的文件存储方式,明显比用普通方式在1台计算机上存储更节省时间,这就如同3个人吃3个苹果比1个人吃3个苹果要快。

  2.HDFS数据的存储和读取方式

  (1)对大文件的存储,HDFS采用分割的方式解决。HDFS将大文件分割到既定的存储块(Block)中进行存储,并通过本地设定的任务节点进行预处理。

  (2)对于大量小文件的存储,HDFS通过普通的编程与压缩方式进行解决。在实际工作中,更多时候是产生并存储大量的小文件。

  (3)对于普通文件的读取操作,HDFS更多地是考虑对数据进行分批次读取。

  (4)对于大量数据的读取,采用集中式存储的方式,在存储时进行优化,使得对于该文件以后的读取能够在一个连续的区域内进行,从而节省读取数据的时间。

  (5)对于少量数据的随机读取,HDFS一般采用按序读取的方式,即先把少量的随机读取操作合并,后按顺序读取数据。

  3.HDFS的优点

  (1)成本低。

  HDFS可以部署在低廉的硬件上,成本较低。例如,台式机或笔记本电脑,就可以部署HDFS。

  (2)高容错。

  HDFS运用众多服务器实现分布式存储,每个数据文件都有2个冗余备份,也就是每个数据文件都将被存储3次。如果存储数据的某个服务器发生了故障,还有2个备份,因此,HDFS具有高容错的特性,允许服务器发生故障。

  (3)高吞吐量。

  吞吐量是指单位时间内完成的工作量。HDFS实现了并行处理海量数据,大大减少了处理时间,从而实现了高吞吐量。

  (4)存储数据种类多。

  HDFS可以存储任何类型的数据,例如,结构化的数据、非结构化的数据、半结构化的数据。

  (5)可移植。

  HDFS可以实现不同平台之间的移植。

  4. HDFS的缺点

  (1)不适用于低时间延迟的数据访问。

  (2)无法高效存储海量小文件。

  (3)不适用于多用户写入和任意位置修改文件。

  3.3.2 HDFS架构

  对于 HDFS 架构来说,一个 HDFS 基本集群的节点主要包括 NameNode、DataNode、SecondaryNameNode。

  HDFS采用的主/从模式架构,如图3.3所示。

  图3.3 HDFS架构图

  1.HDFS的Client、NameNode、DataNode

  在图3.3中,Client是指客户端,NameNode是指名称节点,SecondaryNamenode是指辅助名称节点,DataNode是指数据节点。下面分别介绍各部分的功能。

  (1)Client。

  Client主要负责切分文件,与各节点进行交互。

  切分文件是指文件会被分割成数据块(block)。数据块默认大小是128M,以数据块为单位,每个数据块有多个副本存储在不同的机器上,副本数可在文件生成时指定(默认有3个副本)。

  交互包括与NameNode进行交互,Client从NameNode获取文件的元数据;与DataNode进行交互,Client从DataNode读取数据和向DataNode写入数据。

  元数据是指描述数据属性的数据。这些数据属性包括存储位置、格式、权限、大小、历史版本等。

  (2)NameNode。

  NameNode是HDFS架构中的主节点(或称Master节点)。在HDFS架构中只有一个NameNode。NameNode主要负责管理HDFS的元数据,负责配置副本的放置策略,处理Client请求。

  HDFS副本的放置策略称为机架感知策略。以默认的3个副本为例,具体策略如下。

  ①第一个副本放在本地机架的一个节点上。

  ②第二个副本放置在同一机架的另一个节点(随机选择)上。

  ③第三个副本放在不同机架的节点上。

  如果还有更多的副本就随机放在集群的其他节点上。

  这种策略减少了机架间的数据传输,从而提高了写操作的效率。机架故障的可能性远小于节点故障的可能性,因此这个策略保证了数据的可靠性。

  为了降低整体的带宽消耗和读取延时,HDFS会让程序尽量读取离它最近的副本。如果读取程序的同一个机架上有一个副本,那么就读取该副本;如果一个Hadoop集群跨越多个数据中心,那么优先读取本地数据中心的副本。

  (3)fsimage和edits。

  fsimage(镜像文件)和edits(日志文件)是NameNode中两个很重要的文件。fsimage存放的是元数据镜像文件,内容是NameNode启动时对整个文件系统的快照。edits存放的是元数据操作日志,内容是每次保存fsimage之后至下次保存fsimage之间进行的所有HDFS操作。

  在qf01中查看fsimage和edits文件,输入如下命令。

  [root@qf01 ~]# cd /tmp/hadoop-root/dfs/name/current/

  [root@qf01 current]# ls

  edits_0000000000000000001-0000000000000000001 fsimage_0000000000000000012.md5

  edits_0000000000000000002-0000000000000000011 fsimage_0000000000000000014

  edits_0000000000000000012-0000000000000000012 fsimage_0000000000000000014.md5

  edits_0000000000000000013-0000000000000000014 seen_txid

  edits_inprogress_0000000000000000015 VERSION

  fsimage_0000000000000000012

  (4)Secondary NameNode。

  SecondaryNameNode主要是用来进行镜像备份,对NameNode中的edits文件与fsimage文件进行定期合并。镜像备份是指备份fsimage文件。

  随着操作HDFS的次数越来越多,edits文件也会越来越多,所占存储空间越来越大。如果NameNode出现故障,NameNode重启时,会先把fsimage文件加载到内存中,然后合并edits文件,由于edits文件所占空间比较大,会导致NameNode重启很耗时。对于实际操作来说,这是一个比较麻烦的问题。SecondaryNameNode对Namenode中的edits文件与fsimage文件进行定期合并,很好地解决了这一问题,这也是HDFS高容错特点的一个表现。

  合并edits文件和fsimage文件,SecondaryNameNode每隔1小时执行1次,可能会出现数据丢失问题。目前大部分企业采用Hadoop的HA(High Available,高可用)模式下备用的NameNode,对Namenode中的edits文件与fsimage文件进行实时合并。Hadoop的HA模式,详见第4章。

  (5)DataNode。

  DataNode是HDFS架构中的从节点(或称Slave节点)。DataNode负责存储client发来的数据块,执行数据块的读写操作,汇报存储信息给NameNode。

  2.HDFS数据损坏的处理

  在HDFS架构使用过程中,可能会出现数据损坏的情况。这种情况发生时HDFS处理步骤如下。

  (1)当DataNode读取Block时,会计算Checksum(校验和)。

  (2)如果计算后的Checksum,与Block创建时值不一样,说明该Block已经损坏。

  (3)Client读取其他DataNode上的Block。

  (4)NameNode标记该块已经损坏,然后复制Block达到预期先置的文件副本数。

  (5)DataNode在新文件创建三周后验证其Checksum。

  3.HDFS的数据读写流程

  (1)HDFS的数据读取流程,如图3.4所示。

  图3.4 HDFS的数据读取流程

  下面对这一过程进行具体讲解。

  ①Client通过调用FileSystem对象的get()方法打开需要读取的文件,这是一个常见的HDFS读取实例。

  ②FileSystem通过远程过程调用协议(RPC,详见3.5节)调用NameNode的元数据来确定文件的前几个Block在DataNode上的存放位置,便于加快读取速度。接下来,DataNode按照机架距离进行排序,如果Client本身就是一个DataNode,那么优先从本地DataNode节点读取数据。HDFS实例做完以上工作后,返回一个FSDataInputStream给Client,让其从FSDataInputStream中读取数据。接下来,FSDataInputStream包装一个DFSInputStream,用来管理DataNode和NameNode的输入或输出(Input或Output,I/O)。

  ③NameNode向Client返回一个包含数据信息的地址,Client根据地址创建一个FSDataInputStream开始对数据进行读取。

  ④FSDataInputStream根据前几个Block在DataNode的存放位置,连接到最近的DataNode。Client反复调用read()方法,从DataNode读取数据。

  ⑤当读到Block的结尾时,FSDataInputStream会关闭当前DataNode的连接,查找能够读取下一个Block的最近的DataNode。

  ⑥读取完成后,调用close()方法,关闭FSDataInputStream。

  以上是HDFS的数据读取流程。

  如果在HDFS数据读取期间,Client与DataNode间的通信发生错误,Client会寻找下一个最近的DataNode。Client记录发生错误的DataNode,以后不再读取该DataNode上数据。

  (2)HDFS的数据写入流程,如图3.5所示。

  图3.5 HDFS的数据写入流程

  下面对这一过程进行具体讲解。

  ①Client通过调用FileSystem的create()方法来请求创建文件。

  ②FileSystem通过对NameNode发出远程请求,在NameNode里面创建一个新的文件。FileSystem给Client返回一个FSDataOutputStream用来写入数据。FSDataOutputStream包装一个DFSOutputStream 用于DataNode与NameNode间的通信。

  ③FSDataOutputStream 把需要写入的数据分成Packet(数据包)的形式,由 DataStreamer 来读取。DataStreamer的职责是让NameNode给合适的DataNode分配Block来备份数据。假设有3个DataNode,DataStreamer先将数据写入第一个DataNode后,第一个DataNode将Packet复制到第二个DataNode,然后第二个DataNode将Packet复制到第三个DataNode。

  ④FSDataOutputStream维护了一个内部关于packets的队列,其中存放等待被DataNode确认无误的packets的信息。这个队列称为等待队列。当且仅当packet被数据流中的所有节点都确认无误后,一个packet的信息才被移出本队列。

  ⑤当Client完成数据的写入后,会调用数据流的close()方法,关闭数据流。Client在将写入完成的信息反馈给NameNode。

  以上是HDFS的数据写入流程。如果写入数据时,DataNode发生错误,其处理过程如下。

  (1)发现错误后,关闭数据流,将没有被确认的数据放到数据队列的开头。当前的Block被赋予一个新的标识后,发给NameNode,在损坏的数据节点恢复后,删除这个没有被完成的Block。

  (2)移除损坏的DataNode。NameNode检测到一个Block的信息还没有被复制完成,就在其他的DataNode上安排复制。接下来,Block写入操作见HDFS的数据写入流程。

  以上对HDFS数据的读取和写入的流程进行了讲解,了解这些基本原理,对于深入学习和应用HDFS非常重要。

  3.3.3 HDFS的Shell命令

  HDFS提供了Shell命令来操作HDFS,这些Shell命令和对应的Linux Shell命令相似,这样设计有利于使用者快速学会操作HDFS。

  在使用Shell命令操作HDFS之前,需要先启动Hadoop。

  [root@qf01 ~]# start-dfs.sh

  HDFS Shell命令的一般格式为:

  hdfs dfs -cmd 参数

  HDFS常见的Shell命令如下。

  1.put

  (1)put命令可以上传本地(CentOS系统)文件或本地目录到HDFS目录,使用方法如下。

  hdfs dfs -put 本地文件或本地目录 HDFS目录

  (2)通过示例演示其用法,具体如下。

  ①新建本地文件1.txt,并写入内容hello。

  [root@qf01 ~]# echo hello > 1.txt

  ②把本地文件1.txt上传到HDFS的根目录下。

  [root@qf01 ~]# hdfs dfs -put 1.txt /

  ③新建本地目录data,把目录data上传到HDFS的根目录下。

  [root@qf01 ~]# mkdir data

  [root@qf01 ~]# hdfs dfs -put data /

  2.ls

  (1)ls命令可以列出HDFS文件或目录,使用方法如下。

  hdfs dfs -ls HDFS文件/HDFS目录

  (2)通过示例演示其用法,具体如下。

  [root@qf01 ~]# hdfs dfs -ls /

  -rw-r--r-- 3 root supergroup 6 2018-07-17 11:50 /1.txt

  drwxr-xr-x - root supergroup 0 2018-07-17 12:00 /data

  3.cat

  (1)cat命令可以查看HDFS文件的内容,使用方法如下。

  hdfs dfs -cat HDFS文件

  (2)通过示例演示其用法,具体如下。

  [root@qf01 ~]# hdfs dfs -cat /1.txt

  hello

  4.get

  (1)cat命令可以下载HDFS文件或目录到本地,使用方法如下。

  hdfs dfs -get HDFS文件或目录 本地目录

  (2)通过示例演示其用法,具体如下。

  [root@qf01 ~]# rm -f 1.txt

  [root@qf01 ~]# hdfs dfs -get /1.txt ~

  [root@qf01 ~]# cat 1.txt

  hello

  通过以上讲解,可以很容易地理解HDFS Shell命令的操作方式。以下命令进行简要介绍。

  5.其他常用命令

  hdfs dfs -mkdir /aaa 在HDFS的根目录下创建目录aaa

  hdfs dfs -cp /1.txt /2.txt 复制HDFS的/1.txt重命名为根目录下的2.txt

  hdfs dfs -mv /1.txt /aaa 移动HDFS的/1.txt到/aaa目录下

  hdfs dfs -mv /2.txt /3.txt 重命名HDFS根目录下的2.txt为3.txt

  hdfs dfs -rm /3.txt 删除HDFS的文件/3.txt

  hdfs dfs -rm -r /data 删除HDFS的目录/data

  hdfs dfs -chmod 777 /aaa/1.txt 为HDFS的/aaa/1.txt文件的所有用户设置读写执行权限

  3.3.4 Java 程序操作HDFS

  1.概述

  Hadoop除了可以使用HDFS Shell命令操作HDFS外,还可以通过Java 程序操作HDFS。在实际工作中,大多是通过程序来操作HDFS的。

  Java程序通过Hadoop提供的文件操作类可以进行读写HDFS文件、上传HDFS文件等操作。这些文件操作类都在org.apache.hadoop.fs包中(详见Hadoop的Java API文档,网址为http://hadoop.apache.org/docs/r2.7.3/api/index.html)。

  API(Application Programming Interface,应用程序编程接口)是指一些预先定义的函数。API使应用程序与开发人员获得了一种重要能力:在无须访问源码或理解内部工作机制细节的情况下,访问一组例程。

  2.开发环境搭建

  (1)配置Java环境

  在Windows系统下配置Java环境,也就是安装JDK,记住JDK安装路径。这里用的JDK版本是1.8.0_121,安装包见附录A jdk-8u121-windows-x64.exe)。

  (2)安装InterlliJ IDEA(安装包见附录A),导入配置文件Settings(见附录A Settings.jar,大数据软件包),添加Maven依赖(即配置pom.xml文件)。

  ①Maven简介。

  Maven是指通过项目对象模型文件(pom.xml)来管理项目的构建、报告和文档的工具。简言之,Maven是一种项目管理工具。

  pom.xml文件是Maven的基本单元。Maven最强大的功能是通过pom.xml文件自动下载项目依赖库。

  ②配置文件Settings。

  用户在熟练使用InterlliJ IDEA后,可以对InterlliJ IDEA进行个性化配置。本书直接提供了Settings文件,有利于缩短前期的探索时间。

  导入配置文件Settings的方法:单击InterlliJ IDEA中菜单栏的File菜单,在下拉列表中单击Import Settings...选项,选择Settings的存放位置,单击OK即可。

  3. InterlliJ IDEA新建项目

  InterlliJ IDEA新建项目(Project)步骤如下。

  (1)单击InterlliJ IDEA菜单栏的File菜单,在出现的列表中单击New选项,在出现的列表中单击Project...选项(见图3.6),进入新建项目对话框,如图3.7所示。

  图3.6 新建项目菜单

  图3.7 新建项目

  (2)在图3.7的Project SDK一栏中,单击New按钮,出现选择JDK的安装路径(Select Home Director for JDK)对话框,如图3.8所示。

  图3.8 选择JDK的安装路径

  (3)在图3.8中,单击jdk1.8.0_121后,单击OK,回到选择JDK的安装路径对话框;单击Next按钮,进入询问是否从模板中创建项目对话框,如图3.9所示。

  图3.9 询问是否从模板中创建项目

  (4)在图3.9中,单击Next按钮,进入填写项目名称、存放位置对话框,如图3.10所示。

  图3.10 填写项目名称、存放位置

  (5)在图3.10中,在Project name栏中填写testHadoop,在Project location栏中填写D:\IdeaProjects\testHadoop,单击Finish按钮,出现询问是否创建目录对话框,如图3.11所示。

  图3.11 询问是否创建目录

  (6)在图3.11中,单击OK,进入新建项目完成界面,如图3.12所示。

  图3.12 新建项目完成界面

  至此,InterlliJ IDEA新建项目完成。

  4. InterlliJ IDEA新建模块

  InterlliJ IDEA新建模块(Module)步骤如下。

  (1)在图3.12中,右击左侧Project栏中的项目名testHadoop,在出现的列表中单击New选项,在出现的列表中单击Module选项(见图3.13),进入新建模块对话框,如图3.14所示。

  图3.13 新建模块菜单

  图3.14 新建模块

  (2)在图3.14中,单击Maven,在Project SDK一栏中,单击New按钮,选择JDK的安装路径(不再赘述)。单击Next按钮,进入填写组织名、模块名、版本对话框,如图3.15所示。

  图3.15 填写组织名、模块名、版本

  (3)在图3.15中的GroupId栏填写组织名com.qf,在ArtifactId栏填写模块名testHDFS,单击Next按钮,进入填写模块名称等内容的对话框,如图3.16所示。

  图3.16 填写模块名称等内容

  (4)在图3.16中,单击Finish按钮,出现待填写的pom.xml文件,如图3.17所示。


  图3.17 待填写的pom.xml文件

  (5)修改pom.xml文件的内容,具体如下。

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

  4.0.0

  com.qf

  testHDFS

  1.0-SNAPSHOT

  org.apache.hadoop

  hadoop-client

  2.7.3

  junit

  junit

  4.12

  至此,InterlliJ IDEA新建模块完成。

  5.编写Java程序

  (1)新建Java OperateHDFS类。

  在图3.17中,依次双击Project树状目录中的testHadoop、testHDFS、src、main目录,右击出现的java目录,在出现的列表中依次单击New、Java Class按钮,在出现的创建新类对话框中的Name栏输入com.qf.OperateHDFS,单击OK,出现程序编写界面,如图3.18所示。

  图3.18 程序编写界面

  (2)Java 程序操作HDFS的案例,如例3-1所示。

  package com.qf;

  import org.apache.hadoop.conf.Configuration;

  import org.apache.hadoop.fs.FSDataInputStream;

  import org.apache.hadoop.fs.FSDataOutputStream;

  import org.apache.hadoop.fs.FileSystem;

  import org.apache.hadoop.fs.Path;

  import org.junit.Test;

  import java.io.IOException;

  public class OperateHDFS {

  @Test //单元测试

  /**

  * 1.将数据写入HDFS文件

  */

  public void writeToHDFS() throws IOException {

  //1.新建配置文件对象

  Configuration conf = new Configuration();

  //给配置文件设置HDFS文件的默认入口

  conf.set("fs.defaultFS", "hdfs://192.168.11.11:9000");

  //3.通过传入的配置参数得到FileSystem

  FileSystem fs = FileSystem.get(conf);

  //4.获取HDFS上/1.txt的绝对路径,注意:一定要确保HDFS上/1.txt是存在的,否则程序会报错

  Path p = new Path("/1.txt");

  //5.FileSystem通过create()方法获得输出流(FSDataOutputStream)

  FSDataOutputStream fos = fs.create(p, true, 1024);

  //6.通过输出流将内容写入1.txt文件

  fos.write("helloworld".getBytes());

  //7.关闭输出流

  fos.close();

  }

  /**

  * 程序运行结束后,在虚拟机qf01的终端中输入以下命令

  * hdfs dfs -cat /1.txt

  * 输出helloworld即正确

  */

  @Test

  /**

  * 2.读取HDFS文件

  */

  public void readHDFSFile() throws IOException {

  Configuration conf = new Configuration();

  conf.set("fs.defaultFS", "hdfs://192.168.11.11:9000");

  FileSystem fs = FileSystem.get(conf);

  Path p = new Path("/1.txt");

  //通过FileSystem的open()方法获得数据输入流

  FSDataInputStream fis = fs.open(p);

  //分配1024个字节的内存给buf(即分配1024个字节的缓冲区)

  byte[] buf = new byte[1024];

  int len = 0;

  //循环读取文件内容到缓冲区中,读到文件末尾结束(结束标识为-1)

  while ((len = fis.read(buf)) != -1) {

  //输出读取的文件内容到控制台

  System.out.print(new String(buf, 0, len));

  }

  }

  /**

  * 控制台显示如下内容即正确

  * C:\mysoft\Java\jdk1.8.0_121\bin\java...

  * log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).

  * log4j:WARN Please initialize the log4j system properly.

  * log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

  * helloworld

  * Process finished with exit code 0

  */

  @Test

  /**

  * 3.从Windows上传文件到HDFS

  */

  public void putFile() throws IOException {

  Configuration conf = new Configuration();

  conf.set("fs.defaultFS", "hdfs://192.168.11.11:9000");

  FileSystem fs = FileSystem.get(conf);

  //文件上传到HDFS上的位置

  Path p = new Path("/");

  //待上传文件1.sh在Windows系统中的绝对路径,此处需要提前在Windows系统中D盘下新建1.sh文件,并写入Hello Xiaoqian

  Path p2 = new Path("file:///D:/1.sh");

  //从本地(Windows系统)上传文件到HDFS

  fs.copyFromLocalFile(p2, p);

  fs.close();

  }

  /**

  * 程序运行结束后,在虚拟机qf01的终端中输入以下命令

  * hdfs dfs -cat /1.sh

  * 看到输出Hello Xiaoqian即正确

  */

  }

  (3)测试代码。

  ①在虚拟机qf01中,单独开启HDFS进程。

  [root@qf01 ~]# start-dfs.sh

  ②进行单元测试。

  单元测试是指对一个模块、一个函数或者一个类进行正确性检验的测试工作。

  在Java 程序操作HDFS的代码中,共有3个单元:将数据写入HDFS文件,读取HDFS文件,从本地上传文件到HDFS。以“将数据写入HDFS文件”单元为例,单元测试的步骤如下。

  在InterlliJ IDEA中,单击程序OperateHDFS.java中的第20行的Run Test按钮。在出现的列表中,单击Run 'writeToHDFS()'选项运行程序,如图3.19所示。

  图3.19 运行程序

  ③测试结果,见例3-1的注释。

  至此,使用Java 程序操作HDFS完成。

  3.4 Yarn

  3.4.1 Yarn简介

  Yarn 是基于MapReduce的作业调度与集群资源管理的框架。Yarn全称为Yet Another Resource Negotiator(另一种资源协调者)。Yarn主要由ResourceManager、NodeManager、ApplicationMaster和Container 4个组件构成。

  对于开发者来说,Yarn允许开发者根据需求在集群中运行不同版本的MapReduce,这将提供更为便捷的服务。

  3.4.2 Yarn架构

  Yarn总体上是Master/Slave结构,在整个资源管理框架中,ResourceManager为Master,NodeManager为Slave。ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster。ApplicationMaster负责向ResourceManager申请资源。由于不同的ApplicationMaster被分布到不同的节点上,因此它们之间不会相互影响。Yarn架构如图3.20所示。

  图3.20 Yarn架构图

  1.Yarn主要组件的作用

  Yarn架构中4个主要组件的作用如下。

  (1)ResourceManager。

  ResourceManager负责接收Client任务请求,接收和监控NodeManager(NM)的资源分配与调度,启动和监控ApplicationMaster。

  (2)NodeManager。

  NodeManager负责节点上的资源管理,启动Container运行Task,上报资源、Container运行情况给ResourceManager,上报任务处理情况给ApplicationMaster。

  (3)ApplicationMaster。

  ApplicationMaster负责单个Application(Job)的Task管理和调度,向ResourceManager申请资源,向NodeManager发出启动Container的指令,接收NodeManager的Task处理状态信息。

  (4)Container。

  Container是Yarn中的资源抽象,主要负责对任务运行环境的抽象,描述一系列信息:任务运行资源(节点、内存、CPU)、任务启动命令和任务运行环境。Yarn会为每个任务分配一个Container,且每个任务只能使用分配的Container中描述的资源。

  2.Yarn的工作流程

  (1)客户端向ResourceManager中提交程序。

  (2)ResourceManager向NodeManager中分配一个Container,并在该Container中启动ApplicationMaster。

  (3)ApplicationMaster向ResourceManager注册,这样用户可以直接通过ResourceManager査看应用程序的运行状态,然后ApplicationMaster将为各个任务申请资源,并监控任务的运行状态,直到运行结束。

  (4)ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源,异步完成资源的协调。

  (5)ApplicationMaster申请到资源后,与对应的NodeManager通信,要求它启动任务。

  (6)NodeManager为任务设置好运行环境(环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。

  (7)各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。

  (8)应用程序运行完成后,注销并关闭ApplicationMaster。

  3.4.3 Yarn的优势

  Yarn的优势,主要体现在以下几个方面。

  1.更快的MapReduce计算

  Yarn利用异步模型对MapReduce框架的关键逻辑结构进行了重写,相比于MapReduce1.0,计算速度更快。

  2.支持多种框架

  用户可以将各种各样的计算框架移植到Yarn上。

  3.框架升级容易

  在Yarn中,各种计算框架被封装成一个用户程序库(lib)存放在Client,当需要对计算框架进行升级时,只需要升级用户程序库即可。

  3.5 RPC

  3.5.1 RPC简介

  1. RPC概念

  由于Hadoop中的进程间通信是通过RPC实现的,因此需要了解RPC。

  RPC(Remote Procedure Cal)是一种通过网络从远程计算机程序上请求服务的协议。在使用RPC时,使用者不需要了解底层网络技术。RPC采用客户机/服务器模式。RPC客户机是指用于发出请求的程序,RPC服务器是指提供服务的程序。

  RPC具有封装网络交互、支持容器、可配置、可扩展等特点。RPC使得开发含有网络分布式程序的应用程序更加容易。

  2.远程过程调用的执行步骤

  (1)在客户机端,调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。

  (2)在服务器端,服务进程保持睡眠状态,直到调用信息到达。

  (3)当调用信息到达时,服务器获得进程参数,计算得出结果,发送答复信息,等待下一个调用信息。

  (4)客户机调用进程接收答复信息,获得进程结果,然后循环执行下去。

  3.5.2 Hadoop的RPC架构

  Hadoop进程间通信的RPC架构包括RPC Server、RPC Client、RPC Interface三个节点,如图3.21所示。RPC Server负责服务端的实现,RPC Client负责客户端的实现,RPC Interface负责对外接口类的实现。

  图3.21 Hadoop的RPC架构

  使用Hadoop RPC有以下几个步骤。

  (1)定义RPC服务接口。

  RPC定义了服务器端对外提供的服务接口。

  (2)实现RPC服务接口。

  Hadoop的RPC通常是一个Java接口,用户需要实现该接口。

  (3)构造和启动RPC Server。

  使用Builder类构造RPC Server,并调用start()方法启动RPC Server。

  (4)RPC Client发送请求给RPC Client。

  RPC Client调用线程发起RPC连接请求,等待RPC Client相应后,向其传输数据。

  3.6 本章小结

  本章对Hadoop中的相关基础知识进行了讲解,主要涉及Hadoop的3种安装模式,HDFS的架构,用Shell命令和Java 程序操作HDFS,Yarn的架构。其中,Hadoop的全分布式搭建,对于接下来学习的Hadoop HA模式的搭建非常重要。

  3.7 习题

  1.填空题

  (1) 是NameNode的默认端口号, 是ResourceManager的默认端口号。

  (2)在主节点上启动所有Hadoop进程的命令是 。

  (3)HDFS集群节点包括 。

  (4)Yarn的主要组件包括 。

  (5)Hadoop中的进程间通信是通过 实现的。

  2.选择题

  (1)下列( )不是Hadoop的优点。

  A.高可靠性 B.高效性

  C.高扩展性 D.循环存储

  (2)Hadoop的核心组件不包括( )。

  A.HDFS B.MapReduce

  C.Yarn D.Common

  (3)下列( )不是Hadoop的安装模式。

  A.单机模式 B.全分布式

  C.伪分布式 D.客户端/服务端

  (4)Yarn架构中不包括( )。

  A.ResourceManager B. SecondaryNamenode

  C.NodeManager D. Container

  (5)( )不是Yarn的优势。

  A.更快的MapReduce计算 B.支持多种框架

  C.更高的容错性 D.框架升级容易

  3.思考题

  (1)Hadoop生态圈的组件有哪些?

  (2)Hadoop的缺点有哪些?

上一篇:HTML5工具初识之网页编辑器

下一篇:AI绘制毛线

QQ技术交流群

千锋IT培训视频教程群
724707829

加入群聊

视频推荐

MORE > >