经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 大数据/云/AI » Hadoop » 查看文章
Hadoop系列007-HDFS客户端操作
来源:cnblogs  作者:云端笑猿  时间:2018/12/11 9:12:07  对本文有异议

title: Hadoop系列007-HDFS客户端操作
date: 2018-12-6 15:52:55
updated: 2018-12-6 15:52:55
categories: Hadoop
tags: [Hadoop,HDFS,HDFS客户端]


本人微信公众号,欢迎扫码关注!

HDFS客户端操作

1 环境准备

1.1 Jar包准备

1)解压hadoop-2.7.2.tar.gz到非中文目录

注意1:如果使用WinRAR解压报错的话,就使用超级管理员权限打开DOS窗口,然后cd到解压包所在位置,执行start winrar x -y xxx.tar.gz命令,即可成功

注意2:使用对应平台下编译后的hadoop源码包,即win7系统使用在win7下编译后的源码包,win10同理。

2)进入share文件夹,查找所有jar包,并把jar包拷贝到_lib文件夹下

3)在全部jar包中查找.source.jar,并剪切到_source文件夹。

4)在全部jar包中查找tests.jar,并剪切到_test文件夹。

1.2 IDEA准备

1)配置HADOOP_HOME环境变量

2)建立工程并且添加依赖

注意:Eclipse全选Jar包右键Add Build Path

3)编写代码测试

4)执行程序

客户端去操作hdfs时,是有一个用户身份的。默认情况下,hdfs客户端api会从jvm中获取一个参数来作为自己的用户身份:-DHADOOP_USER_NAME=atguigu,atguigu为用户名称。

5)验证

2 通过API操作HDFS

