Hadoop中HDFS读取和写入的工作原理(2)

至于脚本的编写,就需要将真实的网络拓朴和机架信息了解清楚后,通过该脚本能够将机器的ip地址正确的映射到相应的机架上去。一个简单的实现如下:

#!/usr/bin/Python
#-*-coding:UTF-8 -*-
import sys

rack = {"hadoopnode-176.tj":"rack1",
"hadoopnode-178.tj":"rack1",
"hadoopnode-179.tj":"rack1",
"hadoopnode-180.tj":"rack1",
"hadoopnode-186.tj":"rack2",
"hadoopnode-187.tj":"rack2",
"hadoopnode-188.tj":"rack2",
"hadoopnode-190.tj":"rack2",
"192.168.1.15":"rack1",
"192.168.1.17":"rack1",
"192.168.1.18":"rack1",
"192.168.1.19":"rack1",
"192.168.1.25":"rack2",
"192.168.1.26":"rack2",
"192.168.1.27":"rack2",
"192.168.1.29":"rack2",
}


if __name__=="__main__":
print "/" + rack.get(sys.argv[1],"rack0")

由于没有找到确切的文档说明 到底是主机名还是ip地址会被传入到脚本,所以在脚本中最好兼容主机名和ip地址,如果机房架构比较复杂的话,脚本可以返回如:/dc1/rack1 类似的字符串。

二 读取数据

  我们看一下Hadoop集群配置中如何读取数据。当对某个文件的某个block进行读取的时候,hadoop采取的策略也是一样:

  1.首先得到这个block所在的datanode的列表,有几个副本数该列表就有几个datanode。

  2.根据列表中datanode距离读取端的距离进行从小到大的排序:

  a)首先查找本地是否存在该block的副本,如果存在,则将本地datanode作为第一个读取该block的datanode

  b)然后查找本地的同一个rack下是否有保存了该block副本的datanode

  c)最后如果都没有找到,或者读取数据的node本身不是datanode节点,则返回datanode列表的一个随机顺序。

--------------------------------------分割线 --------------------------------------

将本地文件拷到HDFS中

从HDFS下载文件到本地

将本地文件上传至HDFS

HDFS基本文件常用命令

Hadoop中HDFS和MapReduce节点基本简介

《Hadoop实战》中文版+英文文字版+源码【PDF】

Hadoop: The Definitive Guide【PDF版】

--------------------------------------分割线 --------------------------------------

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ff2130fd077e7843214cca13bc64e218.html