Hadoop对文件的基本操作方式:shell命令、JAVA API
一、Shell中操作HDFS时常用命令
-
创建目录命令
hdfs dfs -mkdir /user 在根目录下创建user目录

2. 上传文件到HDFS
hdfs dfs -put hadoop-native-64-2.5.0.tar /user/hadoop-native-64-2.5.0.tar

3. 查看HDFS下某个文件的内容
hdfs dfs -cat install.log
4. 把HDFS文件系统中的某个文件复制到本地系统中
hdfs dfs -get 文件名 新文件名
注意:-get命令和-put命令既可以操作目录,也可以操件文件
5. 删除文件
hdfs dfs -rm -r /user/install.log

6. 格式化HDFS
hdfs namenode -format
7. 启动HDFS
start-dfs.sh
8. 退出HDFS
stop-dfs.sh
二、基于Java API操作
HDFS中对于文件操作主要涉及的几个类
Configuration类:
这个类主要封装了客户端或者服务器的配置
FileSystem类:
这个类的对象是一个文件系统对象,可以使用这个对象的方法对文件进行一些操作
FileSystem fs = FileSystem.get(conf); //通过FileSystem的静态方法get来获得对象
这两个类是HDFS中的输入/输出流,分别是通过FileSystem对象的open方法和create方法获得
使用java程序来进行文件的创建:
准备工作:
JAVA需要的jar包
在hadoop压缩包中进行解压
-
必要的jar包
\share\hadoop\hdfs 下的jar
\share\hadoop\hdfs\lib 下的jar
2. 通用jar包
\share\hadoop\common下的jar
\share\hadoop\common\lib下的jar
NameNode需要退出安全模式:
hdfs dfsadmin -safemode leave
对于hadoop中的core-site.xml进行配置

对HDFS有写入的权限
hadoop fs -chmod 777 /
JAVA测试代码:
创建文件:
public class HdfsTest {
//定义一个配置文件
public static Configuration conf = new Configuration();
public static void main(String[] args) {
createFolder();
}
/**
* 创建一个文件
*/
public static void createFolder(){
conf.set("fs.defaultFS","hdfs://192.168.2.2:9000");
try {
//通过配置信息得到文件系统的对象
FileSystem fs = FileSystem.get(conf);
//在指定的路径下创建文件夹
Path path = new Path("/test01");
fs.mkdirs(path);
} catch (IOException e) {
e.printStackTrace();
}
}
}
递归显示文件
public static void listFile(Path path){
conf.set("fs.defaultFS","hdfs://192.168.2.2:9000");
try {
FileSystem fs = FileSystem.get(conf);
//把文件元数据封装到fileStatuses数组当中
FileStatus[] fileStatuses = fs.listStatus(path);
//遍历这个数组
for (FileStatus fstatus:fileStatuses) {
//如果当前文件是一个文件夹则进行递归
if(fstatus.isDirectory()){
System.out.println("当前路径是:" + fstatus.getPath());
listFile(fstatus.getPath());
} else {
System.out.println("当前路径是:" + fstatus.getPath());
}
}
}catch (IOException e){
e.printStackTrace();
}
}
上传文件:
public static void uploadFile(){
conf.set("fs.defaultFS","hdfs://192.168.2.2:9000");
try {
FileSystem fs = FileSystem.get(conf);
//定义待上传本地文件及服务器的路径
Path src = new Path(new File("xiesheng.txt").getAbsolutePath());
Path dest = new Path("/test01/hello.txt");
//从本地上传文件
fs.copyFromLocalFile(src,dest);
} catch (IOException e){
e.printStackTrace();
}
}
下载文件:
public static void downloadFile(){
conf.set("fs.defaultFS","hdfs://192.168.2.2:9000");
try{
FileSystem fs = FileSystem.get(conf);
//定义服务器要下载文件的路径和本地存储路径
Path src = new Path("/test01/hello.txt");
Path dst = new Path("D://download//hello.txt");
//从服务器下载文件到本地
//fs.copyToLocalFile(src,dest); 使用这个会报一个空指针,需要使用下面这个方法
fs.copyToLocalFile(false,src,dst,true);
} catch (IOException e){
e.printStackTrace();
}
}