文章目录
一、Web Console网页工具
1、NameNode:端口50070
1)HDFS启动过程
2)HDFS概要
2、SecondaryNameNode:端口50090
二、命令行方式操作HDFS
# 查询所有的hdfs操作命令
hdfs dfs
# 在hdfs中创建目录
hdfs dfs -mkdir /aaa
# 如果父级目录不存在就要使用-p
hdfs dfs -mkdir -p /bbb/ccc
# 查询HDFS的某个目录
hdfs dfs -ls /bbb
# 查询HDFS的某个目录,包含子目录,也可以简写为-lsr
hdfs dfs -ls -R /bbb
# 上传数据,将服务器上的某个文件上传到HDFS的aaa下
hdfs dfs -put ./README.txt /aaa
# 上传数据
hdfs dfs -copyFromLocal ./README.txt /aaa
# 剪切数据到hdfs中,相当于ctrl + x
hdfs dfs -moveFromLocal ./data.txt /aaa
# 下载数据
hdfs dfs -get /aaa/data.txt ./
hdfs dfs -copyToLocal /aaa/data.txt ./
# 删除文件,不能删除目录
hdfs dfs -rm /bbb
# 删除目录,包含子目录
hdfs dfs -rm -r /bbb
# 先把某个目录下的文件合并,再下载
hdfs dfs -getmerge /students ./allstudents.txt
# 拷贝
hdfs dfs -cp /aaa/data.txt /bbb/data.txt
# 移动
hdfs dfs -mv /aaa/data.txt /bbb/data.txt
# 显示目录信息
hdfs dfs -count /students
# 显示目录详细信息
hdfs dfs -du /students
# 查看文本文件内容
hdfs dfs -text ./students/a.txt
hdfs dfs -cat ./students/a.txt
# 平衡操作,如果出现数据不是平均分配在DataNode上时,可使用balanceer平衡
hdfs balancer
# 查询所有的hdfs管理命令
hdfs dfsadmin
# 查看hdfs运行的一些参数
hdfs dfsadmin -report
# 安全模式,get:获取当前的安全模式|enter:进入安全模式|leave:离开安全模式|wait:等待安全模式自动退出
hdfs dfsadmin -safemode get
三、Java Api方式操作
package org.gykalc;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.ipc.Client;
import org.junit.Test;
import java.io.*;
import java.util.Arrays;
public class TestApi {
/**
* 创建目录
*/
@Test
public void mkdir() throws IOException {
// 如果遇到权限问题有四种解决方案,下面是方案一,使用代码,添加一个环境变量,表示当前操作的是root用户
System.setProperty("DHADOOP_USER_NAME", "root");
// 配置NameNode地址
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://192.168.36.10:9000");
// 获取hadoop客户端
FileSystem client = FileSystem.get(configuration);
// 创建目录
client.mkdirs(new Path("/gyk"));
// 关闭客户端
client.close();
}
/**
* 删除目录
*/
@Test
public void removeDir() throws IOException {
// 如果遇到权限问题有四种解决方案,下面是方案一,使用代码,添加一个环境变量,表示当前操作的是root用户
System.setProperty("DHADOOP_USER_NAME", "root");
// 配置NameNode地址
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://192.168.36.10:9000");
// 获取hadoop客户端
FileSystem client = FileSystem.get(configuration);
// 移除目录,第二个参数表示是否递归删除,一般删除文件夹后面才为true
client.delete(new Path("/gyk"), true);
// 关闭客户端
client.close();
}
/**
* 上传方法1
*/
@Test
public void uploadFileOne() throws IOException {
// 如果遇到权限问题有四种解决方案,下面是方案一,使用代码,添加一个环境变量,表示当前操作的是root用户
System.setProperty("DHADOOP_USER_NAME", "root");
// 初始化一个输入流
InputStream ins = new FileInputStream("D:\\学习\\hadoop\\a.txt");
// 配置NameNode地址
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://172.18.0.2:9000");
// 获取hadoop客户端
FileSystem client = FileSystem.get(configuration);
FSDataOutputStream output = client.create(new Path("/gyk/a.txt"));
// 定义一个字节缓存数组
byte[] bytes = new byte[1024];
int len = 0;
// 循环读取和写入
while ((len = ins.read(bytes)) > 0) {
output.write(bytes, 0, len);
}
// 关闭流
output.flush();
output.close();
ins.close();
client.close();
}
/**
* 上传方法2
*/
@Test
public void uploadFileTwo() throws IOException {
// 如果遇到权限问题有四种解决方案,下面是方案一,使用代码,添加一个环境变量,表示当前操作的是root用户
System.setProperty("DHADOOP_USER_NAME", "root");
// 初始化一个输入流
InputStream ins = new FileInputStream("D:\\学习\\hadoop\\a.txt");
// 配置NameNode地址
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://172.18.0.2:9000");
// 获取hadoop客户端
FileSystem client = FileSystem.get(configuration);
FSDataOutputStream output = client.create(new Path("/gyk/b.txt"));
IOUtils.copyBytes(ins, output, 1024);
output.flush();
output.close();
ins.close();
client.close();
}
/**
* 下载文件1
*
* @throws IOException
*/
@Test
public void downloadFileOne() throws IOException {
// 如果遇到权限问题有四种解决方案,下面是方案一,使用代码,添加一个环境变量,表示当前操作的是root用户
System.setProperty("DHADOOP_USER_NAME", "root");
// 初始化一个输出流
OutputStream outputStream = new FileOutputStream("D:\\学习\\hadoop\\c.txt");
// 配置NameNode地址
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://172.18.0.2:9000");
// 获取hadoop客户端
FileSystem client = FileSystem.get(configuration);
FSDataInputStream inputStream = client.open(new Path("/aaa/README.txt"));
// 定义一个字节缓存数组
byte[] bytes = new byte[1024];
int len = 0;
// 循环读取和写入
while ((len = inputStream.read(bytes)) > 0) {
outputStream.write(bytes, 0, len);
}
// 关闭流
outputStream.flush();
outputStream.close();
inputStream.close();
client.close();
}
/**
* 下载文件2
*
* @throws IOException
*/
@Test
public void downloadFileTwo() throws IOException {
// 如果遇到权限问题有四种解决方案,下面是方案一,使用代码,添加一个环境变量,表示当前操作的是root用户
System.setProperty("DHADOOP_USER_NAME", "root");
// 初始化一个输出流
OutputStream outputStream = new FileOutputStream("D:\\学习\\hadoop\\d.txt");
// 配置NameNode地址
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://172.18.0.2:9000");
// 获取hadoop客户端
FileSystem client = FileSystem.get(configuration);
FSDataInputStream inputStream = client.open(new Path("/aaa/README.txt"));
IOUtils.copyBytes(inputStream, outputStream, 1024);
// 关闭流
outputStream.flush();
outputStream.close();
inputStream.close();
client.close();
}
/**
* 查找某个文件的数据块在HDFS的dataNode的位置
*/
@Test
public void getBlockOnDataNode() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://172.18.0.2:9000");
FileSystem client = FileSystem.get(conf);
// 得到该文件的状态
FileStatus status = client.getFileStatus(new Path("/aaa/README.txt"));
// 获取文件的数据块信息
BlockLocation[] fileBlockLocations = client.getFileBlockLocations(status, 0, status.getLen());
for (BlockLocation blk : fileBlockLocations) {
System.out.println("数据块:主机:" + Arrays.toString(blk.getHosts()));
}
client.close();
}
/**
* 获取数据节点
*/
@Test
public void getDataNode() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://172.18.0.2:9000");
// 这里就需要获取到FileSystem的子类
DistributedFileSystem distributedFileSystem = (DistributedFileSystem) FileSystem.get(conf);
// 获取所有的数据节点
DatanodeInfo[] list = distributedFileSystem.getDataNodeStats();
for (DatanodeInfo datanodeInfo: list) {
System.out.println(datanodeInfo);
}
distributedFileSystem.close();
}
}
如果报错了,说明没有权限操作HDFS,可以添加一个HADOOP_USER_NAME这个环境变量
方式一:添加如下代码
方式二:在命令行使用-DHADOOP_USER_NAME=root
方式三:chmod命令,改变权限
hdfs dfs -chmod 777 ...
方式四:修改配置hdfs-site.xml文件