hadoop|hadoop hdfs

hdfs常用命令参数介绍

  • hadoop fs -ls / 显示文件
  • 【hadoop|hadoop hdfs】hadoop fs -mkdir -p /aaa/bbb/cc/dd 在hdfs上创建目录
  • hadoop fs - moveFromLocal /home/hadoop/a.txt /aaa/bbb/cc/dd 从本地剪切粘贴到hdfs
  • hadoop fs - moveToLocal /aaa/bbb/cc/dd /home/hadoop/a.txt 从hdfs剪切粘贴到本地
  • Hadoop fs -appendToFile ./hello.txt /hello.txt 追加一个文件到已经存在的文件末尾
  • hadoop fs -cat /hello.txt 显示文件内容
  • hadoop fs -tail /weblog/access_log.1 显示文件末尾
  • hadoop fs -text /weblog/access_log.1 以字符形式打印一个文件的内容
  • chgrp chmod chown
功能:linux文件系统中的用法一样,对文件所属权限 示例: hadoopfs-chmod666/hello.txt hadoopfs-chownsomeuser:somegrp/hello.txt

  • hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/ 从本地文件系统中拷贝文件到hdfs路径去
  • hadoop fs -copyToLocal /aaa/jdk.tar.gz 从hdfs拷贝到本地
  • hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2 从hdfs的一个路径拷贝hdfs的另一个路径
  • hadoop fs -mv /aaa/jdk.tar.gz / 在hdfs目录中移动文件
  • hadoop fs -get /aaa/jdk.tar.gz 等同于copyToLocal,就是从hdfs下载文件到本地
  • hadoop fs -getmerge /aaa/log.* ./log.sum 合并下载多个文件
  • hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2 等同于copyFromLocal
  • hadoop fs -rm -r /aaa/bbb/ 删除文件或文件夹
  • hadoop fs -rmdir /aaa/bbb/ccc 删除空目录
  • hadoop fs -df -h / 统计文件系统的可用空间信息
  • hadoop fs -du -s -h /aaa/* 统计文件夹的大小信息
  • hadoop fs -count /aaa/ 统计一个指定目录下的文件节点数
  • hadoop fs -setrep 3 /aaa/jdk.tar.gz
hdfs java 操作
  • 搭建开发环境
    org.apache.hadoop hadoop-client 2.6.1

  • window下开发的说明
    建议在linux下进行hadoop应用的开发,不会存在兼容性问题。如在window上做客户端应用开发,需要设置以下环境: A、在windows的某个目录下解压一个hadoop的安装包 B、将安装包下的lib和bin目录用对应windows版本平台编译的本地库替换 C、在window系统中配置HADOOP_HOME指向你解压的安装包 D、在windows系统的path变量中加入hadoop的bin目录

  • java api hdfs 增删改
在java中操作hdfs,首先要获得一个客户端实例 Configuration conf = new Configuration() FileSystem fs = FileSystem.get(conf)

public class HdfsClient {FileSystem fs = null; @Before public void init() throws Exception {// 构造一个配置参数对象,设置一个参数:我们要访问的hdfs的URI // 从而FileSystem.get()方法就知道应该是去构造一个访问hdfs文件系统的客户端,以及hdfs的访问地址 // new Configuration(); 的时候,它就会去加载jar包中的hdfs-default.xml // 然后再加载classpath下的hdfs-site.xml Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://hdp-node01:9000"); /** * 参数优先级: 1、客户端代码中设置的值 2、classpath下的用户自定义配置文件 3、然后是服务器的默认配置 */ conf.set("dfs.replication", "3"); // 获取一个hdfs的访问客户端,根据参数,这个实例应该是DistributedFileSystem的实例 // fs = FileSystem.get(conf); // 如果这样去获取,那conf里面就可以不要配"fs.defaultFS"参数,而且,这个客户端的身份标识已经是hadoop用户 fs = FileSystem.get(new URI("hdfs://hdp-node01:9000"), conf, "hadoop"); }/** * 往hdfs上传文件 * * @throws Exception */ @Test public void testAddFileToHdfs() throws Exception {// 要上传的文件所在的本地路径 Path src = https://www.it610.com/article/new Path("g:/redis-recommend.zip"); // 要上传到hdfs的目标路径 Path dst = new Path("/aaa"); fs.copyFromLocalFile(src, dst); fs.close(); }/** * 从hdfs中复制文件到本地文件系统 * * @throws IOException * @throws IllegalArgumentException */ @Test public void testDownloadFileToLocal() throws IllegalArgumentException, IOException { fs.copyToLocalFile(new Path("/jdk-7u65-linux-i586.tar.gz"), new Path("d:/")); fs.close(); }@Test public void testMkdirAndDeleteAndRename() throws IllegalArgumentException, IOException {// 创建目录 fs.mkdirs(new Path("/a1/b1/c1")); // 删除文件夹 ,如果是非空文件夹,参数2必须给值true fs.delete(new Path("/aaa"), true); // 重命名文件或文件夹 fs.rename(new Path("/a1"), new Path("/a2")); }/** * 查看目录信息,只显示文件 * * @throws IOException * @throws IllegalArgumentException * @throws FileNotFoundException */ @Test public void testListFiles() throws FileNotFoundException, IllegalArgumentException, IOException {// 思考:为什么返回迭代器,而不是List之类的容器 RemoteIterator listFiles = fs.listFiles(new Path("/"), true); while (listFiles.hasNext()) { LocatedFileStatus fileStatus = listFiles.next(); System.out.println(fileStatus.getPath().getName()); System.out.println(fileStatus.getBlockSize()); System.out.println(fileStatus.getPermission()); System.out.println(fileStatus.getLen()); BlockLocation[] blockLocations = fileStatus.getBlockLocations(); for (BlockLocation bl : blockLocations) { System.out.println("block-length:" + bl.getLength() + "--" + "block-offset:" + bl.getOffset()); String[] hosts = bl.getHosts(); for (String host : hosts) { System.out.println(host); } } System.out.println("--------------为angelababy打印的分割线--------------"); } }/** * 查看文件及文件夹信息 * * @throws IOException * @throws IllegalArgumentException * @throws FileNotFoundException */ @Test public void testListAll() throws FileNotFoundException, IllegalArgumentException, IOException {FileStatus[] listStatus = fs.listStatus(new Path("/")); String flag = "d--"; for (FileStatus fstatus : listStatus) { if (fstatus.isFile())flag = "f--"; System.out.println(flag + fstatus.getPath().getName()); } }

}
  • 通过流的方式访问hdfs
