《进击大数据》系列教程之hadoop大数据基础

举报
小米粒-biubiubiu 发表于 2020/12/19 00:46:31 2020/12/19
【摘要】 目录          前言 一、使用http的方式访问hdfs 二、hdfs各组件及其作用 ​三、hdfs中的数据块(Block) 四、java api 操作hdfs 五、java 开发 hdfs 应用时注意的事项 六、DataNode心跳机制的作用 七、NameNode中EditsLog 和FSImage 的作用 八、SecondaryNameNode ...

目录

         前言

一、使用http的方式访问hdfs

二、hdfs各组件及其作用

三、hdfs中的数据块(Block)

四、java api 操作hdfs

五、java 开发 hdfs 应用时注意的事项

六、DataNode心跳机制的作用

七、NameNode中EditsLog 和FSImage 的作用

八、SecondaryNameNode 帮助NameNode 减负

九、NameNode 如何扩展?

十、创建文件的快照(备份)命令

十一、平衡数据

十二、safemode 安全模式


前言

时隔一年多,忙忙碌碌一直在做java web端的业务开发,大数据基本忘的差不多了,此次出一个大数据系列教程博文将其捡起。

hadoop,hdfs的下载安装以及启动,停止在这里就不一一介绍了,不会的可以查看我的历史博客。

默认我们已经搭建好了一个三节点的主从hadoop节点,一个master,两个salve

一、使用http的方式访问hdfs

在hdfs-site.xml中增加如下配置,然后重启hdfs:


  
  1. <property>
  2. <name>dfs.webhdfs.enabled</name>
  3. <value>true</value>
  4. <description>使得可以使用http的方式访问hdfs</description>
  5. </property>

使用http访问:

查询user/hadoop-twq/cmd 文件系统中的error.txt文件

http://master:50070/webhdfs/v1/user/hadoop-twq/cmd/error.txt?op=LISTSTATUS

http://master:50070/webhdfs/v1/user/hadoop-twq/cmd/error.txt?op=OPEN

支持的op见:

http://hadoop.apache.org/docs/r2.7.5/hadoop-project-dist/hadoop-hdfs/WebHDFS.html

二、hdfs各组件及其作用

三、hdfs中的数据块(Block)

数据块的默认大小:128M

设置数据块的大小为:256M = 256*1024*1024

在${HADOOP_HOME}/ect/hadoop/hdfs-site.xml增加配置:


  
  1. <property>
  2. <name>dfs.block.size</name>
  3. <value>268435456</value>
  4. </property>

数据块的默认备份数是3

设置数据块的备份数

  • 对指定的文件设置备份数

hadoop  fs  -setrep  2 /user/hadoop-twq/cmd/big_file.txt

  • 全局文件备份数是直接在hdfs-site进行设置:

  
  1. <property>
  2.    <name>dfs.replication</name>
  3.  <value>3</value>
  4. </property>

数据块都是存储在每一个datanode 所在的机器本地磁盘文件中

四、java api 操作hdfs

使用javaapi 写数据到文件


  
  1. package com.dzx.hadoopdemo;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FSDataOutputStream;
  4. import org.apache.hadoop.fs.FileSystem;
  5. import org.apache.hadoop.fs.Path;
  6. import java.io.IOException;
  7. import java.net.URI;
  8. import java.net.URISyntaxException;
  9. import java.nio.charset.StandardCharsets;
  10. /**
  11. * @author duanzhaoxu
  12. * @ClassName:
  13. * @Description:
  14. * @date 2020年12月17日 17:35:37
  15. */
  16. public class hdfs {
  17. public static void main(String[] args) throws Exception {
  18. String content = "this is a example";
  19. String dest = "hdfs://master:9999/user/hadoop-twq/cmd/java_writer.txt";
  20. Configuration configuration = new Configuration();
  21. FileSystem fileSystem = FileSystem.get(URI.create(dest), configuration);
  22. FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path(dest));
  23. fsDataOutputStream.write(content.getBytes(StandardCharsets.UTF_8));
  24. fsDataOutputStream.close();
  25. }
  26. }

使用java api 读取文件


  
  1. package com.dzx.hadoopdemo;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FSDataInputStream;
  4. import org.apache.hadoop.fs.FileSystem;
  5. import org.apache.hadoop.fs.Path;
  6. import java.io.BufferedReader;
  7. import java.io.InputStreamReader;
  8. import java.net.URI;
  9. /**
  10. * @author duanzhaoxu
  11. * @ClassName:
  12. * @Description:
  13. * @date 2020年12月17日 17:35:37
  14. */
  15. public class hdfs {
  16. public static void main(String[] args) throws Exception {
  17. String dest = "hdfs://master:9999/user/hadoop-twq/cmd/java_writer.txt";
  18. Configuration configuration = new Configuration();
  19. FileSystem fileSystem = FileSystem.get(URI.create(dest), configuration);
  20. FSDataInputStream fsDataInputStream = fileSystem.open(new Path(dest));
  21. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fsDataInputStream));
  22. String line = null;
  23. while (bufferedReader.readLine() != null) {
  24. System.out.println(line);
  25. }
  26. fsDataInputStream.close();
  27. bufferedReader.close();
  28. }
  29. }

 

