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();
}

参考资料

Hadoop 之 HDFS API操作的更多相关文章

  1. Hadoop之HDFS文件操作常有两种方式(转载)

    摘要:Hadoop之HDFS文件操作常有两种方式,命令行方式和JavaAPI方式.本文介绍如何利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件    命令行     Java API HD ...

  2. Hadoop之HDFS文件操作

    摘要:Hadoop之HDFS文件操作常有两种方式.命令行方式和JavaAPI方式.本文介绍怎样利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件    命令行     Java API HD ...

  3. Hadoop学习记录(3)|HDFS API 操作|RPC调用

    HDFS的API操作 URL方式访问 package hdfs; import java.io.IOException; import java.io.InputStream; import java ...

  4. hadoop的hdfs文件操作实现上传文件到hdfs

    这篇文章主要介绍了使用hadoop的API对HDFS上的文件访问,其中包括上传文件到HDFS上.从HDFS上下载文件和删除HDFS上的文件,需要的朋友可以参考下hdfs文件操作操作示例,包括上传文件到 ...

  5. Hadoop JAVA HDFS客户端操作

    JAVA HDFS客户端操作 通过API操作HDFS org.apache.logging.log4jlog4j-core2.8.2org.apache.hadoophadoop-common${ha ...

  6. HDFS API操作实践

    本文提供几个简单的实例,来说明如何使用hadoop的java API针对HDFS进行文件上传.创建.重命名.删除操作 本文地址:http://www.cnblogs.com/archimedes/p/ ...

  7. Hadoop之HDFS客户端操作

    1. HDFS 客户端环境准备 1.1 windows 平台搭建 hadoop 2.8.5 2. 创建Maven工程 # pom.xml <dependencies> <depend ...

  8. HDFS api操作

    import java.net.URI;import java.util.Iterator;import java.util.Map.Entry; import org.apache.hadoop.c ...

  9. Java 封装 HDFS API 操作

    代码下载地址:点击下载 一:环境介绍 hadoop:2.6 Ubuntu:15.10 eclipse:3.8.1 二:操作包含 推断某个目录是否存在              isExist(fold ...

随机推荐

  1. 1、python--第一天练习题

    #1.使用while循环输入 1 2 3 4 5 6 8 9 10 k = 0 while k < 10: k += 1 if k == 7: continue print(k) #2.求1-1 ...

  2. word文档如何选择全部图片粘贴

    很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...

  3. leetcode解题报告(12):Maximum Subarray

    描述 Find the contiguous subarray within an array (containing at least one number) which has the large ...

  4. 一些特殊的矩阵快速幂 hdu5950 hdu3369 hdu 3483

    思想启发来自, 罗博士的根据递推公式构造系数矩阵用于快速幂 对于矩阵乘法和矩阵快速幂就不多重复了,网上很多博客都有讲解.主要来学习一下系数矩阵的构造 一开始,最一般的矩阵快速幂,要斐波那契数列Fn=F ...

  5. fiddler在小米8下抓取https数据包.

    问题,在小米8下一直报 证书链问题,爬了半天帖子发现可能是Android版本问题,有的说用Charles没问题. 没有测试,网上接着爬帖子... 稍稍说下导入证书的问题吧. 可以使用浏览器下载证书,也 ...

  6. 测试的Python、 Java语言之争

    现在测试行业如果不会开发语言的话是很难找到工作的,即使是一些功能测试的岗位也会要求代码语言作为技术储备,因为如果做自动化测试或者测试工具脚本开发或者接口测试等都离不开开发语言,那作为测试如果没有代码经 ...

  7. jvm方法栈

    调用栈 先入后出 栈是一个只有一个口的容器,先进入栈的会落到栈底,出栈的时候最后出.最后进入栈的,在栈顶,出栈时先出. 方法调用时,需要在内存中开辟一块存储空间做为线程栈空间 每个线程都由自己的栈 调 ...

  8. Clock Generator PLL with Integrated VCO_ADF4360-9

    Clock Generator PLL with Integrated VCO_ADF4360-9     2和3之间需要有大于15ms的时间间隔

  9. Facebook币Libra学习-3.小试牛刀第一笔交易

    我们提供了一个命令行界面(CLI)客户端来与区块链进行交互. 假设 本文档中的所有命令均假定: 您运行的是Linux(基于Red Hat或Debian)或macOS系统. 您可以稳定地连接到互联网. ...

  10. SQL-W3School-基础:SQL INSERT INTO 语句

    ylbtech-SQL-W3School-基础:SQL INSERT INTO 语句 1.返回顶部 1. INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法 IN ...