一、HDFS的shell操作:
1.语法:hadoop fs 具体命令
或者hdfs dfs 具体命令
2.上传:
(1)剪切hadoop fs -moveFromLocal 本地文件路径 HDFS文件路径
(2)复制hadoop fs -copyFromLocal 本地文件路径 HDFS文件路径
或者hadoop fs -put 本地文件路径 HDFS文件路径
(3)追加到文件末尾hadoop fs -appendToFile 本地文件路径 HDFS文件路径
3.下载:拷贝到本地hadoop fs -copyToLocal HDFS文件路径 本地文件路径
或者hadoop fs -get HDFS文件路径 本地文件路径
4.创建文件夹:hadoop fs -mkdir HDFS文件名
5.拷贝文件:hadoop fs -cp HDFS原文件路径 HDFS目的文件路径
6.剪切文件:hadoop fs -mv HDFS原文件路径 HDFS目的文件路径
7.显示文件末尾1kb数据:hadoop fs -tail HDFS文件路径
8.删除文件:hadoop fs -rm HDFS文件路径
9.递归删除文件:hadoop fs -rm -r HDFS原文件路径 HDFS目的文件路径
10.显示文件夹数据大小:hadoop fs -du -s -h HDFS文件路径
11.显示文件夹下各个文件的数据大小:hadoop fs -du -h HDFS文件路径
12.设置HDFS中文件的副本数量:hadoop fs -setrep 数量 HDFS文件路径
二、读写数据
1.oiv查看fsimage文件,hdfs oiv -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
2.oev查看Edits文件,hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
三、面试题
1.HDFS文件块大小:在企业中一般128m(中小公司),256m(大公司)
2.HDFS的shell操作(开发重点)
3.HDFS的读写流程(面试重点)
四、代码样例:
package com.lzp.hdfs;
/*
* 客户端代码常用套路
* 1.获取一个客户端对象
* 2.执行相关的操作命令
* 3.关闭资源
* HDFS zookeeper
*/
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.lang.reflect.Array;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
public class HdfsClient {
private FileSystem fs;
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
//连接集群nn地址
URI uri=new URI("hdfs://hadoop102:8020");
//创建一个配置文件
Configuration configuration = new Configuration();
//用户
String user="lzp";
//1.获取到了客户端对象
fs = FileSystem.get(uri, configuration,user);
}
@After
public void close() throws IOException {
//3.关闭资源
fs.close();
}
@Test
public void testmkdir() throws URISyntaxException, IOException, InterruptedException {
//2.创建一个文件夹
fs.mkdirs(new Path("/xiyou/huaguoshan1" ));
}
// 上传
@Test
public void testPut() throws IOException {
// 参数解读:参数一:表示删除原数据;参数二:是否允许覆盖;参数三:原数据路径;参数四:目的地路径
fs.copyFromLocalFile(false,false,new Path("D:\\sunwukong.txt"),new Path("/xiyou/huaguoshan"));
}
// 下载
@Test
public void testGet() throws IOException {
// 参数解读:参数一:表示删除原数据;参数二:原文件路径HDFS;参数三:目标地址路径Win;参数四;
fs.copyToLocalFile(false,new Path("/xiyou/huaguoshan"),new Path("D:\\sunwukong.txt"),false);
}
// 删除
@Test
public void testRm() throws IOException {
// 参数解读:参数一:要删除的路径;参数二:是否递归删除
// 删除文件
fs.delete(new Path("/xiyou/huaguoshan/sunwukong.txt"),false);
// 删除空目录
fs.delete(new Path("/xiyou/huaguoshan"),false);
// 删除非目录
fs.delete(new Path("/sanguo"),true);
}
// 文件的更名和移动
@Test
public void testmv() throws IOException {
// 参数解读:参数一:原文件路径;参数二:目标文件路径
// 对文件名称的修改
fs.rename(new Path("/input/README.txt"),new Path("/input/ss.txt"));
// 文件的移动和更名
fs.rename(new Path("/input/ss.txt"),new Path("/ss.cjk.txt"));
}
// 获取文件信息
@Test
public void fileDetail() throws IOException {
// 获取所有文件信息
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
// 遍历文件
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
System.out.println("========="+fileStatus.getPath()+"==========");
System.out.println(fileStatus.getPermission());
System.out.println(fileStatus.getOwner());
System.out.println(fileStatus.getGroup());
System.out.println(fileStatus.getLen());
System.out.println(fileStatus.getModificationTime());
System.out.println(fileStatus.getReplication());
System.out.println(fileStatus.getBlockLocations());
System.out.println(fileStatus.getBlockSize());
System.out.println(fileStatus.getPath().getName());
// 获取块信息
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
System.out.println(Arrays.toString(blockLocations));
}
}
// 判断是文件夹还是文件
@Test
public void testFile() throws IOException {
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus status : listStatus) {
if (status.isFile()) {
System.out.println("文件:"+status.getPath().getName());
}else{
System.out.println("目录:"+status.getPath().getName());
}
}
}
}
五、集群运行
1.打包到集群上然后往集群上上传输入文件