HDFS产生的背景
我们都知道,随着时代的发展进步,我们从最开始的2G、3G走向成熟的4G,我们所接触的数据,也发生了很大的变化,从最开始的移动短信,仅仅只是文字,到发送彩信,彩信里可以添加图片。再到用QQ发送消息、发送照片、发语音、视频等等,我们从最开始的每个月5块钱30M的流量,也渐渐达到5块钱300M流量,5块钱5G、10G……这是我们都很熟悉的过程,其中过程里有几个信息点我们可以很明确地知道:
1、数据形式的多样性。从最开始的文字到图片、语音、视频等等,这也是一个从结构化数据,渐渐走向半结构化、非结构化数据的过程。
2、数据量的改变。5块钱30M已经远远无法满足时代的发展,原因之一就在于,我们每个人所需要产生的数据量非常大,比如说我们玩手机、QQ、刷微博,都在产生着大量的数据。
背景下所面临的挑战
数据形式的多样性与数据的数量大幅度提升,给我们的企业、社会等等都迎来了很大的挑战,那就是我们要怎么存储这些图片、语音、视频等等信息?这么大的数据量应该怎么存?这涉及到两个点,第一是怎么存多样性的数据形式,第二,怎么存大量的数据。
二、Hadoop概念及原理
HDFS应运而生
我们继续看,如果存储的数据量非常大的时候,比如说有一个5PB的数据,用一台机器是无法存储得下的,那么就要使用多台机器进行存储,那么多台机器的,自然而然,我们会想到切分我们的数据,比如说切成块。假设我们将数据块的大小定义成256M,那么5PB的数据集可以划分成20971520左右的数据块,可以将其均匀存储在1000台机器节点上(每个节点假设空间为10TB),这样子切块的方式,就可以很好的解决了存储问题。
但是,思考一个问题,因为我们的机器非常多,不再是一台两台,我们存储数据的时候,如果重要的文件不多,只需要一两台机器节点可能就存储得下,想要做到数据不丢失,那么就要求你的机器不宕机,一两台机器,我们可以用稳定性更好、安全性更高的机器节点来存储,让它们尽可能少宕机,但是如果我们的机器上千上万台,那么其中一台发生宕机的几率是非常大的。这也是我们所常听到的,在大数据环境下,任何机器都是不可靠的,都是可能随时会宕机的。所以,如果我们要存储很大的重要数据,一两台、一二十台都存储不下的时候,我们就要想办法了,毕竟稳定性更好、安全性更高的机器节点,价格要比普通的存储器要高得多了。在数据丢失与价格面前,我们就要取一个平衡了。那么,有没有一种比较好的方式,做到数据不丢失,而且价格还非常便宜呢?答案是有的。
为了达到数据不丢失、而且成本低的目的,我们可以选择多副本的方式对数据进行存储,即存多几份。
比如说,我们有个文件,切成了N块,每个服务器上都存储着不同的块,如果一台机器宕掉后,我们的数据还可以在其他节点上取回来,比如说此图的第三台机器宕了,我们可以从第四台上拿到bolck4、第五台机器上拿到block3,这样就可以做到高可靠性。
HDFS的存储特点
上面,就已经总结出了HDFS的两个重要的存储特点:
1、数据分块地存储在多台机器上
2、每一数据块是以多副本的形式存放到多台机器的
因为HDFS采取分块的形式,不再是以传统数据库表的形式存储,所以除了适合存储结构化数据,也适合存储半结构数据、非结构化数据。
所以,我们就可以解决前面所提到的两个问题了:
1、我们要怎么存储这些图片、语音、视频等等信息?
2、这么大的数据量应该怎么存?
HDFS的架构特点
OK,我们继续思考一个问题,这么多台机器又这么多个数据块,我们要怎么进行管理呢?
其实,我们可能想象一下我们非常熟悉的学生宿舍,宿管阿姨那里会有每位学生的住宿信息,每位学生住一个宿舍(略奢侈哈…),我们要搬进来住,要先去宿管那确认一下,有没有位置,有什么事情,找宿管就可以,我们的宿管,一般也是住在宿舍楼下。而我们的宿管阿姨就相当于管理着我们的头头。我们的有上百、上千台机器组成的环境,叫集群,也跟我们的班级类似,只不过,咱这里把宿管也加上了。
现在咱们来存个东西吧,比如说咱们现在有一些很关键的书籍,我们需要存到宿舍里面。想象一下我们前面所说的,多部分、分块存储。比如说,我需要拿一整套的大数据学习书籍,有《Hadoop开发指南》、《Spark开发指南》、《数据采集入门》、《大白话入门大数据之邵奈一主编》等等数据,一套书籍里面分很多本书、很多册,也就是我们所说的,数据分块。我们为了避免书籍的丢失(比如说宿舍水管爆了,把宿舍里面的书籍全部弄湿了),会把这一整套书,放在多几个宿舍里面,即多副本存储。需要注意的是,这里的块是有固定大小的,HDFS默认是将128MB作为一个块,大小可以设置。
在这期间,会出现几个概念,这里总结一下:
1、宿管:相当于我们的master
2、学生:相当于slave
3、宿舍:相当于服务器
4、一套书籍:相当于数据
5、一套书籍所对应的具体哪本书:相当于数据的块
6、宿舍楼:相当于集群
7、宿管阿姨手里的宿舍情况总览表(包括有几个宿舍、一套书分词了多少册、每一册书又放到了哪个宿舍等等):相当于集群的元数据
这里边还有个对应关系:
master对应namenode
slave对应datanode
HDFS的架构原理
那么有个可以思考的问题,如果我们现在要存储数据,也就是要存储书籍啦,或者其他东西,我们是宿管阿姨自己搬吗?肯定不是啦,我们会叫同学们自己下来搬。那么这个过程呢,就叫RPC,所谓RPC,英文叫Remote Procedure Call,即远程过程调用,根据字面意思可以猜出一二,首先来看一下本地过程调用是什么意思,比如说,你自己在宿舍里有个洗衣机,现在有衣服要洗,自己把衣服丢进洗衣机去洗,那就叫本地过程调用。那啥叫远端过程调用呢?比如说,你今天跟邵奈一老师去春游,你的衣服忘了放进洗衣机洗了,叫了隔壁宿舍的同学(不叫舍友是因为咱们现在是一人一个宿舍哈)过来把你的衣服丢进洗衣机里面,这就叫过远端过程调用。
咱们回到原主题,现在宿管阿姨要放书啦,我们自己负责属于自己宿舍的书籍,我们就相当于datanode进程,宿管阿姨是namenode进程,这些进程都是JVM进程,即Java程序。这个程序,可以负责各种事情,比如搬书等等。比如下次,咱不搬书了,而是,从书籍里找出某道题的答案等等,相当于我们往HDFS里面写数据、读数据。
三、配套教程详解
配套教程一之域名映射与免密码登录
教程:分布式集群环境之域名映射与免密码登录
咱们的配套教程,主要有两个步骤:
一、主机域名映射
如何理解域名映射呢?首先,我们都知道,在网路通信中,我们每一台机器,都会有自己的一个ip地址,相当于每一台机器的标识符,机器之间进行通信,也都是通过这个入口。那么集群里有很多台机器,相对应地也会有很多ip地址,特别难记得住,虽然我们可以尽可能去配置得更有规则。我们的机器上,需要装的软件有很多,比如说存储的、计算的、协调的等等,每个软件都会有自己的配置文件,因为是集群操作,需要通信。所以,每一台机器上都会有相应的很多配置文件,也会有很多的ip地址。
情景一:现在,我们可以想象一下这样一个情景,万一我们的集群ip由于各种原因而发生了变化,那你是不是要去重新配置我们所要配置过的所有配置文件?每一台都要改很多个地方,这明显不合理。所以就可以配置域名映射,如果我们的ip地址改变了,只需要将映射关系改好就行了。
情景二:再来想象一种情景,如果我们现在不是ip改变,而是将我们之前有的集群进行迁移,或者参考以前的已有资源,我们也可以简单地修改一下映射关系即可以用上场。
情景三:如果我们的集群很大的时候,往往会分工很明确,有些时候,你只需要拿到主机名就可以干活了,而不需要知道ip网络等等的配置,ip等交由更加专业的人事来处理。还有就是,如果人家ip没搞定给你,你是不是就先不开始干活呢?这也肯定不是啦,而是先约定好,或者,你先干,干到最后再匹配一下映射关系即可。
总结一下配置域名映射的好处:
1、方便集群管理,如集群里ip地址有变化等情况
2、方便集群迁移
3、分工明确,各司其职
二、免密码登录
回想我们前面的RPC例子,你的衣服,让其他宿舍同学帮你拿进去洗衣机洗,其实这是一个操控与信任的过程,你让你的同学拿衣服,那你就是在操控你的同学,在操控之前,你应该先获得同学的信任。此外,你的钥匙不给到你的同学,你的同学能进去你的宿舍吗?肯定也是不行的。所以,我们要解决几个问题:
1、操控你的同学,操控之前,你应该先认识彼此
2、应该得到你的同学的信任
进行免密码登录配置也是如此,思路:按照我们生活上的案例,想让同学进来你的宿舍帮你洗衣服,你应该先能够操控你的同学,操控之前,你应该先认识彼此,而且,应该把自己的钥匙给到你的同学。但是,在我们这次的免密码登录上,我们的操作有点不一样。过程是这样子的:master机器想要操控slaves机器,首先是slaves机器要认识master,才能让你操控我。所以,我们目前要做的是让slaves机器要认识master,而且要信任master。那么如何才能认识和信任master呢?过程大概是这样子的:首先,master机器应该先生成自己的钥匙,然后将自己的钥匙作为一个信任抵押凭证,将此凭证交给slaves机器,这个时候,你就可以操控slaves机器了。
具体配置过程大概有一下三部分:
1、每台机器生成自己的钥匙,包括公钥与私钥
2、以自己的公钥作为抵押凭证,将自己的抵押凭证交由其他机器,才可以得到其他机器的信任,然后操控他们
3、校验是否可以免密码登录
我们的教程里,是每台机器都生成自己的钥匙,然后互相能够免密码登录进对方。但实际上,只需要将master的凭证给到slaves机器,就可以的了。教程里让slaves机器也能够免密码登录进master,是因为后期会有HA高可靠学习,所以暂且先配置上。
配置好域名映射与免密码登录后,我们需要进行下一个教程。首先,我们应该先知道,我们的Hadoop是用Java语言写的,本质上是一个Java程序,而Java程序的执行,是要依赖Java运行环境的,所以,我们的服务器上,肯定是要先安装好Java的运行环境,所以请看下面的配套教程。
配套教程二之JDK8的安装与配置
教程:分布式集群环境之JDK8的安装与配置(Centos7)
咱们的配套教程,主要有两个步骤,第一是JDK的安装,第二是环境变量的配置。
一、JDK的安装
安装起来也比较简单,只需要去官网下载好相应的安装包,解压即可。然后同步解压后的安装包到slaves机器,因为是集群之间的操作,所以要使用scp命令。
二、环境变量的配置
在学习之前,我们先了解几个问题:
1、什么是环境变量?
2、为什么要配置环境变量?
3、不配置环境变量行不行?
4、怎么配置环境变量?
什么是环境变量?
百度百科是如此定义环境变量的:环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好地运行进程。
为什么要配置环境变量?
上面的定义有两个信息点,第一,环境变量是一个特定名字的对象。对象,则表示是一个具体的值。第二、我们可以去设置好的path下面找到完整路径,来更好地运行进程。
比如说:现在我的Windows系统里有一个文件:shaonaiyi.exe,具体路径是:C:DocumentsFilesEXEshaonaiyi.exe,我们打开shaonaiyi.exe文件,首先应该是进入到C:DocumentsFilesEXE路径下,再打开。那么我们每次执行都要进入到这个路径,如果此路径下还有teachershao.exe等等很多文件,就更加麻烦了。那么,此时,我们就可以给这个路径取个具体的名称,比如说EXE_HOME,那么我们每次需要使用C:DocumentsFilesEXE这个路径的时候,就可以直接使用EXE_HOME了,但是,每次都要打这个名称,还是有点麻烦,那么此时,我们就可以将此名称,配置到我们的系统变量里面。比如说现在我们执行shaonaiyi.exe文件,无论你在哪个路径执行命令,都会先去环境变量里面配的路径下,有没有shaonaiyi.exe这个文件,如果有,则直接执行,没有才会报错。那么此时,操作起来就非常方便了。
不配置环境变量行不行呢?
按道理来说,在我们实际的开发过程中,不配置环境变量其实也是可以的,只不过会比较麻烦。但是,在我们的集群环境中,还是要配一下环境变量的,因为,有很多大数据环境框架里面的配置文件很多是直接就引用了默认配置好的环境变量,如果你不配置,则会报错。所以,我们这里还是要进行一下配置。
举例说明:
比如说我们的教程里,有配置了这么一句话:
JAVA_HOME=/usr/local/lib/jdk1.8.0_161
实际上就是JAVA_HOME代替了长长的路径,引用则在前面加个$符号:$JAVA_HOME,如果很多框架里面的配置文件里面直接写上了$JAVA_HOME,则会去找此环境变量,如果你的环境变量没有配置,则会报错。
怎么配置环境变量?
此处以Centos系统为例子,Centos系统里面,配置环境变量的地方有三个:
~/.bash_profile(只对当前登陆的用户生效,永久生效)
/etc/profile(对所有系统的用户生效,永久生效)
~/.bashrc(此文件为每一个运行bash shell的用户都执行的文件,当bash shell被打开时,该文件被读取。)
当然,除了以上三种永久生效的方式,也有临时生效的方式,如直接运行命令:
export JAVA_HOME=/usr/local/lib/jdk1.8.0_161
export PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
到目前为止,我们已经做了很多的准备工作,比如域名映射、免密码登录、JDK的安装等的,现在我们可以真正进入Hadoop的世界了,下面我们来安装Hadoop的核心组件HDFS。
配套教程三之HDFS的安装与配置
教程:Hadoop核心组件之HDFS的安装与配置
安装HDFS主要有几个步骤:
一、解压安装包
这个很简单,略过。
二、配置HDFS的配置文件
1、hadoop-env.sh
因为Hadoop是Java语言写的,所以,要在此处加上Java的主目录
2、core-site.xml
顾名思义,core-site,即核心站点,xml是一种文件格式,我们要在此配置HDFS的通讯入口。
什么是通讯入口?
想象一下,我们的宿舍楼就相当于一个大数据的集群,宿舍楼里面有很多的宿舍,每个宿舍相当于一台服务器,每个宿舍都可以存放书籍,比如说,突然有一天,收到通知,要给你们的宿舍装空调,那技术工人,要将你的空调搬到你们的宿舍。从哪里搬进去呢?毫无疑问,肯定是从宿舍楼下的大门搬进去的。外面这里变配置的通讯入口,就相当于HDFS分布式文件系统的入口,我们教程里是配置成此url:hdfs://master:9999,没错,想进入宿舍,还是得通过宿管阿姨。至于9999端口,其实是可以改变的,只要没有跟已有的服务冲突即可,此端口就相当于一个区域,就好像大门的位置一样。可以灵活换位置,但是如果同一个位置不能放两个东西。
3、hdfs-site.xml
在此处,我们会配置HDFS相关的配置,比如说,我们的文件存放到哪里,这里是配置服务器的路径,比如说,我们的HDFS是安装部署在Linux系统上,那么,此路径则是Linux系统里面的路径。我们这里是配置了/home/hadoop-sny/bigdata/dfs/name、/home/hadoop-sny/bigdata/dfs/data,其实,此路径也可以统一在core-site.xml文件里面配置。在教程里我们还配置了数据块的备份数量,不能大于DataNode的数量,我们的集群只有三台服务器,一台master、两台slave,所以,这里的备份数量不应该大于2,虽然配置大于2也不会报错,但是实际上备份的数量还是不会操作。比如说,配置成了3,存储也只能存储两份。
4、slaves
目前,我们的所有操作都只是在master机器上操作。其实,这个角色是我们自己定的,你想要哪台机器什么角色就什么角色。按照我们的教程,我们这里是配置slave1、slave2作为从节点,即master为宿管阿姨,slave1、slave2为学生1、学生2。注意:此处要删除原本slaves文件里面的localhost。如果不删除,你会发现到最后安装如果没有错误的话,master其实也充当了从节点角色。
三、同步Hadoop文件夹到两个从节点
到目前为止,我们的HDFS的相关配置都已经配置好了,配置好后,需要同步到其他两台机器上去。所以,到最后为止,三台机器上的Hadoop文件夹都是一样的。
注意:如果后期发现某配置文件有误,一定要记得三台机器上的配置文件都要改。
四、格式化HDFS
就像我们平时安装系统一样,来个磁盘格式化,在此过程中,我们会给我们的集群分配好集群ID等等信息,可以在格式化前、格式化后,启动前、启动后,所配置的存储文件的路径下面有什么变化。
五、启动HDFS并查看进程
启动HDFS的过程就像宿管阿姨、学生们都各就各位,等待吩咐。启动完成之后,如果没有错误,在master上会启动了Namenode进程,slave上会启动Datanode进程。如果到最后,发现master机器上多了个Datanode进程,则是上面所说的slaves配置文件,没有把localhost删掉。
六、WebUI界面查看
会发现,我们是打开master机器上的50070端口来进行查看。这个50070端口,是Hadoop里面默认写好了的,此端口,就像是一个可以总览我们宿舍里面有内容的地方。跟上面的9999端口大门类似,也是一个地方。我们可以在此查看到很多信息,包括我们的master、slaves角色,活的机器、死的机器有哪些,启动的时候会加载上面文件等等。还可以在Utilities里面查看到我们的HDFS里有什么内容。
四、常见错误总结
此章节总结初学者常见的错误,仅记录描述,具体错误信息请自行查看报错日志。
一、重复执行格式化:安装与配置HDFS的时候,如果自己有必要重新格式化,即执行hdfs namenode -format,如果执行了两次及以上,一定要先将自己配置的Linux存储路径下面的内容先删除掉,本教程是配置在/home/hadoop-sny/bigdata/dfs/name、/home/hadoop-sny/bigdata/dfs/data,原因是,重新格式化的时候,会重复生成ClusterID,即集群ID,如果不删除原本的,则会报错,当然,你可以想办法,讲集群ID修改成一致。
二、没有同步三台机器的配置文件:进行配置时,发现其中有配置文件配置错误,只修改了master机器上的,没有修改slaves机器上的也会报错,务必都要修改过来。
三、Linux的不熟悉:简单的Linux是必学知识,初学者很容易在配置文件时配置错误,请务必记得,在粘贴配置文件的时候,应该先进入编辑状态才可以粘贴,否则会粘贴不全。配置完成后,请检查一下是否配置正确再进行之后的操作。
四、没有认真读教程:因为三台机器上都要装HDFS,所以,三台机器的域名映射、免密码登录、JDK都要完成。只是在安装HDFS的时候,只是在master配置,然后同步。
————————————————
版权声明:本文为CSDN博主「邵奈一」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shaock2018/article/details/96718234