一、使用HDFS FileSystem详解

HDFS依赖的第三方包:

  hadoop 1.x版本:

  commons-configuration-1.6.jar

  commons-lang-2.4.jar

  commons-loggin-1.1.1.jar

  hadoop-core-1.2.1.jar

  log4j-1.2.15.jar

  hadoop2.x版本:

  hadoop-mapreduce-client-core-2.2.0.jar

  hadoop-common-2.2.0.jar 

  hadoop-mapreduce-client-common-2.2.0.jar

  hadoop-mapreduce-client-jobclient-2.2.0.jar

注意:可根据自身的情况和版本信息手动添加或maven仓库依赖。

文件操作

  1 工具类的创建:

  创建一个工具类HDFSUtils,主要用来加载公共信息:  

 package com.laowang.utils;

 import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import java.io.IOException;
import java.net.URI; /**
* @author laowang
* @version v1.0.0
* @apiNote HDFS 工具类
* @since 2018/4/26 10:36
*/
public class HDFSUtil {
/**
* @author laowang
* @version v1.0.0
* @apiNote 获取FileSystem
* @since 2018/4/26 10:39
*/
public static FileSystem getFileSystem() {
FileSystem hdfs = null;
//获取配置文件信息
Configuration conf = new Configuration();
conf.set("fs.hdfs.impl",DistributedFileSystem.class.getName());
try {
//获取文件系统
hdfs = FileSystem.get(URI.create("hdfs://master01:9000"), conf);
} catch (IOException e) {
e.printStackTrace();
}
return hdfs;
} /**
* 关闭文件流
* @param fileSystem
*/
public static boolean closeFileSystem(FileSystem fileSystem) {
boolean flag = false;
if (fileSystem != null) {
try {
fileSystem.close();
flag = true;
} catch (Exception e) {
e.printStackTrace();
}
}
return flag;
}
}

HDFSUtils

  2 上传文件到HDFS

  /**
* @author laowang
* @version v1.0.0
* @apiNote 上传文件
* @since 2018/4/26 14:14
*/
public static void putFile() throws Exception {
Path sourcePath = new Path("E:\\port.txt");
//文件名称
Path targetPath = new Path("/test/");
//从本地复制文件到文件系统中去
hdfs.copyFromLocalFile(sourcePath,targetPath);
}

上传文件

  3 读取文件

     /**
* @author laowang
* @version v1.0.0
* @apiNote 读取文件
* @since 2018/4/26 10:39
*/
public static void testRead() throws Exception{
FileSystem hdfs = HDFSUtil.getFileSystem();
//文件名称
Path path = new Path("/test/initNetwork.sh");
//打开文件输入流
FSDataInputStream inputStream = hdfs.open(path);
//读取文件到控制台
IOUtils.copyBytes(inputStream,System.out,4096,false);
//关闭流
IOUtils.closeStream(inputStream);
}

读取文件

 /**
* @author laowang
* @version v1.0.0
* @apiNote 查看目录
* @since 2018/4/26 14:29
*/
public static void testList() throws Exception{
FileSystem fileSystem=HDFSUtil.getFileSystem();
Path path = new Path("/test/");
FileStatus[] fileStatuses = hdfs.listStatus(path);
for(FileStatus fileStatus : fileStatuses){
Path p = fileStatus.getPath();
String info = fileStatus.isDirectory() ? "目录" : "文件";
System.out.println(info + ": " + p);
}
}

查看目录

  4 在hadoop fs中新建文件,并写入

 /**
* 创建文件
* @throws Exception
*/
public static void testDirectory() throws Exception {
FileSystem fileSystem = HDFSUtil.getFileSystem();
Path path = new Path("/test/laowang");
boolean mkdirs = hdfs.mkdirs(path);
System.out.println("创建:" + (mkdirs ? "成功" : "失败"));
}

创建文件

  /**
* 创建文件并写入内容
* @throws Exception
*/
public static void testCreate() throws Exception{
Path path = new Path("/test/test.txt");
//创建文件
FSDataOutputStream outputStream = hdfs.create(path);
//写入内容
outputStream.writeUTF("hello hadoop!");
IOUtils.closeStream(outputStream);
}

创建文件并写入内容

  5 重命名文件

     /**
* 重命名
*/
public static void testRename() throws Exception{
//原路径
Path srcPath = new Path("/test/test.txt");
//目标路径
Path targetPath = new Path("/test/test2.txt");
boolean rename = hdfs.rename(srcPath, targetPath);
System.out.println("重命名:" + (rename ? "成功" : "失败"));
}

重命名

  6 删除hadoop fs上的文件

   /**
* 删除
*/
public static void testDelete() throws Exception {
Path path = new Path("/test/test2.txt");
boolean b = hdfs.deleteOnExit(path);
System.out.println("删除:" + (b ? "成功" : "失败"));
}

删除

HDFS信息

  1 查找某个文件在HDFS集群中的位置

     /**
* @author laowang
* @version v1.0.0
* @apiNote 查找某个文件在HDFS中的位置
* @since 2018/4/26 15:31
*/
public static void testLocation() throws Exception{
Path path = new Path("/test/port.txt");
FileStatus fileStatus = hdfs.getFileStatus(path);
BlockLocation[] fileBlockLocations = hdfs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
for(BlockLocation blockLocation : fileBlockLocations){
String[] hosts=blockLocation.getHosts();
for (String host : hosts) {
System.out.println("端口:" + host);
}
}
}

