您的位置:首页 > 大数据

大数据-Hadoop学习笔记04

2017-03-19 20:12 232 查看

12.使用hadoop hdfs API访问hdfs文件系统

1.Configuration

配置对象,加载配置文件
addDefaultResource(core-default.xml) 从classpath加载
addDefaultResource(pdfs-site.xml)


2.FileSystem

DistributedFileSystem,是FileSystem的一个实现用于和hadoop的hdfs进行交互的API


3.Path

文件或者目录的名称,/是路径分隔符,有绝对路径和相对路径之分


13.在eclipes中安装hadoop插件,方便访问hdfs

1.下载对应版本的hadoop2x-eclipes-plugin.zip
2.解压hadoop2x-eclipse-plugin.zip/release/*.jar(3)到${eclipse_home}/plugins/下
3.重启eclipse
4.验证插件是否安装成功


14.网络拓扑

在本地网络中,两个节点被称为彼此近邻。因为在海量数据处理中,其主要限制因素是节点间数据的传输速率——带宽很稀缺,这里的想法是
将两个节点间的带宽作为距离的衡量标准不用衡量节点之间的带宽——实际上很难实现(它需要一个稳定的集群,并且在集群中两两节点对数量是节点数
量的平方)——hadoop为此采用一个简单的方法:把网络看作一棵树,两个节点间的距离是它们到最近共同祖先即交换机的距离总和,该树中的层次是
没有预先设定的,但是相对于数据中心、机架和正在运行的节点,通常可以设定等级,具体想法是针对以下每个场景,可用带宽依次递减

- 同一节点的进程间通信
- 同一机架不同节点间进程通信
- 同一数据中心不同机架间进程通信
- 不同数据中心节点之间进程通信


15.剖析文件写过程

create操作后,namenode执行各种不同的检查以确保这个文件不存在以及客户端有新建该文件的权限。如果这些检查均通过,namenode就会
为创建新文件记录一条记录;否则,文件创建失败并向客户端抛出一个IOException异常DistributedFileSystem向客户端返回一个象负责处理
datanode和namenode之间的通信。
在客户端写入数据时,DFSOutputStream将它分为一个个的数据包,并写入内部队列,称为数据队列。DataStreamer处理数据队列,他的责
任是根据datanode列表来要求namenode分配适合的新块来存储数据复本。这一组datanode构成一个管线——我们假设副本数为3,所以管线中有3个
回执,称为确认队列。收到管道中所有的datanode确认信息后,该数据包才会从确认队列删除。
障节点下游的datanode不会漏掉任何一个数据包。为存储在另一正常datanode的当前数据块指定一个新的标识,并将该标识传送给namenode,以
namenode注意到块复本量不足时,会在另一个节点上创建一个新的复本。后续的数据块继续正常接收处理。会成功,并且这个块可以在集群中异步
复制,直到达到其目标复本数。
客户端完成数据的写入后,对数据流调用close()方法,该操作将剩余的所有数据包写入datanode管线,并在联系到namenode且发送文件写入
完成信号之前,等待确认。namenode已经知道文件由哪些块组成,所以它在返回成功前需要等待数据块进行最小量的复制。


16.剖析文件读过程

open操作后,DistributedFileSystem类返回一个FSDataInputStream对象(一个支持文件定位的输入流)给客户端并读取数
据。FSDataInputStream类转而封装DFSInputStream对象,该对象管理着datanode和namenode的I/O。
接着,客户端对这个输入流调用read方法。存储着文件起始几个块的datanode地址的DFSInputStream随即连接距离最近的datanode。通过
对数据流反复调用read方法,可以将水从datanode传输到客户端。到达块的末端时,DFSInputStream关闭与datanode的链接,然后寻找下一个块
的最佳datanode。客户端只需要读取连续的流,并且对于客户端都是透明的。
客户端从流中读取数据时,块是按照打开DFSInputStream与datanode新建连接的顺序读取的。它也会根据需要询问namenode来检索下一
批数据块的datanode的位置。一旦客户端完成读取,就对FSDataInputStream调用close方法。
在读取数据的时候,如果DFSInputStream在与datanode通信时遇到错误,会尝试从这个块的另外一个最邻近的datanode读取数据。他也记
住那个故障datanode,以保证以后不会反复读取该节点上后续的块。DFSInputStream也会通过校验和确认从datanode发来的数据是否完整。如
果发现有损坏的块,就在DFSInputStream试图从其他datanode读取其复本之前通知namenode。
这个设计的一个重点是,namenode告知客户端每个块中最佳的datanode,并让客户端直接连接到该datanode检索数据。由于数据流分散在
集群中的所有datanode,所以这种设计能使HDFS可扩展到大量的并发客户端。同时,namenode只需要响应块位置的请求(这些信息存储在内存中,
因为非常高效),无需响应数据请求,否则随着客户端数量的增长,namenode会很快成为瓶颈。


17.复本节点的选择(本地行)

1.默认
-第一个复本在client所处的节点处
-第二个复本在同一机架的不同节点处
-第三个复本在不同机架上
2.自定义机架感知

1.创建类实现DNSToSwitchMapping接口
2.配置core-site.xml


<property>
<name>net.topology.node.switch.mapping.impl</name>
<value>com.test.MyDNSToSwitchMapping</value>
</property>


3.分发core-site.xml
4.编译程序,打成jar,分发所有节点的hadoop类路径下,例如放在common目录下


public class MyDNSToSwitchMapping implements DNSToSwitchMapping{

@Override
public List<String> resolve(List<String> names) {
List<String> list = new ArrayList<>();
if(null != names && names.size()>0) {
for(String name: names) {
//主机名s开头,ip为192.168.231.xxx,s后面的数字与xxx相同,
int ip = 0;
if(name.startsWith("s")) {
ip = Integer.parseInt(name.substring(1));
} else if(name.startsWith("192")) {
ip = Integer.parseInt(name.substring(name.lastIndexOf("."))+1);
}
if(ip <103) {
list.add("/rack1/");
} else {
list.add("/rack2/");
}
}
}
return list;
}

@Override
public void reloadCachedMappings() {}

@Override
public void reloadCachedMappings(List<String> names) {}

}


18.查看namenode镜像文件和编辑文件

1.查看镜像文件

hdfs oiv -p XML -i fsimagiename -o ~/xx.xml

2.查看编辑文件

hdfs oev -p XML -I editsname -o ~/xx.xml
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  大数据 hadoop