使用java api 获取文件状态信息


  
  1. package com.dzx.hadoopdemo;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FSDataInputStream;
  4. import org.apache.hadoop.fs.FileStatus;
  5. import org.apache.hadoop.fs.FileSystem;
  6. import org.apache.hadoop.fs.Path;
  7. import org.apache.hadoop.fs.permission.FsAction;
  8. import org.apache.hadoop.fs.permission.FsPermission;
  9. import java.io.BufferedReader;
  10. import java.io.InputStreamReader;
  11. import java.net.URI;
  12. /**
  13. * @author duanzhaoxu
  14. * @ClassName:
  15. * @Description:
  16. * @date 2020年12月17日 17:35:37
  17. */
  18. public class hdfs {
  19. public static void main(String[] args) throws Exception {
  20. //获取指定文件的文件状态信息
  21. String dest = "hdfs://master:9999/user/hadoop-twq/cmd/java_writer.txt";
  22. Configuration configuration = new Configuration();
  23. FileSystem fileSystem = FileSystem.get(URI.create("hdfs://master:9999/"), configuration);
  24. FileStatus fileStatus = fileSystem.getFileStatus(new Path(dest));
  25. System.out.println(fileStatus.getPath());
  26. System.out.println(fileStatus.getAccessTime());
  27. System.out.println(fileStatus.getBlockSize());
  28. System.out.println(fileStatus.getGroup());
  29. System.out.println(fileStatus.getLen());
  30. System.out.println(fileStatus.getModificationTime());
  31. System.out.println(fileStatus.getOwner());
  32. System.out.println(fileStatus.getPermission());
  33. System.out.println(fileStatus.getReplication());
  34. System.out.println(fileStatus.getSymlink());
  35. //获取指定目录下的所有文件的文件状态信息
  36. FileStatus[] fileStatuses = fileSystem.listStatus(new Path("hdfs://master:9999/user/hadoop-twq/cmd"));
  37. for (FileStatus status : fileStatuses) {
  38. System.out.println(status.getPath());
  39. System.out.println(status.getAccessTime());
  40. System.out.println(status.getBlockSize());
  41. System.out.println(status.getGroup());
  42. System.out.println(status.getLen());
  43. System.out.println(status.getModificationTime());
  44. System.out.println(status.getOwner());
  45. System.out.println(status.getPermission());
  46. System.out.println(status.getReplication());
  47. System.out.println(status.getSymlink());
  48. }
  49. //创建目录
  50. fileSystem.mkdirs(new Path("hdfs://master:9999/user/hadoop-twq/cmd/java"));
  51. //创建目录并指定权限 rwx--x---
  52. fileSystem.mkdirs(new Path("hdfs://master:9999/user/hadoop-twq/cmd/temp"), new FsPermission(FsAction.ALL, FsAction.EXECUTE, FsAction.NONE));
  53. //删除指定文件
  54. fileSystem.delete(new Path("hdfs://master:9999/user/hadoop-twq/cmd/java/1.txt"), false);
  55. //删除指定目录
  56. fileSystem.delete(new Path("hdfs://master:9999/user/hadoop-twq/cmd/java"), true);
  57. }
  58. }

五、java 开发 hdfs 应用时注意的事项


  
  1. //需要把core-site.xml文件放到resources目录下,自动读取hdfs的ip端口配置
  2. String dest = "user/hadoop-twq/cmd/java_writer.txt";
  3. Configuration configuration = new Configuration();
  4. FileSystem fileSystem = FileSystem.get(configuration);
  5. FileStatus fileStatus = fileSystem.getFileStatus(new Path(dest));

六、DataNode心跳机制的作用

七、NameNode中EditsLog 和FSImage 的作用

八、SecondaryNameNode 帮助NameNode 减负

九、NameNode 如何扩展?

向主节点master的hdfs-site.xml 增加如下配置 

 

查看 master节点的 clusterId 

将hdfs-site.xml 从主节点master 拷贝到 slave1 和 slave2 

形成三个节点的集群之后,我们使用java api 就不知道指定哪个 nameNode 的ip:端口了,所以我们需要进行viewFs配置

首先将core-site.xml 中的fs.defaultFS 配置项注释掉,然后添加如下配置


  
  1. <configuration xmlns:xi="http://www.w3.org/2001/XInclude">
  2. <xi:include href="mountTable.xml"/>
  3. <property>
  4. <name>fs.default.name</name>
  5. <value>viewfs://my-cluster</value>
  6. </property>
  7. </configuration>

然后增加一个 mountTable.xml 文件( 元数据管理分布映射,相当于将namenode 管理的元数据分散到不同的namenode节点上)

然后将修改好的配置文件同步到 slave1 和 slave2 上,重启hdfs集群即可

重启之后在任意节点都可以使用通用的 请求方式,例如:

hadoop  fs  -ls  viewfs:://my-cluster/

十、创建文件的快照(备份)命令

给指定的目录授权创建快照

hadoop dfsadmin -allowSnapshot  /user/hadoop-twq/data

创建快照

hadoop fs -createSnapshot /user/hadoop-twq/data  data-20180317-snapshot

查看创建的快照文件

hadoop fs -ls /user/hadoop-twq/data/.snapshot/data-20180317-snapshot

其他快照相关命令

十一、平衡数据

当我们对hdfs 集群进行扩展的时候,难免新扩展进来的节点,分配的数据量较少,这个时候为了能够均衡的分配数据,可以使用hdfs  balancer命令

十二、safemode 安全模式

开启安全模式之后无法创建,删除目录和文件,只允许查看目录和文件

hadoop  dfsadmin  -safemode  get

Safe  mode is OFF

hadoop dfsadmin -safemode enter 

Safe  mode is ON

hadoop dfsadmin -safemode leave

Safe  mode is ON

文章来源: blog.csdn.net,作者:血煞风雨城2018,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_31905135/article/details/111317591

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。