赞
踩
HDFS 是分布式文件管理系统中的一种
适合一次写入,多次读出的场景
优点:高容错性 ;适合处理大量数据;可构建在廉价机器上
缺点:不适合低延时数据访问 ;无法高效的对大量小文件进行存储 ;不支持并发写入,仅支持数据append(追加),不支持文件的随机修改
NameNode(NN):Master
DataNode:Slave,NameNode下达命令,DataNode执行实际的操作
Secondary NameNode(2NN):并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
Client:就是客户端。
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
注意:hadoop fs 具体命令 和 hdfs dfs 具体命令是等价的
hadoop fs -help rm
hadoop fs -mkdir /language
-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
-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
-setrep:设置 HDFS 中文件的副本数量
hadoop fs -setrep 10 /language/golang.txt
设置的副本数只是记录在 NameNode 的元数据中,目前只有 3 台设备,最多也就 3 个副本,只有节点数的增加到 10台时, 副本数才能达到 10
在本地windows环境配置hadoop依赖,参考基于hadoop3.1.3配置Windows10本地开发运行环境
hadoop在windows上运行需要winutils支持和hadoop.dll等文件,hadoop主要基于linux编写,hadoop.dll和winutil.exe主要用于模拟linux下的目录环境,如果缺少这两个文件在本地调试MR程序会报错
Windows依赖文件官方没有直接提供,需要自行下载
<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>
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();
}
@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) 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>
其他的api操作参考https://blog.csdn.net/lesileqin/article/details/115488252,写的很全
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。