设为首页 收藏本站
查看: 1249|回复: 0

[经验分享] Hadoop HDFS Java API

[复制链接]

尚未签到

发表于 2018-10-28 14:06:44 | 显示全部楼层 |阅读模式
package com.uplooking.bigdata.hdfs;  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.fs.*;
  import org.apache.hadoop.fs.permission.FsPermission;
  import org.apache.hadoop.io.IOUtils;
  import org.junit.After;
  import org.junit.Before;
  import org.junit.Test;
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.net.URI;
  import java.text.DateFormat;
  import java.text.SimpleDateFormat;
  import java.util.Date;
  /**
  * 列出目录的内容:listStatus
  * 读取文件:open
  * 创建目录:mkdirs
  * 创建文件:create
  * 删除文件或目录:delete
  * 显示文件存储位置:getFileBlockLocations
  */

  public>  private FileSystem fs;
  private DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
  /**
  * 初始化资源
  * @throws Exception
  */
  @Before
  public void setUp() throws Exception {
  URI uri = new URI("hdfs://uplooking01:9000");
  Configuration configuration = new Configuration();
  fs = FileSystem.get(uri, configuration);
  }
  /**
  * 列出目录的内容:listStatus
  * 模仿:
  * $ hdfs dfs -ls /
  * -rw-r--r--   1 uplooking supergroup         28 2018-02-28 12:29 /hello
  * drwxr-xr-x   - uplooking supergroup          0 2018-02-28 12:31 /output
  * drwx------   - uplooking supergroup          0 2018-02-28 12:31 /tmp
  *
  * @throws IOException
  */
  @Test
  public void testList() throws IOException {
  FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
  for (FileStatus fileStatus : fileStatuses) {
  // 先定义好需要判断才能确定的项
  String prefix = "d";
  String repliaction = "-";
  // 获取文件类型
  if (fileStatus.isFile()) {
  prefix = "-";
  }
  // 获取权限列表
  FsPermission permission = fileStatus.getPermission();
  String uacl = permission.getUserAction().SYMBOL;
  String gacl = permission.getGroupAction().SYMBOL;
  String oacl = permission.getOtherAction().SYMBOL;
  String acl = uacl + gacl + oacl;
  // 获取复制因子数
  if (fileStatus.isFile()) {
  repliaction = fileStatus.getReplication() + "";
  }
  // 获取文件属主
  String owner = fileStatus.getOwner();
  // 获取文件属组
  String group = fileStatus.getGroup();
  // 获取文件大小
  long len = fileStatus.getLen();
  // 获取文件修改时间
  String mTime = df.format(new Date(fileStatus.getModificationTime()));
  // 获取文件路径
  Path path = fileStatus.getPath();
  // 格式化输出
  System.out.println(prefix + acl + "\t" + repliaction + "\t" + owner + "  " + group + "\t" + mTime + "\t" + path);
  }
  }
  /**
  * 读取文件:open
  *
  * @throws IOException
  */
  @Test
  public void testOpen() throws IOException {
  FSDataInputStream fis = fs.open(new Path("hdfs://uplooking01:9000/hello"));
  // 方式1:
  /* byte[] bytes = new byte[1024];
  int len = 0;
  while ((len = fis.read(bytes)) != -1) {
  System.out.println(new String(bytes, 0, len));
  }
  fis.close();*/
  // 方式2:
  /*BufferedReader br = new BufferedReader(new InputStreamReader(fis));
  String line = null;
  while ((line = br.readLine()) != null) {
  System.out.println(line);
  }
  fis.close();*/
  // 方式3:
  IOUtils.copyBytes(fis, System.out, 1024, false);
  }
  /**
  * 创建目录:mkdirs
  *
  * @throws IOException
  */
  @Test
  public void testMkdir() throws IOException {
  boolean ret = fs.mkdirs(new Path("/input/hdfs"));
  System.out.println(ret ? "创建目录成功" : "创建目录失败");
  }
  /**
  * 创建文件:create
  *
  * @throws IOException
  */
  @Test
  public void testCreate() throws IOException {
  // 第二个参数为是否覆盖,Files are overwritten by default
  FSDataOutputStream fos = fs.create(new Path("/input/hdfs/word.txt"), false);
  fos.write("hello\n".getBytes());
  fos.write("xpleaf\n".getBytes());
  fos.close();
  }
  /**
  * 删除文件或目录:delete
  *
  * @throws IOException
  */
  @Test
  public void testDelete() throws IOException {
  // 第二个参数为是否递归删除(当删除目录时)
  boolean ret = fs.delete(new Path("/input/hdfs/word.txt"), false);
  System.out.println(ret ? "删除成功" : "删除失败");
  }
  /**
  * 显示文件存储位置:getFileBlockLocations
  *
  * @throws IOException
  */
  @Test
  public void testLocations() throws IOException {
  Path path = new Path("/hadoop-2.6.4.tar.gz");
  FileStatus fileStatus = fs.getFileStatus(path);
  // 参数分别为:文件路径   偏移起始位置  文件长度
  BlockLocation[] locations = fs.getFileBlockLocations(path, 0, fileStatus.getLen());
  System.out.println(locations);
  for (BlockLocation location : locations) {
  System.out.println(location);
  }
  /**
  * 0,134217728,uplooking01          (偏移量从0开始,大小为128MB的块存储在节点uplooking01上)
  134217728,61798247,uplooking01   (偏移量从128M开始,大小为59M的块(就是剩余大小)存储在节点uplooking01上)
  可以看到,两个块都只存在uplooking01上的,这是因为这里的hadoop环境是伪分布式的
  */
  }
  /**
  * 释放资源
  * @throws IOException
  */
  @After
  public void cleanUp() throws IOException {
  fs.close();
  }
  }


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-627572-1-1.html 上篇帖子: 大数据精英实战项目班-Hadoop-Spark-真实企业项目 下篇帖子: 利用Hadoop提供的RPC API实现简单的RPC程序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表