前言

  我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的。那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了

一、HDFS中数据块概述

1.1、HDFS集群中数据块存放位置

  我们知道hadoop集群遵循的是主/从的架构,namenode很多时候都不作为文件的读写操作,只负责任务的调度和掌握数据块在哪些datanode的分布,

  保存的是一些数据结构,是namespace或者类似索引之类的东西,真正的数据存储和对数据的读写是发生在datanode里的。

  找到${HADOOP_HOME}/ect/hadoop/hdfs-site.xml文件,里面有你自己定义的dfs.datanode.data.dir一项就是你数据存放的位置。

  此外我们还可以通过Web控制页面(http://master:50070)的hdfs查看你所存放的所有数据文件,而且更加的清晰简洁,包括文件的名称,用了多少个数据块存储,数据块的id,每个数据块写入数据的大小。

    

1.2、数据块(data block)简介

  每个磁盘都有默认的数据块大小,这是磁盘进行数据读/写的最小单位,构建于单个磁盘之上的文件系统通过磁盘块来管理该文件系统中的块,该文件系统块的大小可以是磁盘块的整数倍。

  HDFS同样也有块的概念,但是大得多,默认为128MB(2.0以前是64MB)。与单一磁盘上的文件系统相似,HDFS上的文件也被划分为多个分块,作为独立的存储单元。

  与其他文件系统不同的是,HDFS中小于一个块大小的文件不会占据整个块的空间。

1.3、对分布式文件系统中的块进行抽象会带来很多好处

  1)第一个明显的好处是,一个文件的大小可以大于网络中任意一个磁盘的容量。文件的所有块并不需要存储在同一个磁盘上,因此他们可以利用集群上的任意一个磁盘进行存储。
  2)第二个好处是,使用块抽象而非整个文件做为存储单元,大大简化了存储子系统的设计。简化是所有系统的目标,但是这对于故障种类繁多的分布式系统来说尤为重要。

    将存储子系统控制单元设置为块,可简化存储管理(由于块的大小是固定的,因此计算单个磁盘能够存储多少个块相对容易)。同时也消除了对元数据的顾虑(块只是存储数据的一部分---而文件的元数据,

    如权限信息,并不需要与块一同存储,这样一来,其他的系统就可以单独管理这些元数据)。
  3)块非常适合用于数据备份进而提供数据容错能力和可用性。将每个块复制到少数几个独立的机器上(默认为3个),可以确保在发生块、磁盘或机器故障后数据不会丢失。

    如果发现一个块不可用,系统会从其他地方读取另一个复本,而这个过程对用户是透明的。

  注意:HDFS中的文件都是一次性写入的,并且严格要求在任何时候只能有一个写入者。

二、Java访问HDFS中的数据块

2.1、相关类和方法介绍

  Hadoop关于HDFS中的数据块相关类 org.apache.hadoop.hdfs.protocol包下。(不知道为什么在2.8的api中查询不到,所以我只能通过IDEA去看源码)

  1)ExtendedBlock类(通过LocatedBlock的getBlock()方法获取)

public String getBlockName() {}
public long getBlockId() {}

    这里主要是得到数据块的名字和id。

  2)DatanodeInfo类

    这里列举部分属性

    

  public String getIpAddr() {}
public String getHostName() {}  

  3)LocatedBlock

public ExtendedBlock getBlock(){}
public long getBlockSize() {}
public long getStartOffset() {}  //这个数据块距离这个文件的偏移量
public DatanodeInfo[] getLocations() {}  // 获取当前的数据块所在的DataNode的信息     

2.2、编写程序访问

  1)使用方法

    在 HdfsDataInputStream中:获取所有数据块信息

      

  2)ListBlocks_0010

