前言

  我们知道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. JAVA基础第三组(5道题)

    11 [程序11] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件 ...

  2. 【Alpha】Daily Scrum Meeting——Day2

    站立式会议照片 1.本次会议为第二次 Meeting会议: 2.本次会议在中午12:30,在陆大楼召开,本次会议为30分钟讨论昨天的任务完成情况以及接下来的任务安排. 每个人的工作分配 成 员 昨天已 ...

  3. 201521123104《Java程序设计》第4周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. (1)继承时子类将获得父类的属性与方法,并具有自身特有的属性与方法. (2)使用super还 ...

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

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 协议.IP.域名.端口号 协议:网络中为了进行数据交换(通信)而建立的规则.标准或约定(=语义+语法+规则 ...

  5. php中获取当前系统时间、时间戳

    今天写下otime($time, $now)为将时间格式转为时间戳,$time为必填.清楚了这个,想了解更多,请继续往下看. 3. date($format)用法比如:echo date(‘Y-m-d ...

  6. php中的多条件查询

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

  7. 201621123067《JAVA程序设计》第一周学习总结

    第一周-JAVA基本概念 1.本周学习总结 本周初次接触Java这一工程语言,我也首次接触了类名和面向对象这两个关键术语,虽然有C的基础但还是觉得有点不同.同时也学习到了Java的安装,eclipse ...

  8. 过度拟合(overfilting)

    过拟合概念:是指分类器能够百分之百的正确分类样本数据(训练集中的样本数据),对训练集以外的数据却不能够正确分类. 原因:1:模型(算法)太过复杂,比如神经网络,算法太过精细复杂,规则太过严格,以至于任 ...

  9. 用JS制作一个信息管理平台完整版

      前  言 JRedu 在之前的文章中,介绍了如何用JS制作一个实用的信息管理平台. 但是那样的平台功能过于简陋了,我们今天来继续完善一下. 首先我们回顾一下之前的内容.   1.JSON的基础知识 ...

  10. oracle pl/sql 控制结构(分支,循环,控制)

    一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...