00:00
项目经验值HDFS的多目录存储。那说到这儿啊,什么叫做多目录呢?诶,目录我们都知道,它就是一个文件夹,那多目录就是多个文件夹,那存储多目录难道就是把数据放入到多个文件夹就完事了吗?好,来看一下。那我们呢,假设啊,我这现在有一台机器是哈都不102,它的内存大小是八个T,那八个T我们好像没有八个T的磁盘,那我们的磁盘呢,一般都是两个T左右的,那我这一台机器我想让它是八个T,所以说我就要在我的这个机器上啊,我给它安装四块2T的磁盘,那我现在就是八个T了啊,我的这个服务器虽然没有一个8T的磁盘,但是我有四个插槽啊,我有四个磁盘的插槽,我在这四个磁盘的插槽上,我分别都插上了一个2T的磁盘。
01:01
好了,那接下来我就要往我们的磁盘当中写数据了,那现在我想写数据的时候,在写数据之前,我就要先创建一个文件夹,那比方说我就放到这个磁盘当中了。来。一致最前啊,我就放到这块磁盘当中了,那大家想一个问题啊,我往这个文件夹当中写出去。那我现在再来数据,我还是往这个文件夹当中写,那我所有的数据我都写入到这个文件夹了,好了,那比如说你这个文件夹一个不够啊,那怎么办?我再来一个文件夹呗,那我再创建一个文件夹,诶,我还是放到这个磁盘当中了,那我再写数据的时候,我往这个文件夹写,同时我又往这个文件夹当中写,哎。都往这两个文件夹当中写,那大家想一想。对于我们的这个磁盘来说呀,对于102的这个8T的磁盘来说,我们呢,都写到其中的这么一块2T的磁盘上了,那其他这2T的磁盘根本就没有用上。
02:08
他们两个根本就没有数据,根本就没有用上其他这三块磁盘的IO,也没有用上三块其他磁盘的存储,让大家想一想,我都写入到这一块磁盘上了,我们的性能它能好吗?本身磁盘的IO啊,它就有一定的瓶颈,然后它的存储也是有一定的瓶颈的啊,他也是有一定的这个限度的,那我其他的三块磁盘都很闲,就他一个人很忙,我们整个这台机器它的性能一定不会好吧,那什么叫多目录呢?多目录的意思啊,并不是说我在一块磁盘上我创建多个文件夹就完事了,而是我要在不同的磁盘上分别创建一个,哎,创建不同的文件夹,然后来存储我们的数据,你比方说我现在呢,就要往HDFS当中写数据了,那我往HDFS当中写数据,我就只往一个磁盘上写吗?哎,不是的,那我要把这个磁盘的压力给它均分开,每一个磁盘我都给它写一部分数据啊,每一步,每一个磁盘我都给它写一部分数据。
03:20
那这样的话就能导致我们磁盘之间的这个IO的瓶颈,还有存储的瓶颈,把压力给它均分开,OK,那这个就叫做磁盘之间的多目录。这个多目录应该怎么配置啊?在HDFS-set这个配置文件当中啊,有这么一个参数。这个参数的名字叫做DFS data node data.d啊,配置我们data not的,那data not是我们存储数据的这么一个。地方,那我们看一看,你看我在这配置一个file冒号杠杠,然后我指定了一个路径,再来一个file冒号杠杠,我指定了一个路径啊,我这指定了三个四个路径,你看DATA1 data2d3 data4,那每一个路径呢,它就代表一个文件夹,那对应着我们的这个图,你看。
04:11
我这个是DATA1,这个是DATA2,这个是DATA3,这个是DATA4,那大家想一想,你说我指定的这四个路径,我是都在不同磁盘上的呢,还是我这四个文件夹都是在一个磁盘上的文件夹?肯定是在不同磁盘上的文件夹吧,如果说我还指定都在同一个磁盘上的文件夹,那这个多目录是不是就没有意义了呀,它还是在一个磁盘上。所以说多目录的存储,我们这指定的呀,虽然是四个路径四个文件夹,但是这四个文件夹要分别是在不同磁盘上的文件夹,OK,那大家再想一个问题,你说这个配置我们呢,我首先我要先在哈杜和102我给它配置上,那我在哈多102我给他改完了啊,我现在有三台机器吗?102。
05:04
103。这是零四,我在零二上啊,把这个配置修改完了,那修改完之后我要不要给他分发到零三和零四呢?想一想需不需要给他分发到103和104。啊,他们两个不配置多路肯定不会好,为什么不喷发?啊,想一想啊,原因是什么?原因是这么个情况,看这我的102现在是不是有四块磁盘呢?所以说我在这配置的时候,我配置了四个磁盘上的目录,那好了,那你说我的103我就一定有四块磁盘吗?我的103有没有可能它就只有三块磁盘呀,那只有三块磁盘,然后你给他配置四个目录,那你配置这四个目录,我这个目录它根本就没有,我想写的时候,我找不到你这个目录,那它就会报错。所以说多目录的这个配置啊,我三台机器,我不管你是三台还是30台,所有的机器都需要配置。
06:08
但是每一台机器它配置的情况都不一样,所以说那这个配置啊,我们不能分发,你看这就说了啊,每台服务器它挂载磁盘的这个情况它是不一样的,所以说那每一台服务器我们配置的这个多目录的路径它应该也是不一样的,那每台机器我们怎么办?单独配置OK,那这个叫做磁盘之间的多目录项目兼值集群数据均衡,那就拿我们的这个哈多来说,我们的哈多维啊,在集群之间的数据均衡有两种模式,一个叫做节点间的数据均衡,那第二个叫做磁盘间的数据均衡,好,那我们先来看这个磁盘间的数据均衡啊,什么叫磁盘间的数据均衡呢?还来到这个图,那在这个图当中,我们现在有1234,我们现在在这一台服务器当中啊,一共有四块磁盘,那每一块磁盘你假设我这台服务器,我这个磁盘它的使用率已经占用了20%了。
07:12
我这块磁盘它的使用率已经占有90%了,它10%,它呢10%,那现在就出现这么一个情况啊,其中一个磁盘它的使用率非常高,那其他磁盘它们的使用率非常的低。那这样也会有可能造成我们的这个集群之间的瓶颈啊。你看那我写数据的时候,由于我们是随机写嘛,哎,那我就写入到这块磁盘上了,他的这块磁盘压力非常大,那我在读写的时候效率可能就会非常慢,那就会导致我们整台服务器它的这个性能非常差,那不行,那这个时候我就要想办法,我们的卡杜吧,有没有一种方式能帮我们均衡一下节点之间的啊,磁盘之间的数据量呢?我那我想要的结果是啥呢?你看它们三个现在加一起一共是呃,120%,那最后啊,我想让他的结果是你在30。
08:10
你占30,你也占30%,你呢也占30%,那这个是我们想要的一个结果,OK,那磁盘之间的数据均衡,那他来了,我们看一看。磁盘之间的数据均衡啊,就能帮我们做这个事儿,那首先我们要执行这么一个命令,它呢就能帮我们生成一个均衡计划,但是大家要记住一点,我们的虚拟机。有多块磁盘吗?没有啊,虚拟机它没有多磁盘的这个概念。那我们的虚拟机只有一块磁盘,所以说我们呢,在虚拟机上来测试的时候,我们无法生成均衡计划,一块磁盘你跟谁去均衡去啊,啊,一块磁盘均衡不了,那接下来生成完均衡计划之后呢,我们就要执行我们所生成的这个均衡计划了,OK,那在执行的时候呢,我们也可以通过这个命令啊,来查看我们当前这个磁盘来均衡的情况,你比方说我看一看三台三四块磁盘,他们每一块磁盘都占多少了呀,均衡到一个什么程度了呀,OK,那当这个磁盘之间呢,他们,哎,我感觉均衡都差不多了,都剩到30%左右了。
09:21
那然后呢,我就可以取消我的均衡任务了,注意这个均衡任务啊,我们只能手动取消,他不会帮我们自动取消,那我们执行完了之后,我想的是,诶均衡差不多了,那你可能自己就停止了,不会的。它会停止,但是这个均衡的线程它一直在,当磁盘之间的这个数据量啊,它们的差异性又变得非常大了。那么这个均衡又会自动的重启了,那大家想一想,这个磁盘之间的数据均衡,它是一个什么样的情况啊?我是不是就把这个数据量多的这个磁盘的数据,我给你往这个复制一份,往这儿复制一份,往这再复制一份,这是不是就是一个磁盘之间的数据传输啊,说白了就是一个复制嘛,那当然了,它不是跨节点通信啊,但是只要是文件磁盘之间的IO,那它肯定就是要耗费性能的,所以说这个均衡任务我们执行完一次必须要取消,你不取消,那他就会时刻的给你一直还在监控我们磁盘的状态,然后帮助我们来均衡节点之间的数据均衡,那首先呢,我们来看一看节点之间的数据均衡,最开始我们要开启一个均衡命令,但是我们开启均衡命令,它后面,哎,你看这有一个十,这个十是什么意思呢?它是一个比例啊,那首先我们看节点之间的数据均衡是啥样的啊。
10:45
我们现在这是不是只有一台服务器啊,这是哈杜OP102,那可能在我们的生产环境上,我还有一个哈杜OP103,那这台机器啊,它就是我们的哈杜103,诶我给它缩小一点。
11:00
好,那这个就是我们的哈多103,那你比方说我现在这两台机器,首先有三台机器吧,102 103 104啊,102这台机器它的总共磁盘的使用量已经使用了80%了,或者甚至于90%了,那103和104啊,它们两个的使用量只有10%。那这样你看节点之间,它们之间的数据也出现了不均衡,那也出现了不均衡的话,我这台服务器当我在写数据的时候,那它也很有可能写到我的这台服务器上,那我这台服务器写就会导致我们整个的大数据集群。它的性能哎非常差,那怎么办呢?我们要想办法把它的数据给这两台机器复制一份,然后让我们磁盘之间的这个数据给它均衡一下,那这个时候我们就要用到节点之间的数据均衡了,那这有一个10%是啥意思呢?它呀是一个比例,你比方说我在均衡的时候,我判断一下。
12:04
我们这两台节点之间,它们磁盘的数据量相差到没到10%,如果说相差还是大于10%的话,那我就继续均衡,什么时候你们两台机器或者是三台机器之间呢,它们之间的数据相差已经小于10%了,那么我就会立即停止均衡,注意啊,我们所说的这个停止均衡呢,他也不是说我这个均衡的进程就没了,这个均衡的进程线程它也会一直阻塞在后台,当他什么时候发现。我们节点之间的数据,哎,又超过10%了,那这那这个线程就会被立即唤醒,它继续均衡,所以说我们均衡完也要执行一个停止的命令啊,那说完数据均衡,我们这儿还有一个参数,这个参数我们看一看它是啥意思啊。这个参数,那我们想一个事儿,我们的这个数据啊,你看这是我们的name note,这是我们的data note,我们在data notde当中有这么多数据块,那每一个数据块上午的时候我们是不是说过要上内node进行上报啊,要向NN进行上报吧,每一个数据块都需要向NN进行上报,那既然需要向NN内node进行上报的话,内node呢,它就对应的要有这么多线程来帮我们接收。
13:28
Data note的数据块上报的请求,那这个线程数我们设置成多少合适呢?我们设置多少个线程来帮助我们接收数据块的请求呢?那这个那有同学说我先设置100个呗,啊,我设置1000个,100个线程,我设置100个线程,1000个太夸张了,100个线程来帮我们接收,那好了,那我们现在磁盘之间,我一共只有九个数据框,你咔搞了100个线程,是不是有点有点浪费呀,这个线程它的设置啊,我们呢,也这儿也有一个遵循的公式,我们看一看它呢。
14:04
呃,这个公式我们是叫做。20乘以log,以E为底集群数量的这么一个对数,那同学说老师你这个log我已经不会算了啊,这个是什么呢?这个log应该是我们在初中的时候就学过的这么一个,那你现在不会也很正常啊,毕竟我们都已经大学毕业了,那初中学过的东西你不会哎,是很正常的,那怎么办呢?没事,我们呢,这在我们的。高总是吧,啊行,在我们的这个Linux当中有一个Python py hon,那Python里它就有一些相应的数学包,那我导入这个数学包,然后我就可以用我对应的数学包里的一些公式了,好,我给它复制过来,复制完之后啊,我就先I portt导入一个matchx数学包,导完之后你看我执行一下这个公式,我们看看啊,20乘以max.log在这个包下面就有这么一个log log我没有底数,那默认的呀,这个底数就是E,如果说你没有写底,它的底数就是E,那我这还有一个八集群数量的这么一个对数,但我现在没有八台集群,我是三台集群,那接下来我们看一看它返回一个什么结果,我们给它返回一个int类型的结果回去。
15:25
回车之后,它给我们返回了一个21,那也就是说这个接克线程我们给它设置成21个,OK,那这个参数是什么呢?我们看在这呢,DFS的内note,它啊,就把这个参数给它放到我们的HDFS-S当中啊,这儿还有这么一个面试题,现在啊,我们这台机器是这么一个情况,在我们的服务器当中。我们的大数据集群一共有七台机器,每天的数据量是几亿条,数据量很大啊,七台机器集群规模也还行,那数据源的去向啊,啊,我们的数据流向是这样的,数据源卡普卡HDMS还我哎,跟我们的集群刚好吻合,但是最近呢,出现了这么样的一个情况,怎么个情况呢?
16:11
当我们在用circleq进行计算的时候,我发现我的这个SQ语句它也没有数据清洗。啊,小文件呢,我们呢也做了合并,并且啊我们也开启了这个JVM通用,而且IO,哎,磁盘之间的这个网络IO也非常好,而且内存我用了还不到50%,用了不到50%,那也就是说还剩50%没有用呢,内存是不是也很充足呢,但是它跑的还是非常慢。为什么呢?哎,你看你们之前会的这些内容啊,哎都帮你们解决好了,什么数据倾斜,哎你们会处理了,小文件你们呢也会处理了,那这边M重用你们也知道怎么搞,那IO如果说出问题了,大家也都知道该怎么做。这些事儿已经帮你解决完了,但是他跑的还是非常慢,注意这有这么一个点啊,并且呀,数据洪峰过来的时候,整个集群都会荡掉,你看我剩了这么多的内存,为什么数据。
17:13
过来了,我的整个集群都会荡掉呢,那针对于这种情况,大家想一想,能不能想出什么方案呢?先不要想是什么方案,先去想是什么原因导致的,我们呢,用正常的这个思想啊,内存用了不到50%,那是啥意思呢?哎,我们一想,你内存用了不到50%,你还有这么多可以用的啊,你不到50%,你只用了这么多,你还有这么多可以用,但是我们用一个逆向思维来考虑,你有50%没有用啊,你有这么多内存没有用,但是你数据过来的时候你挂了,那就证明你数据过来的时候,你这50%你依然没有用得到,它才会挂吧,说白了不是我们的内存不够用了。
18:04
而是我们对内存的利用率不够吧?啊,而是我们对内存的利用率不够了吧?OK,那好了,那内存的利用率,我们计算的时候,雅安的内存利用率不够了,我们怎么办?还记不记得我们昨天学了两个参数啊,往下看。在这呢,第一个参数叫做调整雅恩单个节点它可以使用的最大内存,那这个内存叫做雅安的单个任务,也就是container,它的最大内存什么意思呢?看啊,你比方说我们现在这台机器在生产环境下是一个128G的,那128G的这台机器,我让你的。No manager,也就是我们雅安可以使用的内存,我只让你用了多少啊啊,他用了不到一半,你比方说我只给他用了60个G。
19:00
那还剩下60多个G啊,还剩下68个G,你这68个G我们的雅恩根本就没有用得到啊,能理解了吧?哎,这个是利用率不足导致的,所以说那对应的呢,我们就要调整这个参数,对应的给它稍稍调大一些再有。单个任务是可申请到最大物理内存,那这个就是我们所说的con的con ta,那还有一种可能就是你看数据洪峰过来了,刚刚也说了,数据洪峰过来的时候任务会挂掉,那就证明我们的这个container啊,内存设置的也给它过小了,哎,数据一大了,我们的container它就没有那么大内存了,所以说对应的这两个设置呢,我们要给它设置的大一些,默认的啊,这两个都是八个G,你看你这个默认是8G。我们是120G的,128G的服务器,默认的你只有八个G啊,那还剩120G你都没有用,所以说这个参数用默认的肯定不行啊,我们对应的要给它调大,同样这个参数呢,我们也可以稍稍给它调大一些。
我来说两句