查找某个文件在HDFS中的位置

  2 获取HDFS集群上所有节点名称信息

     /**
* @author laowang
* @version v1.0.0
* @apiNote 获取HDFS集群上所有节点名称信息
* @since 2018/4/26 15:38
*/
public static void testCluster() throws Exception {
DistributedFileSystem distributedFileSystem = (DistributedFileSystem) hdfs;
DatanodeInfo[] dataNodeStats = distributedFileSystem.getDataNodeStats();
for (DatanodeInfo datanodeInfo : dataNodeStats) {
System.out.println(datanodeInfo.getHostName());
}
}

获取HDFS集群上所有节点名称信息

hadoop学习笔记(七):Java HDFS API的更多相关文章

  1. Hadoop学习笔记一(HDFS架构)

    介绍 Hadoop分布式文件系统(HDFS)设计的运行环境是商用的硬件系统.他和现存的其他分布式文件系统存在很多相似点.不过HDFS和其他分布式文件系统的区别才是他的最大亮点,HDFS具有高容错的特性 ...

  2. Java基础学习笔记七 Java基础语法之继承和抽象类

    继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工, ...

  3. Hadoop学习笔记之五:HDFS功能逻辑(1)

    Block Report DataNode会周期性(默认1小时)将自身节点全部block信息发送给NameNode,以让NameNode正确确维护block信息. 在Block Report的数据源D ...

  4. Hadoop学习笔记之四:HDFS客户端

    HDFS的客户端核心是DFSClient类,所有使用HDFS的客户端都会持有一个DFSClient对象,或通过持有一个DistributedFileSystem对象间接使用DFSClient: DFS ...

  5. Java 学习笔记 (七) Java 参数

    head first java page 74 实参: argument 形参: parameter 方法会运用形参, 调用的一方会传入实参. 实参是传给方法的值.当它传入方法后就成了形参, 参数跟局 ...

  6. Hadoop学习笔记之六:HDFS功能逻辑(2)

    Lease(租约) HDFS(及大多数分布式文件系统)不支持文件并发写,Lease是HDFS用于保证唯一写的手段. Lease可以看做是一把带时间限制的写锁,仅持有写锁的客户端可以写文件. 租约的有效 ...

  7. Java学习笔记七:Java的流程控制语句之switch

    Java条件语句之 switch 当需要对选项进行等值判断时,使用 switch 语句更加简洁明了.例如:根据考试分数,给予前四名不同的奖品.第一名,奖励笔记本一台:第二名,奖励 IPAD 2 一个: ...

  8. hadoop学习笔记(四):HDFS文件权限,安全模式,以及整体注意点总结

    本文原创,转载注明作者和原文链接! 一:总结注意点: 到现在为止学习到的角色:三个NameNode.SecondaryNameNode.DataNode 1.存储的是每一个文件分割存储之后的元数据信息 ...

  9. Java IO学习笔记七:多路复用从单线程到多线程

    作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...

  10. Hadoop学习笔记—22.Hadoop2.x环境搭建与配置

    自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我的一个博文系列<Hadoop学习笔 ...

随机推荐

  1. 项目笔记---WPF之Metro风格UI

    写在前面 作为新年开篇的文章,当然要选择比较“Cool”的东西来分享,这自然落到了WPF身上,WPF技术自身可塑性非常强,其强大的绘图技术以及XAML技术比WinForm而言有本质的飞跃. 切入正题, ...

  2. C# 多线程 弹出模态MessageBox的一种方法

    在多线程中,有时候使用MessageBox.Show方法弹出对话框,弹出的Messagebox不是模态的,不能满足我的要求.经过研究,如下实现 private void button1_Click(o ...

  3. 毕业回馈-89C51之数码管的使用

    7段码的数码管由7个LED等共同组成,根据公共端的不同有共阴和共阳之分.现在很多数码管在7段码的基础上加了一个.即dp,其内部结构如下图所示: 公共端为LED灯的阴极,所以为共阴极接法: 公共端为阳极 ...

  4. JS 中的数据类型转换

    转成字符串 String 1. 使用 toString方法 这种方法可以将 number, boolean, object,array,function 转化为字符串,但是无法转换 null, und ...

  5. 四两拨千斤式的攻击!如何应对Memcache服务器漏洞所带来的DDoS攻击?

    本文由  网易云发布. 近日,媒体曝光Memcache服务器一个漏洞,犯罪分子可利用Memcache服务器通过非常少的计算资源发动超大规模的DDoS攻击.该漏洞是Memcache开发人员对UDP协议支 ...

  6. day 76 滑动窗口 ,头像上传

    一.上传文件 前端html <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  7. Android-------------fragment的学习

    一.fragment的静态使用 1.使用步骤:    a.继承fragment   重写onCreatevVew()的回调方法 b.设置Fragment的布局 c.在Activity中声明Fragme ...

  8. Python3.5 学习八 附加知识点 paramiko和rsa非对称秘钥的适用

    关于paramiko: SSH SFTP 机器上没有安装该模块,只是初步了解了下,没有细细研究. 可能以后只有做运维的才能用到的吧 利用秘钥,在ssh中不输入用户名密码进行登录 利用秘钥进行FTP操作 ...

  9. 系统可能不会保存你所做的修改 onbeforeunload

    网上找了好多实现这个的方法,说的还是不明白.害得我(我自己的原因)以为是需要在服务器环境下才能跑通 window.onbeforeunload; 后来猜想是不是函数返回值发生变化就会触发. <! ...

  10. (转) mysql之status和variables区别及用法详解

    原文:http://blog.csdn.net/andyzhaojianhui/article/details/50052117