【大数据离线开发】5.1、操作 HDFS

本文详细介绍了如何操作Hadoop的HDFS,包括通过WebConsole启动HDFS,使用HDFS命令行进行目录和文件的创建、列举、上传、下载、删除等操作。此外,还讲解了HDFS的Java API,展示了如何在Java程序中进行目录创建、数据上传下载、文件块信息查询以及数据节点信息获取。同时,文章提到了在权限管理方面遇到的问题及解决方法。
摘要由CSDN通过智能技术生成

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+Xhdfs 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
-safemodeHDFS的安全模式命令 < 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的权限

  1. 第一种方式:设置(环境变量)执行程序的用户是:HADOOP_USER_NAME = root

    //第一种方式:指定当前的Hadoop的用户
    System.setProperty("HADOOP_USER_NAME", "root");
    
  2. 第二种方式:通过使用Java的 -D参数

在这里插入图片描述

  1. 第三种方式:配置:dfs.permissions —> false

    dfs.permissions false
  2. 第四种方式:使用命令改变目录的权限: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 ? "删除成功" : "删除失败");

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值