ITPub博客

首页 > 大数据 > Hadoop > hadoop实战4--(hdfs读流程,hdfs写流程,副本放置策略)

hadoop实战4--(hdfs读流程,hdfs写流程,副本放置策略)

原创 Hadoop 作者:shaozi74108 时间:2019-02-22 14:47:05 0 删除 编辑
hadoop实战4--(hdfs读流程,hdfs写流程,副本放置策略)
su - hadoop
jps
cd app/hadoop-2.6.0-cdh5.7.0
bin/hdfs dfs  -ls
一、本机被挖矿程序入侵处理?
1.top查看占用的进程

2. ps -ef | grep  7509  #查看端口对应的脚本

3.查看是否有定时任务,并编辑查看内容

可以看到定时任务中的内容,将其注释掉
#wget -q -o


4.善后处理
因为是云主机,开放了8088端口,故容易别侵入,因为程序使用了wget程序,故我们把云主机上的wget程序卸载掉,防止再次发生。
yum  remove wget
5. 杀掉端口

kill  -9  7095

二、dfs写流程:
1 .例如执行命令hdfs dfs -put  LICENSE.TXT  /
对我们操作者而言是无感知的。并不知道上传到哪个节点。
2.在执行命令的瞬间,调用了dfs命令,dfs根据hdfs 帮助命令可以看到,是运行了一个hadoop所支持的操作文件系统的命令。


图解说明:
写流程对于我们操作者而言,是无感知的
1.Client调用FileSystem.create(filePath)方法,
去与NN进行【RPC】通信,check该路径的文件是否存在
以及有没有权限创建该文件。 假如OK,就创建一个新文件,
但是不关联任何的block,nn根据上传的文件大小且块大小且副本数,
计算多少块,以及块存放的dn,最终将这些信息返回给客户端
则为【FSDataOutputStream】。
2.Client调用FSDataOutputStream.write方法,将第一个块的
第一个副本写到第一个DN,写完写第二个副本,写完写第三个副本;
当第三个副本写完,返回给ack packet给第二个副本的DN,然后第二个DN返回ack packet给第一个DN;
第一个DN返回ack packet给FSDataOutputStream对象,标识第一个块,3副本写完!
然后依次写剩余的块!
(对操作者来说是透明的)
3.当向文件写入数据完成后,Client调用FSDataOutputStream.close()方法。关闭输出流,flush换成区的数据包。
4.再调用FileSystem.complete(),通知NN节点写入成功。
思考1:
当一个文件有三个副本,三个节点,某刻损坏一个节点,此时文件还能写么?
答:不能。副本数=节点数,故我们在部署的时候:副本数据<DN。
总结: 存活的DN满足我们的副本数 就能写
类比只有一个节点的时候,该节点挂掉,是不能写的。
实验: 类同当只有一个节点的时候,该节点挂掉,还可以写么?
1.jps
2.kill -9  datanode进程
3. hdfs dfs - put  LICENSE.txt  /ruozedata

结论:是不能写的
思考2:
一个文件有三个备份,放在三个节点 ,此时损坏一个几点,该文件是否还能读?
答:是可以读的,写不是不能写的
此时该怎么办?
1.手动修复
hdfs debug recoverlease  / a.txt 手工恢复这些坏块(依据其他副本来修复)
2.自动修复
配置两个参数
dfs.datanode.
实验:
模拟块损坏:
1.可以删除目录下的块(mv 到其他位置。模拟损坏)
2.hdfs fsck /  #检测块

3.修复块

三、hdfs读流程

图解说明:
FSDataIutputStream
1.Client通过FileSystem.open(filePath),
去与NN进行【RPC】通信,返回该文件的部分
或全部的block列表,也就是返回FSDataInputStream对象。
2.Client调用【FSDataInputStream】对象的read()方法,
a. 去与第一个块的最近的DN进行read,读取完后,会check,
假如success,会关闭与当前DN通信。假如fail 会记录失败的DN+block信息,下次就不会读取。
那么会去该块的第二个DN的地址读取。
b.然后去第二个块的最近的DN上读取,会check,success,会关闭与当前DN通信。
c.假如当前block列表全部读取完成,文件还没结束,那么FileSystem会从NN获取下一批的block列表。
(对于操作者,是透明的,感觉就是连续的数据流)
3.Client调用FSDataInputStream.close() 关闭输入流
四、副本放置策略:
思考:为何一个机柜放5个服务器?
答:机柜总电流大小/每个服务器电流大小=服务器个数

总结:client橘黄色部分是命令行,提交应该响应速度快,故第一个副本放置在“本地”,其他副本放置在别的机柜。2,3个副本不应该放置在同一服务器中, 集群环境随机放置副本。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28339956/viewspace-2636696/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
数据库方向,传统关系型数据库,etl方向,涉及银行,保险等海量数据。欢迎大牛批评指点。

注册时间:2016-02-22

  • 博文量
    9
  • 访问量
    19936