import java.net.URI;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.client.HdfsDataInputStream;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.hdfs.protocol.ExtendedBlock;
import org.apache.hadoop.hdfs.protocol.LocatedBlock;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; public class ListBlocks_0010
extends Configured
implements Tool{
@Override
public int run(String[] args) throws Exception{
Configuration conf=getConf();
String input=conf.get("input");
FileSystem fs=
FileSystem.get(
URI.create(input),conf);
HdfsDataInputStream hdis=
(HdfsDataInputStream)
fs.open(new Path(input));
List<LocatedBlock> allBlocks=
hdis.getAllBlocks();
for(LocatedBlock block:allBlocks){
ExtendedBlock eBlock=
block.getBlock();
System.out.println("------------------------");
System.out.println(
eBlock.getBlockId());
System.out.println(
eBlock.getBlockName());
System.out.println(
block.getBlockSize());
System.out.println(
block.getStartOffset());
// 获取当前的数据块所在的DataNode的信息
DatanodeInfo[] locations=
block.getLocations();
for(DatanodeInfo info:locations){
System.out.println(
info.getIpAddr());
System.out.println(
info.getHostName());
}
}
return ;
} public static void main(String[] args) throws Exception{
System.exit(
ToolRunner.run(
new ListBlocks_0010(),args));
}
}

  3)测试

    在安装了Hadoop客户端的服务器中执行:

      

    结果:

      

    这里解释一下偏移量:

      数据块的偏移量是指一个数据块距离一个文件开始的偏移位置(从上图中可以分析出来)

      

二、Java查看HDFS集群文件系统

  我们怎么去查看HDFS文件系统呢?我们可以通过FileSystem类中

1.1、相关类和方法

  1)FileStatus类

    

    FileStatus类封装文件和目录的文件系统元数据,包括文件长度,块大小,复制,修改时间,所有权和许可信息。
    FileSystem上的getFileStatus()方法提供了一种获取FileStatus的方法对象为单个文件或目录。

getAccessTime()  //上次访问的时间
getOwner() //文件的所有者
getGroup() //文件的所属者
getPath() //得到文件的路径
getPermission() //文件的权限
getReplication() //文件的备份数

  2)FileSystem中的类  

public FileStatus[] listStatus(Path f)throws IOException;
public FileStatus[] listStatus(Path f, PathFilter filter)throws IOException;
public FileStatus[] listStatus(Path[] files)throws IOException;
public FileStatus[] listStatus(Path[] files, PathFilter filter)throws IOException;

2.2、编写程序访问

  1)核心代码

import java.io.IOException;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; public class ListFileStatus_0010
extends Configured
implements Tool{
FileSystem fs;
@Override
public int run(String[] args) throws Exception{
Configuration conf=getConf();
String input=conf.get("input"); fs=FileSystem.get(
URI.create(input),conf);
FileStatus[] fileStatuses=
fs.listStatus(new Path(input));
for(FileStatus status:fileStatuses){
process(status);
}
return ;
} public void process(
FileStatus fileStatus) throws IOException{
if(fileStatus.isFile()){
System.out.println("--------------");
System.out.println(
fileStatus.getAccessTime()); //上次访问的时间
System.out.println(
fileStatus.getOwner()); //文件的所有者
System.out.println(
fileStatus.getGroup()); //文件的所属者
System.out.println(
fileStatus.getPath()); //得到文件的路径
System.out.println(
fileStatus.getPermission()); //文件的权限
System.out.println(
fileStatus.getReplication()); //文件的备份数
}else if(fileStatus.isDirectory()){ // 和Java的File不一样的地方:
// 当File对象所代表的是目录的时候,
// 可以通过listFiles方法来获取该目录下的所有文件(有可能还包含目录) // 在HDFS中,当FileStatus对象代表一个目录的时候
// 没有相应的方法来获取该目录下的所有文件
// 要通过FileSystem类来获取该目录下的文件
// path=fileStatus.getPath();
// FileStatus[] fileStstuses=
// fs.listStatus(path);
FileStatus[] fileStatuses=
fs.listStatus(fileStatus.getPath());
for(FileStatus status:fileStatuses){
process(status);
}
}
} public static void main(String[] args) throws Exception{
System.exit(ToolRunner.run(new ListFileStatus_0010(),args));
}
}

  2)测试

    我们先运行一个文件:

      

    我们运行一个目录:有n多的文件,并且做了递归调用

      

      