/** * 相对那些封装好的方法而言的更底层一些的操作方式 * 上层那些mapreducespark等运算框架,去hdfs中获取数据的时候,就是调的这种底层的api * @author * */ public class StreamAccess {FileSystem fs = null; @Before public void init() throws Exception {Configuration conf = new Configuration(); fs = FileSystem.get(new URI("hdfs://hdp-node01:9000"), conf, "hadoop"); }@Test public void testDownLoadFileToLocal() throws IllegalArgumentException, IOException{//先获取一个文件的输入流----针对hdfs上的 FSDataInputStream in = fs.open(new Path("/jdk-7u65-linux-i586.tar.gz")); //再构造一个文件的输出流----针对本地的 FileOutputStream out = new FileOutputStream(new File("c:/jdk.tar.gz")); //再将输入流中数据传输到输出流 IOUtils.copyBytes(in, out, 4096); }/** * hdfs支持随机定位进行文件读取,而且可以方便地读取指定长度 * 用于上层分布式运算框架并发处理数据 * @throws IllegalArgumentException * @throws IOException */ @Test public void testRandomAccess() throws IllegalArgumentException, IOException{ //先获取一个文件的输入流----针对hdfs上的 FSDataInputStream in = fs.open(new Path("/iloveyou.txt")); //可以将流的起始偏移量进行自定义 in.seek(22); //再构造一个文件的输出流----针对本地的 FileOutputStream out = new FileOutputStream(new File("c:/iloveyou.line.2.txt")); IOUtils.copyBytes(in,out,19L,true); }/** * 显示hdfs上文件的内容 * @throws IOException * @throws IllegalArgumentException */ @Test public void testCat() throws IllegalArgumentException, IOException{FSDataInputStream in = fs.open(new Path("/iloveyou.txt")); IOUtils.copyBytes(in, System.out, 1024); } }

    推荐阅读