目录
04-04-HDFS的WebConsole
Web Console:端口 50070
HDFS启动的过程.png
1、安全模式 safe mode
注意:HDFS正常运行的时候,安全模式一定是off(关闭状态)
是HDFS的一种自我保护,作用:检查数据块的副本率
HDFS处于安全模式,是只读的状态
2、快照:是一种备份
命令:
[-allowSnapshot <snapshotDir>]
[-disallowSnapshot <snapshotDir>]
3、配额:Quota
(1)名称配额
[-setQuota <quota> <dirname>...<dirname>]
[-clrQuota <dirname>...<dirname>]
(2)空间配额
[-setSpaceQuota <quota> [-storageType <storagetype>] <dirname>...<dirname>]
[-clrSpaceQuota [-storageType <storagetype>] <dirname>...<dirname>]
4、回收站:默认HDFS的回收站禁用
04-05-HDFS的命令行操作
HDFS操作命令(HDFS操作命令帮助信息:hdfs dfs)
命令 | 说明 | 示例 |
---|---|---|
-mkdir | 在HDFS上创建目录 | l 在HDFS上创建目录/data hdfs dfs -mkdir /datal 在HDFS上级联创建目录/data/input hdfs dfs -mkdir -p /data/input |
-ls | 列出hdfs文件系统根目录下的目录和文件 | l 查看HDFS根目录下的文件和目录 hdfs dfs -ls /l 查看HDFS的/data目录下的文件和目录 hdfs dfs -ls /data |
-ls -R | 列出hdfs文件系统所有的目录和文件 | l 查看HDFS根目录及其子目录下的文件和目录 hdfs dfs -ls -R / |
-put | 上传文件或者从键盘输入字符到HDFS | l 将本地Linux的文件data.txt上传到HDFS hdfs dfs -put data.txt /data/inputl 从键盘输入字符保存到HDFS的文件 hdfs dfs -put - /aaa.txt |
-moveFromLocal | 与put相类似,命令执行后源文件 local src 被删除,也可以从从键盘读取输入到hdfs file中 | hdfs dfs -moveFromLocal data.txt /data/input |
-copyFromLocal | 与put相类似,也可以从从键盘读取输入到hdfs file中 | hdfs dfs -copyFromLocal data.txt /data/input |
-copyToLocal | ||
-get | 将HDFS中的文件被复制到本地 | hdfs dfs -get /data/inputdata.txt /root/ |
-rm | 每次可以删除多个文件或目录 | hdfs dfs -rm < hdfs file > ... 删除多个文件hdfs dfs -rm -r < hdfs dir>... 删除多个目录 |
-getmerge | 将hdfs指定目录下所有文件排序后合并到local指定的文件中,文件不存在时会自动创建,文件存在时会覆盖里面的内容 | 将HDFS上/data/input目录下的所有文件,合并到本地的a.txt文件中hdfs dfs -getmerge /data/input /root/a.txt |
-cp | 拷贝HDFS上的文件 | |
-mv | 移动HDFS上的文件 | |
-count | 统计hdfs对应路径下的目录个数,文件个数,文件总计大小显示为目录个数,文件个数,文件总计大小,输入路径 | |
-du | 显示hdfs对应路径下每个文件夹和文件的大小 | hdfs dfs -du / |
-text、-cat | 将文本文件或某些格式的非文本文件通过文本格式输出 | |
balancer | 如果管理员发现某些DataNode保存数据过多,某些DataNode保存数据相对较少,可以使用上述命令手动启动内部的均衡过程 |
HDFS管理命令
命令 | 说明 | 示例 |
---|---|---|
-report | 显示文件系统的基本数据 | hdfs dfsadmin -report |
-safemode | HDFS的安全模式命令< enter | leave | get | wait > | hdfs dfsadmin -safemode enter|leave|get|wait |
04-06-创建目录和HDFS的权限的问题
Java API
依赖的jar包:
$HADOOP_HOME/share/hadoop/common/*.jar
$HADOOP_HOME/share/hadoop/common/lib/*.jar
$HADOOP_HOME/share/hadoop/hdfs/*.jar
$HADOOP_HOME/share/hadoop/hdfs/lib/*.jar
在HDFS上创建目录
/*
* 错误:
* Permission denied: user=lenovo, access=WRITE, inode="/folder111":root:supergroup:d rwx r-x r-x
*
* 针对其他用户,没有w的权限
*
* 四种方式可以改变HDFS的权限:
*
* 第一种方式:设置环境变量 HADOOP_USER_NAME = root
* 第二种方式:通过使用Java的 -D参数
* 第三种方式:dfs.permissions ----> false
* 第四种方式:命令 -chmod 改变HDFS目录的权限
*/
@Test
public void testMkDir1() throws Exception{
//指定当前的Hadoop的用户
System.setProperty("HADOOP_USER_NAME", "root");
//配置参数:指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.157.111:9000");
//创建一个客户端
FileSystem client = FileSystem.get(conf);
//创建目录
client.mkdirs(new Path("/folder111"));
//关闭客户端
client.close();
}
04-07-使用JavaAPI上传数据
使用JavaAPI上传数据
@Test
public void test1() throws Exception{
//指定当前的Hadoop的用户
System.setProperty("HADOOP_USER_NAME", "root");
//配置参数:指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.157.111:9000");
//创建一个客户端
FileSystem client = FileSystem.get(conf);
//构造一个输入流,从本地读入数据
InputStream input = new FileInputStream("d:\temp\hadoop-2.7.3.tar.gz");
//构造一个输出流 指向HDFS
OutputStream output = client.create(new Path("/folder111/a.tar.gz"));
//构造一个缓冲区
byte[] buffer = new byte[1024];
//长度
int len = 0;
//读入数据
while((len=input.read(buffer)) > 0){
//写到输出流中
output.write(buffer, 0, len);
}
output.flush();
//关闭流
input.close();
output.close();
}
简写
@Test
public void test2() throws Exception{
//指定当前的Hadoop的用户
System.setProperty("HADOOP_USER_NAME", "root");
//配置参数:指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.157.111:9000");
//创建一个客户端
FileSystem client = FileSystem.get(conf);
//构造一个输入流,从本地读入数据
InputStream input = new FileInputStream("d:\temp\hadoop-2.7.3.tar.gz");
//构造一个输出流 指向HDFS
OutputStream output = client.create(new Path("/folder111/b.tar.gz"));
//使用HDFS的一个工具类简化代码
IOUtils.copyBytes(input, output, 1024);
}
04-08-HDFS的Java其他操作
数据下载
@Test
public void testDownload() throws Exception{
//数据下载
//指定当前的Hadoop的用户
System.setProperty("HADOOP_USER_NAME", "root");
//配置参数:指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.157.111:9000");
//创建一个客户端
FileSystem client = FileSystem.get(conf);
//构造一个输入流,从HDFS中读取数据
InputStream input = client.open(new Path("/folder111/a.tar.gz"));
//构造一个输出流,输出到本地的目录
OutputStream output = new FileOutputStream("d:\temp\xyz.tar.gz");
//使用工具类
IOUtils.copyBytes(input, output, 1024);
}
获取DataNode的信息(伪分布的环境)
@Test
public void testDataNode() throws Exception{
//获取DataNode的信息(伪分布的环境)
//指定当前的Hadoop的用户
System.setProperty("HADOOP_USER_NAME", "root");
//配置参数:指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.157.111:9000");
//创建一个HDFS客户端
//FileSystem client = FileSystem.get(conf);
DistributedFileSystem fs = (DistributedFileSystem) FileSystem.get(conf);
//获取数据节点的信息: Stats ---> 统计信息
DatanodeInfo[] list = fs.getDataNodeStats();
for(DatanodeInfo info:list){
System.out.println(info.getHostName()+" "+ info.getName());
}
fs.close();
}
获取数据块的信息
@Test
public void testFileBlockLocation() throws Exception{
//获取数据块的信息
//指定当前的Hadoop的用户
System.setProperty("HADOOP_USER_NAME", "root");
//配置参数:指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.157.111:9000");
//创建一个客户端
FileSystem client = FileSystem.get(conf);
//获取文件的status信息
FileStatus fileStatus = client.getFileStatus(new Path("/folder111/a.tar.gz"));
//获取文件的数据块信息(数组)
BlockLocation[] locations = client.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
/*
* 伪分布的环境,数据块的冗余度是:1
*/
for(BlockLocation blk:locations){
System.out.println(Arrays.toString(blk.getHosts()) + " " + Arrays.toString(blk.getNames()));
}
client.close();
}
1、RPC
2、代理对象