赞
踩
hadoop hdfs的shell命令与java 常用api的操作与思想保持一致,故对比,易于理解与记忆
主要区别点:
shell命令行,一般在虚拟机集群或者远程连接工具Xshell上操作,被操作对象分别为 Linux文件系统本地 + HDFS文件系统
Java API,一般在Windows系统下idea软件上编写代码操作,被操作对象分别为 Windows文件系统本地 + HDFS文件系统
(一)HDFS的Shell命令行操作:
1,查看所有的hdfs命令
hadoop dfs 或者 hdfs dfs ,一般用hadoop fs,而不是hadoop dfs
使用具体命令语法
hadoop dfs 具体命令 或者 hdfs dfs 具体命令
2,查看某条命令的参数
hadoop fs -help rm 或者 hdfs dfs -help rm
3,显示根目录信息
hdfs dfs -ls /
4,-mkdir:在hdfs上创建目录,多级目录前面加 -p参数
hdfs dfs -mkdir -p /ouyangtao/bigdata
5,-moveFromLocal:从本地剪切粘贴到HDFS
先在本地创建文件hadoop.txt文件,然后剪切粘贴到hdfs上
touch hadoop.txt
hdfs dfs -moveFromLocal ./hadoop.txt /ouyangtao/bigdata
6, -appendToFile:追加一个文件到已经存在的文件末尾
先在本地创建文件hdfs.txt文件,然后剪切粘贴到hdfs上的hadoop.txt中
touch hdfs.txt
写入内容
vim hdfs.txt
追加到hdfs上的hadoop.txt中
hdfs dfs -appendToFile ./hdfs.txt /ouyangtao/bigdata/hadoop.txt
7,-cat:显示文件内容,显示上一个命令中追加的内容
hdfs dfs -cat /ouyangtao/bigdata/hadoop.txt
8, -chgrp 、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
hdfs dfs -chmod 777 /ouyangtao/bigdata/hadoop.txt
hdfs dfs -chown root:root /ouyangtao/bigdata/hadoop.txt
9, -copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
hdfs dfs -copyFromLocal hdfs.txt /ouyangtao/bigdata
10, -copyToLocal:从HDFS拷贝到本地
hdfs dfs -copyToLocal /ouyangtao/bigdata/hadoop.txt ./
11, -cp :从HDFS的一个路径拷贝到HDFS的另一个路径
hdfs dfs -cp /ouyangtao/bigdata/hadoop.txt /ouyangtao/hdfs.txt
12, -mv:在HDFS目录中移动文件,遇到根目录
hdfs dfs -mv /ouyangtao/hdfs.txt /
13, -get:等同于copyToLocal,就是从HDFS下载文件到本地
hdfs dfs -get /ouyangtao/bigdata/hadoop.txt ./
14,-put:等同于copyFromLocal
hdfs dfs -put hadoop.txt /ouyangtao
15, -tail:显示一个文件的末尾
hdfs dfs -tail /ouyangtao/hadoop.txt
16, -rm:删除文件或文件夹
hdfs dfs -rm /ouyangtao/hadoop.txt
17, -rmdir:删除空目录
hdfs dfs -mkdir /test
hdfs dfs -rmdir /test
18,-du统计文件夹的大小信息
hdfs dfs -du -s -h /ouyangtao
19 ,-setrep:设置HDFS中文件的副本数量
hdfs dfs -setrep 10 /ouyangtao/bigdata/hadoop.txt
(二)Java 常用API操作:
1,将资源链接与关闭提出来,@Before 和 @After
//定义全局变量 FileSystem fileSystem; Configuration configuration; //将获取文件系统资源集中放在一块 @Before public void init() throws URISyntaxException, IOException, InterruptedException { //1 创建配置环境对象 configuration = new Configuration(); //参数配置优先级:代码>资源配置>hdfs默认配置 //configuration.set("dfs.replication", "2"); //2 配置在集群上运行 fileSystem = FileSystem.get(new URI("hdfs://hadoop101:9000"),configuration,"root"); } //统一关闭资源 @After public void destory() throws IOException { //4 关闭文件资源 fileSystem.close(); }
2,开始测试常用API
2.1 在集群上创建一个空文件夹
@Test
public void testmkdir() throws URISyntaxException, IOException, InterruptedException {
//3 在集群上创建一个空文件夹
fileSystem.mkdirs(new Path("/test1"));
}
2.2 上传文件,从本地上传文件到HDFS
@Test
public void testCopyFromLocalFile() throws IOException {
fileSystem.copyFromLocalFile(new Path("E:/Data/speak.data"),new Path("/speak.data"));
}
2.3 下载文件,从HDFS下载文件到本地Win11系统
@Test
public void testCopyToLocalFile() throws IOException {
fileSystem.copyToLocalFile(false,new Path("/speak.data")
,new Path("E:/Data/speak_copy.data"),true);
}
2.4 删除文件/文件夹
@Test
public void testDelete() throws IOException {
//删除文件夹
// fileSystem.delete(new Path("/test1"),true);
//删除文件
fileSystem.delete(new Path("/speak.data"),true);
}
2.5 查看文件名称、权限、长度、块信息
@Test public void testListFiles() throws IOException { //获取文件详情,通过文件List获取 对应路径下的所有文件详情 //迭代器:装有指定目录下所有文件信息 RemoteIterator<LocatedFileStatus> listFiles = fileSystem.listFiles(new Path("/"),true); //循环遍历该路径下的所有文件:即遍历迭代器,将迭代器中的文件对象一一取出 while (listFiles.hasNext()){ //判断下一个文件是否存在,否则退出循环 //每一个LocatedFileStatus对象都对应一个文件所包含的信息 LocatedFileStatus status =listFiles.next(); //输出文件详情 System.out.println(status.getPath().getName());//文件名称 System.out.println(status.getPath());//文件路径 System.out.println(status.getLen());//长度 System.out.println(status.getPermission());//权限 System.out.println(status.getGroup());//分组 //获取文件存储的块信息,一个文件可拆分多个块存储 BlockLocation[] blockLocations = status.getBlockLocations(); for(BlockLocation blockLocation :blockLocations){ //获取块存储的主机节点 String[] hosts = blockLocation.getHosts(); //遍历存储有该块信息的所有主机节点 for (String host:hosts) { System.out.println(host); } } System.out.println("-------------------文件分割线----------------"); } }
2.6 判断文件夹,只能判断某个路径下的当前内容是文件还是文件夹,不能循环文件夹里的内容
@Test
public void testListStatus() throws IOException {
//获取hdfs的一个文件路径,判断该路径下的各成分是文件还是文件夹
FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/"));
for(FileStatus fileStatus: fileStatuses){
//判断是否是文件
if(fileStatus.isFile()){
System.out.println("f:"+fileStatus.getPath().getName());//获取文件名
}else {
System.out.println("d:"+fileStatus.getPath().getName());//获取文件夹名
}
}
}
2.7 I/O流操作HDFS,不用HDFS系统框架封装好的API,自己写IO流上传下载文件
//文件上传:需求:把本地 E:/Data/speak_copy.data 文件上传到HDFS根目录
@Test
public void putFileToHdfs() throws IOException {
//获取输入流
FileInputStream fileInputStream = new FileInputStream(new File("E:/Data/speak_copy.data"));
//获取输出流
FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("/speak_copy.data"));
//将输入流拷到输出流
IOUtils.copyBytes(fileInputStream,fsDataOutputStream,configuration);
//关闭流资源,环境资源会外层统一关了
IOUtils.closeStream(fsDataOutputStream);
IOUtils.closeStream(fileInputStream);
}
2.8 文件下载:需求:从HDFS上下载 /speak_copy.data 文件到本地 E:/Data/speak_copy.data
@Test
public void getFileFromHdfs() throws IOException {
//获取输入流
FSDataInputStream fsDataInputStream = fileSystem.open(new Path("/speak_copy.data"));
//获取输出流
FileOutputStream fileOutputStream = new FileOutputStream(new File("E:/Data/speak_copy.data"));
//将输入流拷到输出流
IOUtils.copyBytes(fsDataInputStream,fileOutputStream,configuration);
//关闭流资源,环境资源会外层统一关了
IOUtils.closeStream(fileOutputStream);
IOUtils.closeStream(fsDataInputStream);
}
2.9 seek 定位读取 需求:将HDFS上 /speak.data 的内容在控制台输出两次
@Test
public void readFileSeek() throws IOException {
//打开输入流,读取数据输出到控制台
FSDataInputStream inputStream =null;
try {
inputStream = fileSystem.open(new Path("/speak.data"));
//读取第一次
IOUtils.copyBytes(inputStream, System.out, 8192, false);
System.out.println("-----------------------------");
inputStream.seek(0);//从头开始读取
IOUtils.copyBytes(inputStream, System.out, 8192, false);
}finally {
IOUtils.closeStream(inputStream);//长度8192若不够,可能没有读第二次,这里无论读取如何,都关闭资源
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。