当前位置:   article > 正文

HDFS的shell和api操作_hadoop shell命令与便写程序差别

hadoop shell命令与便写程序差别

HDFS概述

HDFS 是分布式文件管理系统中的一种

适合一次写入,多次读出的场景

优点:高容错性 ;适合处理大量数据;可构建在廉价机器上

缺点:不适合低延时数据访问 ;无法高效的对大量小文件进行存储 ;不支持并发写入,仅支持数据append(追加),不支持文件的随机修改

HDFS 组成架构

在这里插入图片描述

NameNode(NN):Master

  • 管理HDFS的名称空间
  • 配置副本策略
  • 管理数据块(Block)映射信息
  • 处理客户端读写请求。

DataNode:Slave,NameNode下达命令,DataNode执行实际的操作

  • 存储实际的数据块
  • 执行数据块的读/写操作

Secondary NameNode(2NN):并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。

  • 辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode ;
  • 在紧急情况下,可辅助恢复NameNode

Client:就是客户端。

  • 文件切分,文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传;
  • 与NameNode交互,获取文件的位置信息;
  • 与DataNode交互,读取或者写入数据;
  • Client提供命令管理HDFS,比如NameNode格式化;
  • Client可以通过命令来访问HDFS,比如对HDFS增删查改操作;

HDFS 文件块大小

HDFS中的文件在物理上是分块存储 (Block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在Hadoop2.x/3.x版本中是128M,1.x版本中是64M

HDFS块的大小设置主要取决于磁盘传输速率 ,例如100MB/s则可以设置为128M

HDFS的块设置太小,会增加寻址时间 。块设置太大,从磁盘传输数据的时间过长

准备工作,搭建好hadoop集群,参考https://blog.csdn.net/sinat_41567654/article/details/124216346

HDFS的shell操作

注意:hadoop fs 具体命令 和 hdfs dfs 具体命令是等价的

帮助

hadoop fs -help rm
  • 1

创建文件夹

 hadoop fs -mkdir /language
  • 1

上传

-moveFromLocal:从本地剪切粘贴到 HDFS

-copyFromLocal:从本地文件系统中拷贝文件到 HDFS 路径

-put:等同于 copyFromLocal,生产环境更习惯用put输入

-appendToFile:追加一个文件到已经存在的文件末尾shuguo

hadoop fs -moveFromLocal java.txt /language
hadoop fs -copyFromLocal golang.txt /language
hadoop fs -put python.txt /language
hadoop fs -appendToFile numpy.txt /language/python.txt  
  • 1
  • 2
  • 3
  • 4

下载

-copyToLocal:从 HDFS 拷贝到本地

-get:等同于copyToLocal,生产环境更习惯用 get

管理

-ls: 显示目录信息

-cat:显示文件内容

-chgrp、 -chmod、 -chown: Linux 文件系统中的用法一样,修改文件所属权限

-mkdir:创建路径

-cp:从 HDFS 的一个路径拷贝到 HDFS 的另一个路径

-mv:在 HDFS 目录中移动文件

-tail:显示一个文件的末尾 1kb 的数据

-rm -r: 递归删除目录及目录里面内容

-du 统计文件夹的大小信息

hadoop fs -du -s -h /language
  • 1

-setrep:设置 HDFS 中文件的副本数量

hadoop fs -setrep 10 /language/golang.txt
  • 1

设置的副本数只是记录在 NameNode 的元数据中,目前只有 3 台设备,最多也就 3 个副本,只有节点数的增加到 10台时, 副本数才能达到 10

HDFS的API操作

在本地windows环境配置hadoop依赖,参考基于hadoop3.1.3配置Windows10本地开发运行环境

hadoop在windows上运行需要winutils支持和hadoop.dll等文件,hadoop主要基于linux编写,hadoop.dll和winutil.exe主要用于模拟linux下的目录环境,如果缺少这两个文件在本地调试MR程序会报错

Windows依赖文件官方没有直接提供,需要自行下载

maven依赖

<dependencies>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>3.1.3</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.30</version>
    </dependency>
  </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

创建文件夹

hdfs执行api操作默认为windows用户身份,因此需要指定为your-username

@Test
public void testMkdirs() throws IOException,URISyntaxException,InterruptedException{
	Configuration configuration = new Configuration();
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop26:8020"), configuration, "your-username");
	fs.mkdirs(new Path("/china"));
	fs.close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上传文件

@Test
public void testUploadfile() throws IOException, InterruptedException, URISyntaxException{
	Configuration configuration = new Configuration();
    configuration.set("dfs.client.use.datanode.hostname", "true");
    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop26:8020"),configuration,"ec2-user");
    fs.copyFromLocalFile(false,false,new Path("D:\\uploadtest.txt"), new Path("hdfs://hadoop26/china"));
    fs.close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

参数优先级排序: (1) 客户端代码中设置的值 >(2) ClassPath 下的用户自定义配置文件 >(3)然后是服务器的自定义配置(xxx-site.xml) >(4)服务器的默认配置(xxx-default.xml)

其他的大同小异,参考https://blog.csdn.net/lesileqin/article/details/115488252

问题

上传文件的时候遇到问题,一顿折腾,https://github.com/big-data-europe/docker-hadoop/issues/98

参考解决,https://blog.csdn.net/Xu_XiaoXiao_Ji/article/details/98497563

问题表现:能够创建文件夹,shell能够成功上传文件,但是通过java的api上传文件却只能创建空文件

原因:shell能够上传说明集群配置没有问题,问题在于client找不到datanode,因为namenode返回的是datanode的私有ip地址,需要指定返回hostname

疑惑:在hdfs-site.xml设置了dfs.client.use.datanode.hostname为true不管用,需要在code中指定?

hdfs-site.xml配置文件

<configuration>
    <!-- nn web 端访问地址-->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>hadoop26:9870</value>
    </property>
    <!-- 2nn web 端访问地址-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop100:9868</value>
    </property>
    <property>
       <name>dfs.client.use.datanode.hostname</name>
       <value>true</value>
    </property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

其他的api操作参考https://blog.csdn.net/lesileqin/article/details/115488252,写的很全

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/511689
推荐阅读
相关标签
  

闽ICP备14008679号