Hadoop 之 HDFS API操作
1. 文件上传
@Slf4j
public class HDFSClient {
@Test
public void testCopyFromLocalFile() throws Exception{
// 1. 获取fs对象
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://服务器IP地址:9000"), conf, "root");
// 2. 执行上传API
fs.copyFromLocalFile(new Path("D:\\yase.txt"), new Path("/0526/noodles/testUpload.txt"));
// 3.关闭资源
fs.close();
// 4. 程序结束
log.info("文件上传成功!");
}
}
2. 操作过程中遇到的BUG
- "File /0526/noodles/testUpload.txt could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and 1 node(s) are excluded in this operation."
### 将log4j.properties的级别更改为DEBUG
java.net.ConnectException: Connection timed out: no further information
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:531)
at org.apache.hadoop.hdfs.DataStreamer.createSocketForPipeline(DataStreamer.java:259)
at org.apache.hadoop.hdfs.DataStreamer.createBlockOutputStream(DataStreamer.java:1692)
at org.apache.hadoop.hdfs.DataStreamer.nextBlockOutputStream(DataStreamer.java:1648)
at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:704)
- 原因:放置Hadoop的服务器,无法访问DataNode服务
- 可以使用以下语句测试:
telnet 192.168.1.102 8020
- 可以使用以下语句测试:
- 修改方法:
## hdfs-site.xml中配置 或者更换服务器
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:可用端口</value>
</property>
3. 文件下载/文件夹删除/文件重命名
@Slf4j
public class HDFSClient {
@Test
public void testCopyToLocalFile() throws Exception{
// 1. 获取fs对象
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://10.110.147.193:9000"), conf, "root");
// 2. 执行下载操作
// 参数说明:
// 1. boolean delSrc 是否将原文件删除
// 2. Path src 要下载的文件路径
// 3. Path dst 将文件下载到的路径
// 4. boolean useRawLocalFileSystem 是否开启文件校验
fs.copyToLocalFile(false, new Path("/0526/noodles/testUpload.txt"), new Path("D:\\\\download.txt"), true);
// 2.1 文件夹删除
// fs.delete(new Path("/0526/"), true);
// 2.2 文件重命名
// fs.rename(new Path("/0526/noodles/testUpload.txt"), new Path("/0526/noodles/abc.txt"));
// 3.关闭资源
fs.close();
// 4. 程序结束
log.info("文件下载成功!");
}
}
4. 查看文件详情
- 查看文件名称,权限,长度,块信息
@Slf4j
public class HDFSClient {
@Test
public void testListFiles() throws Exception{
// 1. 获取fs对象
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://10.110.147.193:9000"), conf, "root");
// 2. 查看文件详情
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
while(listFiles.hasNext()) {
LocatedFileStatus status = listFiles.next();
// 查看文件名称,权限,长度,块信息
log.info(status.toString());
}
// 3.关闭资源
fs.close();
}
}
5. 判断是文件还是文件夹
@Test
public void testListStatus() throws Exception{
// 1. 获取fs对象
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://10.110.147.193:9000"), conf, "root");
// 2. 判断是文件还是文件夹
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus fileStatus : listStatus) {
// 如果是文件
if (fileStatus.isFile()) {
System.out.println("f:" + fileStatus.getPath().getName());
} else {
System.out.println("d:" + fileStatus.getPath().getName());
}
}
// 3.关闭资源
fs.close();
}
6.文件IO流操作
// 文件上传
@Test
public void testPutFileToHDFS() throws Exception{
// 1. 获取fs对象
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://10.110.147.193:9000"), conf, "root");
// 2. 创建输入流
FileInputStream fis = new FileInputStream(new File("D:\\ddd.txt"));
// 3. 获取输出流
FSDataOutputStream fos = fs.create(new Path("/IOPut.txt"));
// 4.流拷贝
IOUtils.copyBytes(fis, fos, conf);
// 3.关闭资源
IOUtils.closeStream(fos);
IOUtils.closeStream(fis);
fs.close();
}
// 文件下载
@Test
public void testGetFileToHDFS() throws Exception{
// 1. 获取fs对象
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://10.110.147.193:9000"), conf, "root");
// 2. 创建输入流
FSDataInputStream fis = fs.open(new Path("/IOPut.txt"));
// 3. 获取输出流
FileOutputStream fos = new FileOutputStream(new File("D:\\eee.txt"));
// 4.流拷贝
IOUtils.copyBytes(fis, fos, conf);
// 3.关闭资源
IOUtils.closeStream(fos);
IOUtils.closeStream(fis);
fs.close();
}
7. 定位文件读取
- 需求: 分块读取HDFS上的大文件,比如根目录下的
/hadoop-2.8.5.tar.gz;
// 下载第一块
@Test
public void testReadFirstBlock() throws Exception{
// 1. 获取fs对象
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://10.110.147.193:9000"), conf, "root");
// 2. 创建输入流
FSDataInputStream fis = fs.open(new Path("/hadoop-2.8.5.tar.gz"));
// 3. 获取输出流
FileOutputStream fos = new FileOutputStream(new File("D:\\hadoop-2.8.5.tar.gz.part1"));
// 4.流拷贝(只拷贝128M)
byte[] buf = new byte[1024];
for (int i = 0; i < 1024 * 128; i++) {
fis.read(buf);
fos.write(buf);
}
// 3.关闭资源
IOUtils.closeStream(fos);
IOUtils.closeStream(fis);
fs.close();
}
// 下载第二块
@Test
public void testReadSecondBlock() throws Exception{
// 1. 获取fs对象
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://10.110.147.193:9000"), conf, "root");
// 2. 创建输入流
FSDataInputStream fis = fs.open(new Path("/hadoop-2.8.5.tar.gz"));
// 3. 设置指定读取的起点(128M以后)
fis.seek(1024*1024*128);
// 4. 获取输出流
FileOutputStream fos = new FileOutputStream(new File("D:\\hadoop-2.8.5.tar.gz.part2"));
// 5.流拷贝
IOUtils.copyBytes(fis, fos, conf);
// 6.关闭资源
IOUtils.closeStream(fos);
IOUtils.closeStream(fis);
fs.close();
}
参考资料
- Writing to HDFS from Java, getting “could only be replicated to 0 nodes instead of minReplication”
- Could Only Be Replicated To ...
- Hadoop 单节点(或集群)基本配置信息
- hdfs-default.xml
- there-are-0-datanodes-running-and-no-nodes-are-excluded-in-this-operation
Hadoop 之 HDFS API操作的更多相关文章
- Hadoop之HDFS文件操作常有两种方式(转载)
摘要:Hadoop之HDFS文件操作常有两种方式,命令行方式和JavaAPI方式.本文介绍如何利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件 命令行 Java API HD ...
- Hadoop之HDFS文件操作
摘要:Hadoop之HDFS文件操作常有两种方式.命令行方式和JavaAPI方式.本文介绍怎样利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件 命令行 Java API HD ...
- Hadoop学习记录(3)|HDFS API 操作|RPC调用
HDFS的API操作 URL方式访问 package hdfs; import java.io.IOException; import java.io.InputStream; import java ...
- hadoop的hdfs文件操作实现上传文件到hdfs
这篇文章主要介绍了使用hadoop的API对HDFS上的文件访问,其中包括上传文件到HDFS上.从HDFS上下载文件和删除HDFS上的文件,需要的朋友可以参考下hdfs文件操作操作示例,包括上传文件到 ...
- Hadoop JAVA HDFS客户端操作
JAVA HDFS客户端操作 通过API操作HDFS org.apache.logging.log4jlog4j-core2.8.2org.apache.hadoophadoop-common${ha ...
- HDFS API操作实践
本文提供几个简单的实例,来说明如何使用hadoop的java API针对HDFS进行文件上传.创建.重命名.删除操作 本文地址:http://www.cnblogs.com/archimedes/p/ ...
- Hadoop之HDFS客户端操作
1. HDFS 客户端环境准备 1.1 windows 平台搭建 hadoop 2.8.5 2. 创建Maven工程 # pom.xml <dependencies> <depend ...
- HDFS api操作
import java.net.URI;import java.util.Iterator;import java.util.Map.Entry; import org.apache.hadoop.c ...
- Java 封装 HDFS API 操作
代码下载地址:点击下载 一:环境介绍 hadoop:2.6 Ubuntu:15.10 eclipse:3.8.1 二:操作包含 推断某个目录是否存在 isExist(fold ...
随机推荐
- AtCoder Beginner Contest 148
ABC 148 第一次打abc,记录一下 Task Name Time Limit Memory Limit A Round One 2 sec 1024 MB B Strings with the ...
- C++ extern关键字
[参考] 关于C++中extern的简单笔记
- The Preliminary Contest for ICPC Asia Xuzhou 2019 【 题目:so easy】{并查集维护一个数的下一个没有被删掉的数} 补题ING
题意:给[1,n],n个数,有两种操作: 1 x,删去x2 x,查询还未被删去的数中大于等于x的最小的数是多少. input: output: 做法:按照并查集的方法压缩路径 代码: #include ...
- Java核心数据结构(List、Map、Set)原理与使用技巧
JDK提供了一组主要的数据结构实现,如List.Set等常用数据结构.这些数据都继承自java.util.Collection接口,并位于java.util包内. 一.List接口 最重要的三种Lis ...
- Oracle 后台进程(二)DBWR进程
一.DBWR进程介绍 DBWR进程执行将数据块缓冲区写入数据文件的工作,是负责缓冲存储管理的一个Oracle后台进程.在修改DB Cache中的某个缓冲区时,会将它标志为“DIRTY”,DBWR的主要 ...
- python 改变函数实参的值
def change(n): n[] = 'Mr Gumby' names = ['Mrs Entity', 'Mrs. Thing'] change(names) print(names) resu ...
- 【线性代数】6-4:对称矩阵(Symmetric Matrices)
title: [线性代数]6-4:对称矩阵(Symmetric Matrices) categories: Mathematic Linear Algebra keywords: Eigenvalue ...
- Ubuntu18.04安装和配置Django,并实现简单示例
一.前言(系统,django介绍,window.mac.linux简单区别) Django是python开发过程最重要的web框架.因为在看的Django教学视频是在mac下安装的,我自己用的是Lin ...
- MySQL数据分析-(8)SQL基础操作之库操作
前面我们讲了学习SQL的两个逻辑框架,jacky说了这样一个逻辑:库是为了存储表的,所以一定是先有库才有表:同样的道理,有表才有表中的数据,是吧,肯定是这个逻辑:那么,今天jacky就捋着这个逻辑从库 ...
- Apache Flink - 配置依赖,连接器,库
每个Flink程序都依赖于一组Flink库. 1.Flink核心和应用程序依赖项 Flink本身由一组类和运行需要的依赖组成.所有类和依赖的组合形成了Flink运行时的核心,并且当一个Flink程序运 ...