HDFS文件系统的JAVA-API操作(一)
使用java.net.URL访问HDFS文件系统
HDFS的API使用说明:
1.如果要访问HDFS,HDFS客户端必须有一份HDFS的配置文件
也就是hdfs-site.xml,从而读取Namenode的信息。
2.每个应用程序也必须拥有访问Hadoop程序的jar文件
3.操作HDFS,也就是HDFS的读和写,最常用的类FileSystem
实例1:使用java.net.URL访问HDFS文件系统
/**
* 操作:显示HDFS文件夹中的文件内容
* 1.使用java.net.URL对象打开数据流
* 2.使用静态代码块使得java程序识别Hadoop的HDFS url
*/
操作代码如下:
package TestHdfs;
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
/**
* @author SimonsZhao
* HDFS的API使用
* 1.如果要访问HDFS,HDFS客户端必须有一份HDFS的配置文件
* 也就是hdfs-site.xml,从而读取Namenode的信息。
* 2.每个应用程序也必须拥有访问Hadoop程序的jar文件
* 3.操作HDFS,也就是HDFS的读和写,最常用的类FileSystem
* 操作:显示HDFS文件夹中的文件内容
* 1.使用java.net.URL对象打开数据流
* 2.使用静态代码块使得java程序识别Hadoop的HDFS url
*/
public class MyCat {
static{
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) {
InputStream input=null;
try {
input = new URL(args[0]).openStream();
IOUtils.copyBytes(input,System.out,4096,false);
} catch (Exception e) {
System.err.println("Error");
}finally{
IOUtils.closeStream(input);
}
}
}
0.打包程序并长传到Linux中
a.通过export导出文件jar包


b.选择jar包存放路径


c.指定主类


d.通过SecureCRT上传jar包至Linux中的指定文件夹下。

1.在指定文件夹下创建示例文件demo
[root@neusoft-master filecontent]# vi demo

2.上传文件至HDFS的data目录,data目录需要首先创建。
[root@neusoft-master filecontent]# hadoop dfs -put demo /data/

3.查看是否上传成功
[root@neusoft-master filecontent]# hadoop dfs -ls /data/

4.将已经打包好的jar文件上传至linux并切换到相应文件夹运行hadoop命令执行
从结果可以看出能够显示出来demo文件的内容
[root@neusoft-master filecontent]# hadoop jar MyCat.jar hdfs://neusoft-master:9000/data/demo

实例2:使用FileSystem访问HDFS文件系统
/**
*操作:将本地文件系统的文件通过java-API写入到HDFS文件
*/
1.本地文件系统和HDFS中应该首先创建指定的目录
linux中创建文件命令:mkdir test
HDFS中创建文件夹命令:hadoop dfs -mkdir /data/
String source="/usr/local/filecontent/demo";//linux中的文件路徑,demo存在一定数据,这里存储了一行英语句子,如welcome to.....
String destination="hdfs://neusoft-master:9000/data/test";//HDFS的路徑
2.程序源代码
package TestHdfs; import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils; /**
* @author SimonsZhao
*将本地文件系统的文件通过java-API写入到HDFS文件
*/
public class FileCopyFromLocal {
public static void main(String[] args) throws Exception {
String source="/usr/local/filecontent/demo";//linux中的文件路徑,demo存在一定数据
String destination="hdfs://neusoft-master:9000/data/test";//HDFS的路徑
InputStream in = new BufferedInputStream(new FileInputStream(source));
//HDFS读写的配置文件
Configuration conf = new Configuration();
//调用Filesystem的create方法返回的是FSDataOutputStream对象
//该对象不允许在文件中定位,因为HDFS只允许一个已打开的文件顺序写入或追加
FileSystem fs = FileSystem.get(URI.create(destination),conf);
OutputStream out = fs.create(new Path(destination));
IOUtils.copyBytes(in, out, 4096, true);
}
}
3.程序打包并传至linux文件系统中
请参考实例1的打包过程
4.程序运行及结果分析
a.查看指定jar包是否成功上传,在linux中使用ls或ll命令
b.执行jar命令
[root@neusoft-master filecontent]# hadoop jar FileSystemDemoCat.jar

c.结果显示welcome to....说明操作正确
实例3:创建HDFS目录
* 创建HDFS目录
* 实例:HDFS创建test2目录
1.明确在HDFS文件系统中创建目录的具体地址,在程序中通过args[0]参数提供用户输入,如
hdfs://neusoft-master:9000/data/test2
2.程序源代码
package TestHdfs;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/**
* @author SimonsZhao
* 创建HDFS目录
* 实例:HDFS创建test2目录
* hadoop jar CreateDir.jar hdfs://neusoft-master:9000/data/test2
*/
public class CreateDirction {
public static void main(String[] args) {
//HDFS路径:hdfs://neusoft-master:9000/data/test2
String uri=args[0];//从键盘输入路径参数
Configuration conf = new Configuration();
try {
FileSystem fs = FileSystem.get(new URI(uri),conf);
Path dfs = new Path(uri);
fs.mkdirs(dfs);
} catch (Exception e) {
e.printStackTrace();
}finally{
System.out.println("SUCESS");
}
}
}
3.将jar包上传到Linux
请参考第一个程序的导出jar包的过程。
4.程序运行及结果分析
[root@neusoft-master filecontent]# hadoop jar CreateDir.jar hdfs://neusoft-master:9000/data/test2

