5.1 操作 HDFS
5.1.1 Web Console
启动HDFS:start-dfs.sh
打开网页:ip:50070 里面就是HDFS的信息
5.1.2 HDFS 的命令行操作
- HDFS操作命令(HDFS操作命令帮助信息:hdfs dfs)
命令 | 说明 | 示例 |
---|---|---|
-mkdir | 在HDFS上创建目录 | 在HDFS上创建目录/data hdfs dfs -mkdir /data 在HDFS上级联创建目录/data/input hdfs dfs -mkdir -p /data/input |
-ls | 列出hdfs文件系统根目录下的目录和文件 | 查看HDFS根目录下的文件和目录 hdfs dfs -ls / 查看HDFS的/data目录下的文件和目录 hdfs dfs -ls /data |
-ls -R | 列出hdfs文件系统所有的目录和文件 | 查看HDFS根目录及其子目录下的文件和目录 hdfs dfs -ls -R / |
-put | 上传文件或者从键盘输入字符到HDFS | 将本地Linux的文件data.txt上传到HDFS hdfs dfs -put data.txt /data/input 从键盘输入字符保存到HDFS的文件 hdfs dfs -put - /aaa.txt |
-moveFromLocal | 与put相类似,命令执行后源文件 local src 被删除,也可以从从键盘读取输入到hdfs file中,相当于ctrl+X | 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管理命令
HDFS管理命令帮助信息:hdfs dfsadmin
命令 | 说明 | 示例 |
---|---|---|
-report | 打印报告:显示文件系统的基本数据 | hdfs dfsadmin -report |
-safemode | HDFS的安全模式命令 < enter | leave | get | wait > | hdfs dfsadmin -safemode enter|leave|get|wait |
5.1.3 HDFS 的Java API
5.1.3.1 HDFS本地操作权限
依赖的jar包
/root/training/hadoop-2.7.3/share/hadoop/common/*.jar
/root/training/hadoop-2.7.3/share/hadoop/common/lib/*.jar
/root/training/hadoop-2.7.3/share/hadoop/hdfs/*.jar
/root/training/hadoop-2.7.3/share/hadoop/hdfs/lib/*.jar
导入所有的jar文件后,创建java文件
<!--是否开启HDFS的权限检查,默认:true-->
<!--
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
-->
但是因为权限问题,导致本地程序运行失败
错误: Permission denied: user=lenovo, access=WRITE, inode=“/folder1”:root:supergroup:drwxr-xr-x
针对其他用户,没有w的权限
四种方式可以改变HDFS的权限:
-
第一种方式:设置(环境变量)执行程序的用户是:HADOOP_USER_NAME = root
//第一种方式:指定当前的Hadoop的用户 System.setProperty("HADOOP_USER_NAME", "root");
-
第二种方式:通过使用Java的 -D参数
-
第三种方式:配置:dfs.permissions —> false
dfs.permissions false
-
第四种方式:使用命令改变目录的权限:hdfs dfs -chmod 777 /folder222
拓展学习——Java -D参数
-Dkey=??? -Dvalus=???,传值,将值付给key和valus,运行程序
5.1.3.2 创建目录
/**
* 创建目录
* @throws Exception
*/
@Test
public void testMkDir1() throws Exception{
//第一种方式:指定当前的Hadoop的用户
System.setProperty("HADOOP_USER_NAME", "root");
//配置参数:指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.16.84.111:9000");
//创建一个客户端
FileSystem client = FileSystem.get(conf);
//创建目录
client.mkdirs(new Path("/folder111"));
//关闭客户端
client.close();
}
5.1.3.3 上传数据
/**
* 数据上传
* @throws Exception
*/
@Test
public void testUpload() throws Exception{
//第一种方式:指定当前的Hadoop的用户
System.setProperty("HADOOP_USER_NAME", "root");
//配置参数:指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.16.84.111:9000");
//创建一个客户端
FileSystem client = FileSystem.get(conf);
//构造一个输入流(字节流),从本地读入数据
InputStream input = new FileInputStream("d:\\temp\\hadoop-2.7.3.atr.gz");
//构造一个输出流,指向HDFS
//给他另外取个名字
OutputStream output = client.create(new Path("/folder111/XXX.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();
}
也可以使用HDFS的一个工具类简化代码替换上述20-32行
IOUtils.copyBytes(input, output, 1024);
5.1.3.4 下载数据
/**
* 数据下载
* @throws Exception
*/
@Test
public void testDownload() throws Exception{
//第一种方式:指定当前的Hadoop的用户
System.setProperty("HADOOP_USER_NAME", "root");
//配置参数:指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.16.84.111:9000");
//创建一个客户端
FileSystem client = FileSystem.get(conf);
//构造一个输入流(字节流),从本地读入数据
InputStream input = client.open(new Path("/folder111/XXX.tar.gz"));
//构造一个输出流,指向HDFS
//给他另外取个名字
OutputStream output = new FileOutputStream("d:\\temp\\abc.tar.gz");
//使用HDFS的一个工具类简化代码
IOUtils.copyBytes(input, output, 1024);
}
5.1.3.5 查看数据块的信息
/**
* 获取数据块的信息,超过128M,会有多个数据块
* @throws Exception
*/
@Test
public void testFileBlockLocation() throws Exception {
//获取DataNode的信息(伪分布环境)
//第一种方式:指定当前的Hadoop的用户
System.setProperty("HADOOP_USER_NAME", "root");
//配置参数:指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.16.84.111:9000");
//创建一个客户端
FileSystem client = FileSystem.get(conf);
//获取文件的status信息
FileStatus fileStatus = client.getFileStatus(new Path("/folder111/abc.tar.gz"));
//获取文件的数据块信息(数组)
BlockLocation[] locations = client.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
//伪分布的环境,数据块的冗余度是:1
for (BlockLocation blk:locations){
System.out.println(Arrays.toString(blk.getHosts()) + "\t" + Arrays.toString(blk.getNames()));
}
}
5.1.3.6 数据节点信息
/**
* 获取DataNode的信息(伪分布环境)
* @throws Exception
*/
@Test
public void testFataNode() throws Exception {
//第一种方式:指定当前的Hadoop的用户
System.setProperty("HADOOP_USER_NAME", "root");
//配置参数:指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.16.84.111:9000");
//创建一个HDFS具体的客户端
DistributedFileSystem fs = (DistributedFileSystem) FileSystem.get(conf);
//获取数据节点的信息:Stats ---> 统计信息
DatanodeInfo[] list = fs.getDataNodeStats();
for (DatanodeInfo info : list)
System.out.println(info.getHostName() + "\t" + info.getName());
}
5.1.3.7 删除数据
/**
* 数据删除
* @throws Exception
*/
@Test
public void testDeleteFile() throws Exception{
//配置参数:指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.16.84.111:9000");
//创建一个客户端
FileSystem client = FileSystem.get(conf);
boolean delete = client.delete(new Path("/mydir1/temp/mydata.txt"), false);
System.out.println(delete ? "删除成功" : "删除失败");
}