喜欢就点个“推荐”哦!    

Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统的更多相关文章

  1. hadoop 集群中数据块的副本存放策略

    HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性.可用性和网络带宽的利用率.目前实现的副本存放策略只是在这个方向上的第一步.实现这个策略的短期目标是验证它在生产环境下的有效 ...

  2. Hadoop(五)搭建Hadoop与Java访问HDFS集群

    前言 上一篇详细介绍了HDFS集群,还有操作HDFS集群的一些命令,常用的命令: hdfs dfs -ls xxx hdfs dfs -mkdir -p /xxx/xxx hdfs dfs -cat ...

  3. Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群

    阅读目录(Content) 一.Hadoop客户端配置 二.Java访问HDFS集群 2.1.HDFS的Java访问接口 2.2.Java访问HDFS主要编程步骤 2.3.使用FileSystem A ...

  4. 大数据学习笔记03-HDFS-HDFS组件介绍及Java访问HDFS集群

    HDFS组件概述 NameNode 存储数据节点信息及元文件,即:分成了多少数据块,每一个数据块存储在哪一个DataNode中,每一个数据块备份到哪些DataNode中 这个集群有哪些DataNode ...

  5. Hadoop集群-HDFS集群中大数据运维常用的命令总结

    Hadoop集群-HDFS集群中大数据运维常用的命令总结 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客会简单涉及到滚动编辑,融合镜像文件,目录的空间配额等运维操作简介.话 ...

  6. Hadoop基础-HDFS集群中大数据开发常用的命令总结

    Hadoop基础-HDFS集群中大数据开发常用的命令总结 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本盘博客仅仅列出了我们在实际生成环境中常用的hdfs命令,如果想要了解更多, ...

  7. 02使用java脚本向Pxc集群写入数据

    使用java脚本向Pxc集群写入数据 批量写入pxc集群程序 导入mysql驱动包 # 批量插入数据的java脚本 package pxc_demo; import java.sql.Connecti ...

  8. 【转载】浅析从外部访问 Kubernetes 集群中应用的几种方式

    一般情况下,Kubernetes 的 Cluster Network 是属于私有网络,只能在 Cluster Network 内部才能访问部署的应用.那么如何才能将 Kubernetes 集群中的应用 ...

  9. 模拟安装redis5.0集群并通过Java代码访问redis集群

    在虚拟机上模拟redis5.0的集群,由于redis的投票机制,一个集群至少需要3个redis节点,如果每个节点设置一主一备,一共需要六台虚拟机来搭建集群,此处,在一台虚拟机上使用6个redis实例来 ...

随机推荐

  1. SNS团队第六次站立会议(2017.04.27)

    一.当天站立式会议照片 本次会议主要内容:汇报工作进度,根据完成情况调整进度 二.每个人的工作 成员 今天已完成的工作 明天计划完成的工作 罗于婕 导入相关词库数据  研究如何存取语音.图片文件 龚晓 ...

  2. 201521123103 《java学习笔记》 第十三周学习总结

    一.本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 二.书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.e ...

  3. 201521123121 《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 进程:每个进程都有独立的代码和数据空间,进程间的切换会有较大的开销,一个进程包含1--n个线程. 线程:同一 ...

  4. 201521123001《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  5. php中的多条件查询

    首先是查询所有,步骤不详述,连接数据库,查询表中的所有信息,foreach循环以表格的形式打印出来 然后就是form表单中提交查询的数据,这里以post方式提交到本页面,所以要判断post中是否有值, ...

  6. 如何在Oracle官网下载历史版本JDK

    打开Oracle官网,准备下载java JDK(下载时需要使用注册用户登陆,可以免费注册) 官网地址:http://www.oracle.com/ 2 鼠标悬停Downloads,会出现相关内容,如下 ...

  7. 一条语句导致CPU持续100%

    一大早收到一堆CPU预警邮件,通常每天只在统计作业执行期间会收到2~3封CPU预警邮件.这次的预警来自另一台服务器,并且明细数据显示其CPU一直维持在49%.登录到服务器,查看任务管理器(查看资源监视 ...

  8. Maven搭建SpringMVC+MyBatis+Json项目(多模块项目)

    一.开发环境 Eclipse:eclipse-jee-luna-SR1a-win32; JDK:jdk-8u121-windows-i586.exe; MySql:MySQL Server 5.5; ...

  9. GitHub新手使用教学(从安装到使用)

    一.安装Git for Windows(又名msysgit)  下载地址: https://git-for-windows.github.io/  在官方下载完后,安装到Windows Explore ...

  10. [AHOI2004]奇怪的字符串

    [AHOI2004]奇怪的字符串 题目描述 输入输出格式 输入格式: 输入文件中包含两个字符串X和Y.当中两字符串非0即1.序列长度均小于9999. 输出格式: X和Y的最长公共子序列长度. 输入输出 ...