2.1 HDFS获取文件系统
  1. @Test
  2. public void getFileSystem() {
  3. // 1 创建配置对象
  4. Configuration conf = new Configuration();
  5. // 2 获取文件系统
  6. FileSystem fs = null;
  7. try {
  8. fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), conf, "intflag");
  9. // 3 打印文件系统
  10. System.out.println(fs);
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. } catch (URISyntaxException e) {
  16. e.printStackTrace();
  17. } finally {
  18. if (fs != null) {
  19. try {
  20. fs.close();
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }
  26. }

2.2 HDFS文件上传
  1. @Test
  2. public void putFileToHDFS() {
  3. // 1 获取文件系统
  4. FileSystem fs = getFileSystem();
  5. // 2 上传文件
  6. try {
  7. fs.copyFromLocalFile(true,new Path("D:/test/x3.000"), new Path("/user/intflag/input/x3.000"));
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. } finally {
  11. // 3 关闭资源
  12. closeFileSystem(fs);
  13. }
  14. }
2.3 HDFS文件下载
  1. @Test
  2. public void getFileFromHDFS() {
  3. // 1 获取文件系统
  4. FileSystem fs = getFileSystem();
  5. // 2 下载文件
  6. try {
  7. fs.copyToLocalFile(new Path("/user/intflag/input/x3.000"),new Path("D:/test/x3.000"));
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. } finally {
  11. // 3 关闭资源
  12. closeFileSystem(fs);
  13. }
  14. }
2.4 HDFS目录创建
  1. /**
  2. * 在HDFS上创建文件夹
  3. */
  4. @Test
  5. public void mkdirAtHDFS() {
  6. // 1 获取文件系统
  7. FileSystem fs = getFileSystem();
  8. // 2 创建文件夹
  9. try {
  10. fs.mkdirs(new Path("/user/intflag/test"));
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. } finally {
  14. // 3 关闭资源
  15. closeFileSystem(fs);
  16. }
  17. }
2.5 HDFS文件夹删除
  1. /**
  2. * 删除HDFS上的文件夹
  3. */
  4. @Test
  5. public void deleteDirAtHDFS() {
  6. // 1 获取文件系统
  7. FileSystem fs = getFileSystem();
  8. // 2 删除文件夹
  9. try {
  10. //fs.delete(new Path("/user/intflag/test"));
  11. fs.delete(new Path("/user/intflag/test"),true);
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. } finally {
  15. // 3 关闭资源
  16. closeFileSystem(fs);
  17. }
  18. }
2.6 HDFS文件名更改
  1. /**
  2. * 重命名HDFS上的文件夹
  3. */
  4. @Test
  5. public void renameDirAtHDFS() {
  6. // 1 获取文件系统
  7. FileSystem fs = getFileSystem();
  8. // 2 重命名文件夹
  9. try {
  10. fs.rename(new Path("/user/intflag/test"), new Path("/user/intflag/test22"));
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. } finally {
  14. // 3 关闭资源
  15. closeFileSystem(fs);
  16. }
  17. }
2.7 HDFS文件详情查看
  1. /**
  2. * 读取HDFS上的文件信息
  3. */
  4. @Test
  5. public void readFileAtHDFS() {
  6. // 1 获取文件系统
  7. FileSystem fs = getFileSystem();
  8. // 2 读取文件信息
  9. try {
  10. RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
  11. while (listFiles.hasNext()) {
  12. LocatedFileStatus status = listFiles.next();
  13. System.out.println("-----------------------------------");
  14. System.out.println("文件名称:"+status.getPath().getName());
  15. System.out.println("块的大小:"+status.getBlockSize());
  16. System.out.println("内容长度:"+status.getLen());
  17. System.out.println("文件权限:"+status.getPermission());
  18. }
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. } finally {
  22. // 3 关闭资源
  23. closeFileSystem(fs);
  24. }
  25. }
  1. -----------------------------------
  2. 文件名称:asd.txt
  3. 块的大小:134217728
  4. 内容长度:34
  5. 文件权限:rw-r--r--
  6. -----------------------------------
  7. 文件名称:hadoop-2.7.2.tar.gz
  8. 块的大小:134217728
  9. 内容长度:197657687
  10. 文件权限:rw-r--r--
  11. -----------------------------------
  12. 文件名称:liugx.txt
  13. 块的大小:134217728
  14. 内容长度:64
  15. 文件权限:rw-r--r--
  16. -----------------------------------
  17. 文件名称:x3.000
  18. 块的大小:134217728
  19. 内容长度:592
  20. 文件权限:rw-r--r--
  21. Process finished with exit code 0
2.8 HDFS文件夹查看
  1. /**
  2. * 读取文件夹信息
  3. */
  4. @Test
  5. public void readFfolderAtHDFS() {
  6. // 1 获取文件系统
  7. FileSystem fs = getFileSystem();
  8. // 2 读取文件夹信息
  9. try {
  10. FileStatus[] listStatus = fs.listStatus(new Path("/user/intflag/"));
  11. for (FileStatus status : listStatus) {
  12. if (status.isFile()) {
  13. System.out.println("f----"+status.getPath().getName());
  14. } else {
  15. System.out.println("d----"+status.getPath().getName());
  16. }
  17. }
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. } finally {
  21. // 3 关闭资源
  22. closeFileSystem(fs);
  23. }
  24. }

3 通过IO流操作HDFS

3.1 HDFS文件上传
  1. /**
  2. * 文件上传到HDFS
  3. */
  4. @Test
  5. public void putFileToHDFS() {
  6. // 1 获取HDFS
  7. FileSystem fs = getFileSystem();
  8. try {
  9. // 2 获取输出流
  10. FSDataOutputStream fos = fs.create(new Path("/user/intflag/input/x3.000"));
  11. // 3 获取输入流
  12. FileInputStream fis = new FileInputStream(new File("D:/test/x3.000"));
  13. // 4 流对接
  14. IOUtils.copyBytes(fis, fos, new Configuration());
  15. // 5 关闭流
  16. IOUtils.closeStream(fis);
  17. IOUtils.closeStream(fos);
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. } finally {
  21. // 5 关闭资源
  22. closeFileSystem(fs);
  23. }
  24. }
3.2 HDFS文件下载
  1. /**
  2. * 下载文件
  3. */
  4. @Test
  5. public void getFileFromHDFS() {
  6. // 1 获取HDFS
  7. FileSystem fs = getFileSystem();
  8. try {
  9. // 2 获取输入流
  10. FSDataInputStream fis = fs.open(new Path("/user/intflag/input/liugx.txt"));
  11. // 3 获取输出流
  12. FileOutputStream fos = new FileOutputStream(new File("D:/test/liugx.txt"));
  13. // 4 流对接
  14. IOUtils.copyBytes(fis, fos, new Configuration());
  15. // 5 关闭流
  16. IOUtils.closeStream(fis);
  17. IOUtils.closeStream(fos);
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. } finally {
  21. // 5 关闭资源
  22. closeFileSystem(fs);
  23. }
  24. }
3.3 定位文件读取

下载第一块

  1. /**
  2. * 下载大文件-下载第一块
  3. */
  4. @Test
  5. public void getFileFromHDFSSeek1() {
  6. // 1 获取HDFS
  7. FileSystem fs = getFileSystem();
  8. try {
  9. // 2 获取输入流
  10. FSDataInputStream fis = fs.open(new Path("/user/intflag/input/hadoop-2.7.2.tar.gz"));
  11. // 3 获取输出流
  12. FileOutputStream fos = new FileOutputStream(new File("D:/test/hadoop-2.7.2.tar.gz.part1"));
  13. // 4 流对接(只读取128m)
  14. byte[] buff = new byte[1024];
  15. //1024 * 1024 * 128
  16. int len = 1024 * 128;
  17. for (int i = 0; i < len; i++) {
  18. fis.read(buff);
  19. fos.write(buff);
  20. }
  21. // 5 关闭流
  22. IOUtils.closeStream(fis);
  23. IOUtils.closeStream(fos);
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. } finally {
  27. // 5 关闭资源
  28. closeFileSystem(fs);
  29. }
  30. }

下载第二块

  1. /**
  2. * 下载大文件-下载第二块
  3. */
  4. @Test
  5. public void getFileFromHDFSSeek2() {
  6. // 1 获取HDFS
  7. FileSystem fs = getFileSystem();
  8. try {
  9. // 2 获取输入流
  10. FSDataInputStream fis = fs.open(new Path("/user/intflag/input/hadoop-2.7.2.tar.gz"));
  11. // 3 获取输出流
  12. FileOutputStream fos = new FileOutputStream(new File("D:/test/hadoop-2.7.2.tar.gz.part2"));
  13. // 4 流对接(只读取128m)
  14. // 定位到128m
  15. int len = 1024 * 1024 * 128;
  16. fis.seek(len);
  17. IOUtils.copyBytes(fis,fos,new Configuration());
  18. // 5 关闭流
  19. IOUtils.closeStream(fis);
  20. IOUtils.closeStream(fos);
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. } finally {
  24. // 5 关闭资源
  25. closeFileSystem(fs);
  26. }
  27. }

合并文件

  1. 打开DOS窗口,定位到下载后的位置,输入以下命令合并文件
  2. type hadoop-2.7.2.tar.gz.part2 >> hadoop-2.7.2.tar.gz.part1
  3. 然后重命名文件hadoop-2.7.2.tar.gz.part1,将文件.part1去掉
  4. 打开文件验证
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号