HDFS——shell:java
1,lsshell
hadoop fs -ls /apache
列出 hdfs 文件系统根目录下的目录和文件api
hadoop fs -ls -R /安全
列出 hdfs 文件系统全部的目录和文件服务器
2.put框架
hadoop fs -put < local file > < hdfs file >tcp
hdfs file 的父目录必定要存在,不然命令不会执行hadoop fs -put < local file or dir >...< hdfs dir >分布式
hdfs dir 必定要存在,不然命令不会执行hadoop fs -put - < hdsf file>ide
从键盘读取输入到 hdfs file 中,按 Ctrl+D 结束输入,hdfs file 不能存在,不然命令不会执行
2.1.moveFromLocal
hadoop fs -moveFromLocal < local src > ... < hdfs dst >
与 put 相相似,命令执行后源文件 local src 被删除,也能够从从键盘读取输入到 hdfs file 中
2.2.copyFromLocal
hadoop fs -copyFromLocal < local src > ... < hdfs dst >
与 put 相相似,也能够从从键盘读取输入到 hdfs file 中
3.get
hadoop fs -get < hdfs file > < local file or dir>
local file 不能和 hdfs file 名字不能相同,不然会提示文件已存在,没有重名的文件会复制到本地
hadoop fs -get < hdfs file or dir > ... < local dir >
拷贝多个文件或目录到本地时,本地要为文件夹路径
注意:若是用户不是 root, local 路径要为用户文件夹下的路径,不然会出现权限问题,
3.2.copyToLocal
hadoop fs -copyToLocal < local src > ... < hdfs dst >
与 get 相相似
4.rm
hadoop fs -rm < hdfs file > ...
hadoop fs -rm -r < hdfs dir>...
每次能够删除多个文件或目录
5.mkdir
hadoop fs -mkdir < hdfs path>
只能一级一级的建目录,父目录不存在的话使用这个命令会报错
hadoop fs -mkdir -p < hdfs path>
所建立的目录若是父目录不存在就建立该父目录
6.getmerge
hadoop fs -getmerge < hdfs dir > < local file >
将 hdfs 指定目录下全部文件排序后合并到 local 指定的文件中,文件不存在时会自动建立,文件存在时会覆盖里面的内容
hadoop fs -getmerge -nl < hdfs dir > < local file >
加上 nl 后,合并到 local file 中的 hdfs 文件之间会空出一行
7.cp
hadoop fs -cp < hdfs file > < hdfs file >
目标文件不能存在,不然命令不能执行,至关于给文件重命名并保存,源文件还存在
hadoop fs -cp < hdfs file or dir >... < hdfs dir >
目标文件夹要存在,不然命令不能执行
8.mv
hadoop fs -mv < hdfs file > < hdfs file >
目标文件不能存在,不然命令不能执行,至关于给文件重命名并保存,源文件不存在
hadoop fs -mv < hdfs file or dir >... < hdfs dir >
源路径有多个时,目标路径必须为目录,且必须存在。
注意:跨文件系统的移动(local 到 hdfs 或者反过来)都是不容许的
9.count
hadoop fs -count < hdfs path >
统计 hdfs 对应路径下的目录个数,文件个数,文件总计大小
显示为目录个数,文件个数,文件总计大小,输入路径
10.du
hadoop fs -du < hdsf path>
显示 hdfs 对应路径下每一个文件夹和文件的大小
hadoop fs -du -s < hdsf path>
显示 hdfs 对应路径下全部文件和的大小
hadoop fs -du - h < hdsf path>
显示 hdfs 对应路径下每一个文件夹和文件的大小,文件的大小用方便阅读的形式表示,例如用 64M 代替 67108864
11.text
hadoop fs -text < hdsf file>
将文本文件或某些格式的非文本文件经过文本格式输出
12.setrep
hadoop fs -setrep -R 3 < hdfs path >
改变一个文件在 hdfs 中的副本个数,上述命令中数字 3 为所设置的副本个数,-R 选项能够对一我的目录下的全部目录+文件递归执行改变副本个数的操做
13.stat
hdoop fs -stat [format] < hdfs path >
返回对应路径的状态信息
[format]可选参数有:%b(文件大小),%o(Block 大小),%n(文件名),%r(副本个数),%y(最后一次修改日期和时间)
能够这样书写 hadoop fs -stat %b%o%n < hdfs path >,不过不建议,这样每一个字符输出的结果不是太容易分清楚
14.tail
hadoop fs -tail < hdfs file >
在标准输出中显示文件末尾的 1KB 数据
15.archive
hadoop archive -archiveName name.har -p < hdfs parent dir > < src >* < hdfs dst >
命令中参数 name:压缩文件名,本身任意取;< hdfs parent dir > :压缩文件所在的父目录;<src >*:要压缩的文件名;< hdfs dst >:压缩文件存放路径
示例:hadoop archive -archiveName hadoop.har -p /user 1.txt 2.txt /des
示例中将 hdfs 中/user 目录下的文件 1.txt,2.txt 压缩成一个名叫 hadoop.har 的文件存放在 hdfs中/des 目录下,若是 1.txt,2.txt 不写就是将/user 目录下全部的目录和文件压缩成一个名叫hadoop.har 的文件存放在 hdfs 中/des 目录下
显示 har 的内容能够用以下命令:
hadoop fs -ls /des/hadoop.jar
显示 har 压缩的是那些文件能够用以下命令
hadoop fs -ls -R har:///des/hadoop.har
**注意:**har 文件不能进行二次压缩。若是想给.har 加文件,只能找到原来的文件,从新建立一个。
har 文件中原来文件的数据并无变化,har 文件真正的做用是减小 NameNode 和 DataNode 过多的空间浪费
16.balancer
hdfs balancer
若是管理员发现某些 DataNode 保存数据过多,某些 DataNode 保存数据相对较少,可使用上述命令手动启动内部的均衡过程
17.dfsadmin
hdfs dfsadmin -help
管理员能够经过 dfsadmin 管理 HDFS,用法能够经过上述命令查看
hdfs dfsadmin -report
显示文件系统的基本数据
hdfs dfsadmin -safemode < enter | leave | get | wait >
enter:进入安全模式;leave:离开安全模式;get:获知是否开启安全模式;
wait:等待离开安全模式
18.distcp
用来在两个 HDFS 之间拷贝数据
hadoop distcp hdfs://caozhan:9000/a hdfs://cao:9000/ca
命令行中还能够指定多个源目录:
hadoop distcp hdfs://caozhan:9000/a hdfs://caozhan:9000/a hdfs://cao:9000/ca
或者使用-f选项,从文件里得到多个源:
hadoop distcp -f hdfs://caozhan:9000/dirlist hdfs://caozhan:9000/d
其中dirlist下是:
hdfs://caozhan:9000/dirlist/a
hdfs://caozhan:9000/dirlist/b
HDFS_JAVA_API:
HDFS 是一个分布式文件系统,既然是文件系统,就能够对其文件进行操做,好比说新建文件、删除文件、读取文件内容等操做。
Java 程序使用 HDFS Java API 与 HDFS 交互。使用这个 API,咱们能够从 Java 程序中使用存储在 HDFS 中的数据,以及使用其它非 Hadoop 计算框架来处理这些数据。
有时,也会碰见这种状况-想要从一个 MapReduce 应用程序中直接访问 HDFS。不过,若是是直接从一个 Map 或 Reduce 任务中写入或修改 HDFS 中的文件,请注意这违背了MapReduce 的 side-effect-free(无反作用)特性,这有可能致使数据一致性问题。
对分布在 HDFS 中的文件操做主要涉及一下几个类:
Configuration类:该类的对象封装了客户端或者服务器的配置。
FileSystem类:该类的对象表明一个文件系统对象,能够用该对象的一些方法来对文件进行操做。
FileSystem fs = FileSystem.get(conf); // 经过 FileSystem 类的静态方法 get 得到该对象
FSDataInputStream 和 FSDataOutputStream:这两个类是 HDFS 中的输入输出流。分别经过 FileSystem 的 open 方法和 create 方法得到。
Path:表明文件或文件对象。
下面这个示例演示了怎样经过 Java 程序使用 HDFS Java API 来执行在 HDFS 上的文件系统操做。
【示例】经过 Java 程序使用 HDFS Java API 操做 HDFS 文件系统。请按如下步骤执行:
一、在 Eclipse 中新建立一个名为 HDFSJavaAPIExample 的 project;
二、在项目的 src 目录下建立一个名为 HDFSJavaAPIDemo.java 的源文件,该 java 程序会在 HDFS 中建立一个新的文件,并在其中写入一些文本,而后从 HDFS 读取回这个文件。编辑代码以下:
package com.edu360.api; import com.edu360.Util.HadoopUtil; import org.apache.hadoop.fs.*; import org.apache.hadoop.io.IOUtils; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; /** * java 一出 谁与争锋 * <p> * ............................................. * 佛祖保佑 永无BUG * * @Auther: caozhan * @Date: 2018/10/13 17:54 * @Description: */ public class HadoopApi { public static void main(String [] args){ FileSystem fs = HadoopUtil.getFileSystem(); download(fs,"/test/test1.txt","/Users/caozhan/a.txt"); } //建立文件 public static FSDataOutputStream createFile(FileSystem fileSystem,String path){ try{ FSDataOutputStream outputStream = fileSystem.create(new Path(path)); if(outputStream!=null){ System.out.println("建立成功"); return outputStream; } }catch (Exception e){ e.printStackTrace(); } System.out.println("建立失败"); return null; } //写入文件 public static void writeFile(FileSystem fileSystem,String Filepath,String values){ FSDataOutputStream out; try{ System.out.println("文件不存在,正在建立..."); out = createFile( fileSystem, Filepath); out.writeBytes(values); out.close(); }catch (Exception e){ e.printStackTrace(); } } //读取文件 public static void readFile(FileSystem fileSystem,String Filepath){ try{ FSDataInputStream input = fileSystem.open(new Path(Filepath)); IOUtils.copyBytes(input,System.out,1024,true); }catch (Exception e){ e.printStackTrace(); } } //删除文件 public static void delFile(FileSystem fileSystem,String Filepath){ try{ boolean flag=fileSystem.delete(new Path(Filepath)); if(flag==true){ tell("删除成功"); }else { tell("删除失败"); } }catch (Exception e){ e.printStackTrace(); } } //上穿文件 public static void upload(FileSystem fileSystem,String resp,String destp){ try{ Path resP = new Path(resp); Path destP = new Path(destp); if(!fileSystem.exists(destP)){ fileSystem.mkdirs(destP); } fileSystem.copyFromLocalFile(resP,destP); fileSystem.close(); System.out.println("***********************"); System.out.println("上传成功!"); }catch (Exception e){ e.printStackTrace(); } } //下载文件 public static void download(FileSystem fileSystem,String destp,String local){ try { FSDataInputStream input = fileSystem.open(new Path(destp)); OutputStream output=new FileOutputStream(local); IOUtils.copyBytes(input,output,4096,true); System.out.println("***********************"); System.out.println("下载成功!"); }catch (Exception e){ e.printStackTrace(); } } //查看目录信息 public static void listDir(FileSystem fileSystem,String path) throws IOException { RemoteIterator<LocatedFileStatus> fileIter = fileSystem.listFiles(new Path(path),true); while(fileIter.hasNext()){ LocatedFileStatus fileInfo = fileIter.next(); tell("文件路径"+fileInfo.getPath()); tell("文件所属组"+fileInfo.getGroup()); tell(fileInfo.getBlockLocations()); tell("--------------------------------------"); } } //输出语句 public static void tell(Object obj){ System.out.println(obj); } }