实例4:删除HDFS目录
package TestHdfs;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/**
* @author SimonsZhao
* 删除HDFS上面的文件
*/
public class DeleteFile {
public static void main(String[] args) {
String uri="hdfs://neusoft-master:9000/data/test2";
Configuration conf = new Configuration();
try {
FileSystem fs =FileSystem.get(new URI(uri), conf);
Path f = new Path(uri);
//递归删除文件夹下所有文件
boolean isDelete= fs.delete(f, true);
//递归删除文件夹下所有文件
//boolean isDelete= fs.delete(f, false);
String str=isDelete?"Sucess":"Error";
System.out.println("删除"+str);
} catch (Exception e) {
System.out.println("删除出错~");
}
}
}
3.将jar包上传到Linux
请参考第一个程序的导出jar包的过程。
4.程序运行及结果分析
执行程序之后,通过hadoop dfs -ls / 查看是否成功删除HDFS上面的文件
实例5:查看文件或目录是否存在
package TestHdfs;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/**
* @author SimonsZhao
* 查看文件是否存在
*/
public class CheckFileIsExists {
public static void main(String[] args) {
//String uri="hdfs://neusoft-master:9000/data/test2/";//指定目录
String uri="hdfs://neusoft-master:9000/data/test2/hello";//指定文件
Configuration conf = new Configuration();
try {
FileSystem fs = FileSystem.get(new URI(uri), conf);
Path path = new Path(uri);
boolean isExists=fs.exists(path);
String str=isExists?"Exists":"Not Exists";
System.out.println("指定文件或目录"+str);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.将jar包上传到Linux
请参考第一个程序的导出jar包的过程。
4.程序运行及结果分析
如果在linux中存在该文件的话,则显示如下:
“指定文件或目录Exists”
实例6:列出目录下的文件或目录名称
package TestHdfs;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/**
* @author SimonsZhao
* 列出目录下的文件或目录名称
*/
public class ListFiles {
public static void main(String[] args) {
String uri="hdfs://neusoft-master:9000/data";
Configuration conf = new Configuration();
try {
FileSystem fs=FileSystem.get(new URI(uri), conf);
Path path = new Path(uri);
FileStatus status[] = fs.listStatus(path);
for (int i = 0; i < status.length; i++) {
System.out.println(status[i].getPath().toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.将jar包上传到Linux
请参考第一个程序的导出jar包的过程。
4.程序运行及结果分析

实例7:查看文件存储位置
package TestHdfs;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path; /**
* @author SimonsZhao
* 文件存储的位置
*/
public class LoactionFile {
public static void main(String[] args) {
String uri="hdfs://neusoft-master:9000/data/demo";//hello为文件
Configuration conf = new Configuration();
try {
FileSystem fs=FileSystem.get(new URI(uri), conf);
Path path = new Path(uri);
FileStatus fileStatus = fs.getFileStatus(path);
BlockLocation blkLocation[]=
fs.getFileBlockLocations
(fileStatus, 0, fileStatus.getLen());
for (int i = 0; i < blkLocation.length; i++) {
String[] hosts=blkLocation[i].getHosts();
System.out.println("block_"+i+"_Location:"+hosts[0]);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.将jar包上传到Linux
请参考第一个程序的导出jar包的过程。
4.程序运行及结果分析
由于采用伪分布的环境block块存储均为1,因此这里仅显示1个block块的host主机名
显示:block_0_Location:neusoft-master
实例8:将本地文件写入到HDFS中
package TestHdfs;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils; /**
* @author SimonsZhao
*将本地文件系统的文件通过java-API写入到HDFS文件
*/
public class FileCopyFromLocal {
public static void main(String[] args) throws Exception {
String source="/usr/local/filecontent/demo";//linux中的文件路徑,demo存在一定数据
String destination="hdfs://neusoft-master:9000/data/test";//HDFS的路徑
InputStream in = new BufferedInputStream(new FileInputStream(source));
//HDFS读写的配置文件
Configuration conf = new Configuration();
//调用Filesystem的create方法返回的是FSDataOutputStream对象
//该对象不允许在文件中定位,因为HDFS只允许一个已打开的文件顺序写入或追加
FileSystem fs = FileSystem.get(URI.create(destination),conf);
OutputStream out = fs.create(new Path(destination));
IOUtils.copyBytes(in, out, 4096, true);
}
}
3.将jar包上传到Linux
请参考第一个程序的导出jar包的过程。
4.程序运行及结果分析
将本地的demo文件写入HDFS的data目录下的test文件
HDFS文件系统的JAVA-API操作(一)的更多相关文章
- HDFS 05 - HDFS 常用的 Java API 操作
目录 0 - 配置 Hadoop 环境(Windows系统) 1 - 导入 Maven 依赖 2 - 常用类介绍 3 - 常见 API 操作 3.1 获取文件系统(重要) 3.2 创建目录.写入文件 ...
- HDFS基础和java api操作
1. 概括 适合一次写入多次查询情况,不支持并发写情况 通过hadoop shell 上传的文件存放在DataNode的block中,通过linux shell只能看见block,看不见文件(HDFS ...
- 使用Java API操作HDFS文件系统
使用Junit封装HFDS import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org ...
- Hadoop之HDFS(三)HDFS的JAVA API操作
HDFS的JAVA API操作 HDFS 在生产应用中主要是客户端的开发,其核心步骤是从 HDFS 提供的 api中构造一个 HDFS 的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS ...
- 大数据(5) - HDFS中的常用API操作
一.安装java 二.IntelliJ IDEA(2018)安装和破解与初期配置 参考链接 1.进入官网下载IntelliJ IDEA https://www.jetbrains.com/idea/d ...
- hive-通过Java API操作
通过Java API操作hive,算是测试hive第三种对外接口 测试hive 服务启动 package org.admln.hive; import java.sql.SQLException; i ...
- hadoop2-HBase的Java API操作
Hbase提供了丰富的Java API,以及线程池操作,下面我用线程池来展示一下使用Java API操作Hbase. 项目结构如下: 我使用的Hbase的版本是 hbase-0.98.9-hadoop ...
- Kafka系列三 java API操作
使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...
- MongoDB Java API操作很全的整理
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,一般生产上建议以共享分片的形式来部署. 但是MongoDB官方也提供了其它语言的客户端操作API.如下图所示: 提供了C.C++ ...
- zookeeper的java api操作
zookeeper的java api操作 创建会话: Zookeeper(String connectString,int sessionTimeout,Watcher watcher) Zookee ...
随机推荐
- 马尔科夫链蒙特卡洛(Markov chain Monte Carlo)
(学习这部分内容大约需要1.3小时) 摘要 马尔科夫链蒙特卡洛(Markov chain Monte Carlo, MCMC) 是一类近似采样算法. 它通过一条拥有稳态分布 \(p\) 的马尔科夫链对 ...
- PHP缓存机制详解
一,PHP缓存机制详解 我们可以使用PHP自带的缓存机制来完成页面静态化,但是仅靠PHP自身的缓存机制并不能完美的解决页面静态化,往往需要和其他静态化技术(通常是伪静态技术)结合使用. output ...
- vux (scroller)上拉刷新、下拉加载更多
1)比较关键的地方是要在 scroller 组件上里加一个 ref 属性 <scroller :lockX=true height="-170" :pulldown-conf ...
- CMake设置输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAK ...
- IOS设计模式第八篇之键值观察模式
版权声明:原创作品,谢绝转载!否则将追究法律责任. 键值观察模式: 在KVO,一个对象可以要求被通知当他的某个特殊的属性被改变了.自己或者另一个对象.如果你感兴趣你可以阅读更多的信息参考: Apple ...
- WP8.1学习系列(第五章)——中心控件Hub或透视控件Pivot交互UX
具有主页菜单(中心或透视控件)的中心应用中心 你可能要设计包含许多功能的应用.当你看着这些功能时,可能会决定将它们整理到独立的区域中.这些区域最终会成为用户要访问的应用的独立部分.你需要设计一个简便的 ...
- 【Nginx】服务器中HTTP 301跳转到带www的域名的方法
从nginx的官方文档 documentation, 正确的nginx https 301跳转到带www域名方法的方法如下: HTTP 301跳转到带www域名方法 需要两个server段. serv ...
- 【2014年12月6日】HR交流会
今天的交流会感觉还是不错,体会到了一些东西,把它记下来. 想到什么写什么,可能没什么条理. 1.先选行业,再选职业,再选公司 根据自己的兴趣以及个人特长,能力等方面,需要定一个大概的方向,然后根据方向 ...
- Git学习之Git 暂存区
============================= 修改文件后是否可以直接提交 ============================ (1) 向文件中追加一行内容 $ echo &quo ...
- echarts - 树图实现四个层级
我相信很多人和我一样,制作echats图标时,都会先去demo官网找相同的或者近似的效果,然后再此基础上改进成我们想要的那个. 但是近期混迹某微信群时,我看到一个群友抛出问题说,echarts画树状图 ...