Hadoop学习篇(一)
本文档适用于Hadoop开发学习者使用
说明:如涉及到侵权,请及时联系我,并在第一时间删除文章。
Hadoop简介:Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算
0. Operating System
Hadoop是Linux平塌下的分布式系统基础架构,本文档会给出Linux、macOS下的环境配置。其中Linux主要会给出CentOS、Ubuntu操作系统下的环境配置。由于Windows需要下载很多插件,且不易操作,所以不建议使用学习
(PS:家境贫寒且想好好学习的,尽量还是使用Free的Linux吧😊)
接下来,言归正传,开始我们本节的介绍。
0.1 Linux
Linux这里主要使用的两个版本是CentOS 7.8和Ubuntu TSL 18.04
如果官网下载比较慢,这里给出163的国内的镜像源地址:
CentOS:http://mirrors.163.com/centos/7/isos/x86_64/
Ubuntu:http://mirrors.163.com/ubuntu-releases/18.04/
(PS:这个上网百度一下应该很快,如果你会科学上网,这里可忽视。)
系统安装就不再介绍,默认看本篇文档的人都会了😁
下面开始介绍系统配置:
0.1.1 CentOS
CentOS是红帽下的一个Linux发布版本,是作为初学者,最简单接受的一款Linux OS。如果你是初学者,亦或是对Linux的命令行操作不是很熟悉的,可以选择这个版本的Linux进行学习。
这里我们主要是用CentOS的yum源进行插件下载。需要下载以下几个插件:
-
openssh
yum install -y openssh
-
openjdk-8-jdk
yum install -y openjdk-8-jdk
这里我们就需要配置一下yum源。(这里是因为CentOS默认yum源是国外服务器,下载起来会很慢,所以这里我们可以修改为国内镜像源)
这里修改为阿里云的镜像源:https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b11uIjtor
-
备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
-
下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/
CentOS 7:
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
或
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
-
运行 yum makecache 生成缓存
yum makecache
0.1.2 Ubuntu
相比于CentOS,Ubuntu就很容易了。因为Ubuntu有sudo命令,和apt-get下载。这里我们参照CentOS,需要下载以下几个插件:
(这里使用Ubuntu18.04版)
-
openssh-server
sudo apt-get install openssh-server
-
openssh-client
sudo apt-get install openssh-client
-
openjdk-8-jdk
sudo apt-get install openjdk-8-jdk
0.2 macOS
macOS这里土豪可以来看看,家境贫寒学生党还是绕路而行。。。
插件还是那几个:
- openssh:macOS自带
- jdk:Oracle、Openjdk都可以下载
本文档后续实验适用于Ubuntu TSL 18.04操作系统
1. Hadoop Environment Setting
Hadoop环境配置主要是SSH远程登陆、Hadoop单机环境配置、HDFS伪分布式配置、HDFS分布式配置。
本节会围绕以上四个主题展开,同时穿插个人对Hadoop原理的理解
1.1 SSH远程登陆
SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。
Hadoop相关实验中,我们需要通过ssh远程登录结点机器,所以需要进行免密登陆和结点登陆设置。
1.1.1 SSH免密登陆设置
进入~/.ssh目录。若没有该目录,则执行一次ssh localhost进入。
输入命令:
ssh-keygen -t rsa
所有提示都按回车键。(因为进行的是无密码登录配置)
最后,将配置信息加入授权。即/.ssh/id_rsa.pub文件内容复制到/.ssh/authorized_pub文件中去。
1.1.2 SSH结点登陆设置
-
第一步:使用scp命令,将宿主机上的登陆配置信息上传到结点机器上去。命令为:
# username : 用户名 # node_IP : 结点IP地址 # node_path : 结点存储路径 scp ~/.ssh/id_rsa.pub username@node_IP:node_path
-
第二步:创建~/.ssh文件夹(若以存在可忽略)。
进入~/.ssh文件中,将id_rsa.pub文件内容复制到authorized_keys文件。之后,就可以删除id_rsa.pub文件了。
每台结点机器上都执行该步骤。
1.2 Hadoop单机安装
首先先来介绍一下Hadoop是个什么东西。
Hadoop时Apache基金会下的一个开源大数据计算平台。学习这个计算平台,可以让我们快速入门大数据处理,并学习到相关大数据处理的理论知识和实践经验。
1.2.1 Hadoop基本概念
Hadoop:Hadoop是Apache下的一个开源的大数据计算平台。是一种基于Java语言开发,能够为用户提供系统底层细节透明的分布式基础架构。
构成:Hadoop计算平台主要是由两大组件——文件系统和计算模式。
文件系统:分布式文件系统HDFS。
计算模式:MapReduce计算模型。
特性:可靠性高、高效、易扩展、容错率大、成本低、支持语言多。下面做一下解释:
- 可靠性高、容错率大:因为Hadoop的文件系统HDFS在存储文件时,时需要保留副本的,即使一份文件丢失,我们也可以通过查找副本进行恢复。这里类似于我们现实生活中签订的重要合同,甲方有一份,乙方有一。即使双方中有一方合同丢失,也可以去找另一方进行复印保存。
- 高效:因为Hadoop采用的是并行分布式处理方式,能够快速地处理海量数据集。
- 易扩展:因为Hadoop的文件存储系统采用的是HDFS存储,借助计算机集群实现。这里的计算集群好扩展,不需要扩展某一个机器的存储容量,只需要以计算机为单位,添加计算机就行。这样,我们就可以把数据分别存放在计算机集群中的机器上。这里就好比我们收拾东西,买了三个箱子,但是发现东西很多,三个箱子不够用,那么我们只需要再准备一个箱子放东西就行。同时,Hadoop生态系统中,采取的列式数据库HBase存储的数据,我们知道,行数据库在存有大量数据时不宜扩展,因为考虑到其扩展列时数据的增删。但是列数据库可以避免这些困难,具体将在HBase数据库中学习到。
- 成本低:Hadoop是开源项目,而且,只需要搭建计算机集群就可以使用,所以即使是普通用户使用自己的PC机器,也可以通过开虚拟机的方式进行分布式集群搭建。如果是简单的实验测试,也可以配置成伪分布式。
- 支持语言多:因为Hadoop是基于Java语言开发的开源项目,并且有很多接口供我们选择,所以使用起来很方便。
- Hadoop生态系统:由HDFS、MapReduce、HBase、Yarn等分布式数据处理组件组成的一套生态圈,被称为Hadoop生态系统。
示意图如下:
思维导图如下:
1.2.2 Hadoop单机安装
进入下载目录,执行安装命令:
# path : Hadoop安装路径
sudo tar -zxf ./hadoop-2.7.7.tar.gz -C path
安装完成后,进入安装目录,修改目录所属以及权限。命令如下:
# username : 用户名
# path : Hadoop安装路径
sudo chown -R username path/hadoop
然后,进行Hadoop环境配置。在环境配置文件中添加内容如下:
export HADOOP_HOME=/usr/local/Cellar/hadoop # Hadoop安装路径
export PATH=${PATH}:$HADOOP_HOME/bin:$PATH
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
配置文件生效。
检查是否安装成功。命令为:
hadoop version
可以看到结果如图所示,则证明hadoop单机安装成功。
1.2.3 Hadoop伪分布式配置
这里就要开始介绍一下HDFS是什么了。
1.2.3.1 HDFS理论基础
HDFS指的是Hadoop分布式文件处理系统(Hadoop Distributed File System)。要想总结HDFS理论基础,就要先进行计算机集群的总结。HDFS理论基础将从计算机集群、HDFS基本概念进行总结。
1.2.3.1.1 计算机集群
- 计算机集群:计算机集群在学习过程中,我喜欢将计算机集群和分布式文件系统结合起来。因为计算机集群就是机房中交换机与刀片机的集合体。形象一点,这里计算机集群就好比快递仓库。每个刀片机就好比货架,每个交换机就好比仓库的管理部门。
- 分布式文件系统:这里分布式文件系统,可以是说是客户端+计算机集群结构的组合体。它主要实现逻辑是,由客户端向计算机集群的主机发送请求,集群中主机对接受到的命令作出反应,并映射到对应分机上进行处理。比如:公司内部人员想要访问机房中的某些数据,需要发送请求到机房主机(交换机),然后由主机相应到的存放指定数据的刀片机,读取文件后并返回数据。再具像化一点,就好比我们的快递仓库。这里交换机就好比仓库的总管,在有人来仓库找包裹时,管理员会通过快递件存放的位置,去货架上寻找。找到后,将其交给收件人。
(这里需要注意一点:分布式文件系统结构和计算机集群结构的不同。)
分布式文件系统的结构是【客户端+主节点+数据结点】,即【客户端+计算机集群】。但是主节点和数据结点分别有什么用处呢?为什么要这样做呢?
这里简单总结一下分布式文件系统架构的原理:客户端负责发送数据请求,主结点通过客户端发送的请求,对不同的、需要相应的数据结点进行相应。可以说,主结点只起到了一个桥梁作用,它既不用来存数据,也不用来进行数据的操作。换句话说,主结点就好比整个系统的一个“小BOSS”,数据结点能就好比一个个的部门。“小BOSS”每天只需要记得那个结点干的什么活就成。这边有客户来谈生意,或者来安排任务,“小BOSS”完全不用干,只需要告诉他们去哪个部门处理就行了。
1.2.3.1.2 HDFS基本概念
要想了解HDFS,就必须要了解HDFS的相关基本概念和名词。
-
块:在计算机集群架构中,文件并不是以字节为单位进行存储,而是被分成了不同大小的块,分别存储在不同的数据结点中。(这样做的优势在于每次读取文件的时候,没有必要一个字节一个字节对文件进行读取,在获取到文件分成块后所在数据结点的地址后,直接进行调用,从而大大提高了文件的读写速度;将文件切分开存储在不同的机器上,可以达到扩容的效果,可以存储大规模的文件。)在Hadoop2.x的时代,一般情况下,每个块的大小会默认设定为128MB。
-
主结点:NameNode,又被称为“名称结点”。在HDFS中可以看作是“总管”。它的主要作用就是管理HDFS的命名空间。在我们每一次需要进行文件读写操作时,都需要经过“总管”(NameNode)的许可,才能够去“仓库”(DataNode)去进行文件的读写操作。
-
-
在主结点中,主要由FsImage和EditLog组成。
-
- 这里FsImage保存的是所有文件在该空间下的位置,相当于该空间下的一个“地图”,通过这个地图,我们可以快速找到该文件被分成了几块,分别存储到了哪些“仓库”中,存储到了“仓库”中的哪个货架上。
- EditLog可以看作是“记录本”。“总管”每次上班时,会带一个新的“记录本”。每一次我们找“总管”的时候,都应该先制定好任务规划,并且记录到“记录本”。之后“总管”会经过判断,决定是给予我们权限做这项任务。允许之后,我们就可以根据“记录本”上的任务规划进行文件的更新操作,这样可以提高我们的工作效率。(这里引用一个EditLog文件,可以理解为,“总管”管理“仓库”时,因为手下人很多,如果来一个就在地图上标记一下,来一个就标记一下,工作效率会很慢。而且,有的时候,他只是来询问,并不是要真正要做。不如直接设立一个“记录本”,你来一个提需求的,我就在“记录本”上记录一条,不需要“总管”修改地图。第二天“总管”上班时,秘书会提前修改好地图信息,并放在“总管”桌子上。)
-
所以,每一次NameNode启动时,“地图”信息(FsImage)都会加载到内存中,然后执行“记录本”(EditLog)中的各项操作,使得内存中的数据保持最新。之后,NameNode会创建一个新的FsImage和一个空的EditLog文件,每一次进行HDFS中的更新操作是,都会直接将操作记在“记录本”上,从而增加工作效率。“总管”每天的工作就是,检查“地图”,管理仓库。有人来提需求,我就干活,没人来,我就看好仓库,防止货架倒塌意外的发生(数据结点宕机)。
-
NameNode的工作流程可以总结为:启动NameNode—>加载FsImage内容—>执行EditLog中的操作—>创建新的FsImage和EditLog文件—>更新信息时,直接在EditLog中进行更新。(通俗点讲:“总管”上班了—>拿到“仓库地图”—>有人来提任务?允许你做,记在“记录本”上—>下班了。第二天上班前,秘书负责按照“记录本”上的内容对“查看地图进行更新—>“总管”上班了。依次循环更新。)
-
-
数据结点:DataNode。数据结点在HDFS中可以看作是“仓库”。它的主要作用就是存放那些被分成快的文件内容。需要的时候,我们需通过“总管”同意后挪用,进行文件的读写操作。
-
- 在计算机集群中,DataNode一般会有多个冗余项存在。其优点在于,我们每次去找这些数据时,可以不用花费在一台机器上,可以在多台机器上进行查找,在哪个地方先找到,就调用哪个DataNode的数据。假设我们有两个“仓库”存放这个文件的原件和复印件的相同数据块,只不过原件在仓库1的最后一个货架上,复印件在仓库2的第一个货架上。我现在需要找第三个数据块的内容,我就让工人从两个“仓库”中同时查找,我先找到了复印件,就直接去读复印件的内容即可,这样也大大提高了数据的传输速度。这里可以总结为“优先原则”。我不管是原件还是复印件,谁能先找到,我就要哪一个。(这也就是数据结点的存取原理,可以加快数据的传输速度、检查数据是否出错、确保数据的真实可靠。)
- 同时,为了防止读取到的内容在传送过程中出现错误,可以返回到其它DataNode中进行检查,简化了单个DataNode检查的程度。意思是,我这边找到了复印件1,其他货架上的工人的活不能停,直到他们找到了他们货架的文件,拿过来和我的比对,正确的话,我的就被拿走使用。不对,那我就被淘汰了,“优先原则”看那三个的,然后比对。这里可以总结为“正确原则”。拿的快,好!但要注意正确性。
- 日常生活中,对于重要的数据或者文件,我们都会对其进行备份。多个DataNode就可以通过备份文件内容,保证数据的可靠性。如果一个“仓库”损坏导致数据丢失,我们的备份文件就可以避免这种危险。
-
第二名称结点:SecondaryNameNode。我们可以把它看作“副总管”。现实生活中,往往“副总管”权力小、干活多。这里SecondaryNameNode基本上是这样的。和“总管”不同,他不像“总管”那样清闲。他需要时刻关注“总管”动向、身体情况。在“总管”不能来的情况下,“副总管”需要迅速顶替“总管”的位置,确保仓库内工作的有序进行。而且,他还要合并更新“记录本”和“地图”。因为每天上班都会有一个新的“记录本”和“地图”,有的时候,“记录本”根本用不完。为了节省空间,就需要将上边的内容进行合并,这样方便今后工作。即SecondaryNameNode有两个用处:一是NameNode宕机时,SecondaryNameNode会快速顶替NameNode位置,确保集群工作有序进行;二是合并整理EditLog和FsImage,减小其占用空间的大小。
- 由于Secondary NameNode的特殊性,其始终还是NameNode的一个备份,不能够完全替代NameNode,所以真的在发生NameNode宕机时,现实中还是会造成一定的数据丢失。
-
- 这里插一句:在Hadoop2.x时代以前,我们也知道设立备份结点,但其用途主要是在主结点宕机后,关闭整个集群进行恢复。这种“事后弥补”的措施我们称为“冷备份”。而现在的SecondaryNameNode,可以迅速顶替“总管”位置,达到“遇到问题有人顶”的效果。这种我们称为“热结点”。
有关HDFS,这里还需要注意:HDFS集群中有且只有一个名称结点和第二名称结点,若干个数据结点,每个数据结点会被分为若干个块,该系统下的文件会被分为不同的块,存储在不同的数据结点上。
HDFS示意图如图所示:
1.2.3.2 Hadoop伪分布式配置
这里需要先配置三个文件的内容:
-
hadoop安装路径/etc/hadoop/core-site.xml
文件内容为:
<configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>
-
hadoop安装路径/etc/hadoop/hdfs-site.xml
文件内容为:
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>
-
hadoop安装路径/etc/hadoop/hadoop-env.sh
文件内容为:
export JAVA_HOME=${JAVA_HOME}
配置完成后,执行 NameNode 的格式化。执行命令为:
path/bin/hdfs namenode -format
初始化成功的标志是参数为0。否则就存在错误,需重新进行上述步骤进行配置。