hdfs的shell操作
hadoop fs -操作命令 -参数
-ls #显示目录信息
-copyFromLocal #从本地文件系统中拷贝文件到hdfs路径
-copyToLocal #从hdfs中拷贝到本地文件系统
-put #等同于copyFromLocal
-get #等同于copyToLocal
-getmerge #合并下载多个文件
-moveFromLocal #类似剪切,本地->hdfs
-moveToLocal #类似剪切,hdfs->本地
-cp #拷贝 hdfs->hdfs
-mv #移动hdfs->hdfs
-mkdir #在hdfs上创建文件夹
-rm #删除文件或文件夹
-rmdir #删除空目录
-cat #显示文件内容
hdfs运行机制
文件系统
hdfs有一个统一的命名空间,客户端访问hdfs文件时就是通过指定目录树中路径来访问
分布式
hdfs文件都是分块(block)存储的,其大小可通过dfs.blocksize来规定,hadoop2.x默认128M,老版本64M
block分布在各个datanode服务节点上,并且可以存储多个副本(通过dfs.replication配置)
namenode负责维护目录树,以及每个文件对应的block信息
hdfs适用于一次写入,多次读出,不支持文件的修改
hdfs的Java操作
导包
public class Hdfsutil {
FileSystem fs = null;
@Before
public void init() throws Exception {
fs = FileSystem.get(new URI("hdfs://hadoop01:9000"), new Configuration(), "root");
}
/**
* 从hdfs中下载文件到本地
* @throws IOException
* @throws IllegalArgumentException
*/
@Test
public void tsetDownload() throws IllegalArgumentException, IOException {
fs.copyToLocalFile(false, new Path("/1234.txt"), new Path("C:\\"), true);
fs.close();
}
/**
* 文件夹操作
* @throws IllegalArgumentException
* @throws IOException
*/
@Test
public void testMkdir() throws IllegalArgumentException, IOException {
fs.mkdirs(new Path("/abc"));
System.out.println("创建了一个文件夹");
boolean exists = fs.exists(new Path("/abc"));
System.out.println("/abc是否存在"+exists);
fs.copyFromLocalFile(new Path("C:\\zookeeper-3.4.6.tar.gz"), new Path("/abc"));
System.out.println("成功上传一个文件到/abc");
fs.delete(new Path("/abc"), true);
System.out.println("已经删除/abc目录");
boolean exists2 = fs.exists(new Path("/abc"));
System.out.println("/abc是否存在"+exists2);
fs.close();
}
/**
* 查看文件状态
* @param args
* @throws IOException
* @throws IllegalArgumentException
* @throws FileNotFoundException
* @throws Exception
*/
@Test
public void testFileStatus() throws FileNotFoundException, IllegalArgumentException, IOException {
//只列出文件信息
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/aaa"), true);
while(listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
System.out.println(fileStatus.getPath().getName());
}
System.out.println("--------------------------------------------");
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for(FileStatus f:listStatus) {
String type = "-";
if(f.isDirectory()) {
type = "d";
}
System.out.println(type+"\t"+f.getPath().getName());
}
}
/**
*
* @param args
* @throws IOException
* @throws IllegalArgumentException
* @throws Exception
*/
@Test
public void testOthers() throws IllegalArgumentException, IOException {
BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(new Path("/hadoop-2.6.5.tar.gz"), 0, 183594876);
for(BlockLocation location:fileBlockLocations) {
System.out.println(location.getOffset());//获取偏移量
System.out.println(location.getNames()[0]);//获取主机
}
//fs.rename(new Path("/123.txt"), new Path("/ttt.txt"));
//修改副本数量
fs.setReplication(new Path("/ttt.txt"), (short)2);
}
public static void main(String[] args) throws Exception {
//构造配置参数封装对象
Configuration conf = new Configuration();
//conf中会有一个参数:fs:defaultFS的默认值是file:/// 指的是一种本地文件系统URI
conf.set("fs.defaultFS", "hdfs://192.168.1.101:9000");
//构造hdfs客户端
FileSystem fs = FileSystem.get(conf);//(需配置run configurations->Arhuments->VM arguments:-DHADOOP_USER_NAME=root)
//FileSystem fs = FileSystem.get(new URI("hdfs://hadoop01:9000"), conf, "root");
//用hdfs文件系统的客户端对象fs来操作文件,比如上传
fs.copyFromLocalFile(new Path("C:\\cTest"), new Path("/"));
//上传完成后关闭客户端
fs.close();
}
}