Hadoop复习
- 什么是hdfs?
答:HDFS是基于Java的分布式文件系统,允许您在Hadoop集群中的多个节点上存储大量数据。它专门存储超大数据文件,为整个Hadoop生态圈提供了基础的存储服务
HDFS(Hadoop distributed File System):Hadoop分布式文件系统。是基于流数据模式访问和处理超大文件的需要而开发的,可以运行于廉价的服务器上。它所具有的高容错,高可靠性,高可扩展性,高获得性,高吞吐率等特征为海量数据提供了不怕故障的存储,为超大数据集的应用带来了很多便利。简单来说就是把一个超大号文件按一定大小分割并放置在多台服务器上,这样多台服务器同时工作,效率超高,而且安全性也会提高。
- 数据块副本的存放的策略是什么?
答:HDFS默认的副本系数是3,这适用于大多数情况。副本存放策略是将第一个副本存放在本地机架的节点上,将第二个副本放在同一机架的另一个节点上,将第三个副本放在不同机架的节点上。这种策略减少了机架间的数据传输,这就提高了写操作的效率。机架的错误远远比节点的错误少,所以这个策略不会影响数据的可靠性和可用性。
- 简述hdfs的架构。
答: HDFS是一个主/从(Master/Slave)体系架构,由于分布式存储的性质,集群拥有两类节点NameNode和DataNode。NameNode(名字节点):系统中通常只有一个,中心服务器的角色,管理存储和检索多个DataNode的实际数据所需的所有元数据。
- 简述核心组件NameNode和DataNode的作用。
答:NameNode:
1、维护目录树,维护命名空间。
2、负责确定指定的文件块到具体的Datanode结点的映射关系。(在客户端与Datanode之间共享数据)。
3、管理Datanode结点的状态报告。
DataNode:
1、负责管理它所在结点上存储的数据的读写,及存储数据。
2、向Namenode结点报告DataNode节点的状态。
3、通过流水线复制实现三份数据副本。
- 常见的操作HDFS分布式文件系统的命令行命令有哪些?
1.查看帮助
hdfs dfs -help
2.查看目录下的信息
hdfs dfs -ls /
hdfs dfs -ls -R / (查看根目录下所有文件和目录)
3.上传文件到HDFS集群
hdfs dfs -put /root/Linux/Dilireba.txt /hdfs (复制)
hdfs dfs -moveFormLocal /root/Linux/a.txt /hdfs/a.txt (剪切)
4.下载文件到本地
hdfs dfs -get /hdfs/a.txt /root/linux/a.txt
5.合并下载
hdfs dfs -getmerge /hdfs /root/linux/aa.txt
6.创建目录
hdfs dfs -mkdir /wyh
hdfs dfs -mkdir -p /wyh/dilireba/love (多级创建)
7.移动/重命名HDFS中的文件或目录
hdfs dfs -mv /hdfs/a.txt /hdfs/out/a.txt 移动
hdfs dfs -mv /hdfs/a.txt /hdfs/b.txt 重命名
8.复制HDFS文件到目标路径
hdfs dfs -cp /hdfs/a.txt /hunter
9.删除文件或目录
hdfs dfs -rm /hdfs/a.txt
hdfs dfs -rm -r /hdfs
10.查看HDFS中的文件
hdfs dfs -cat /hdfs/a.txt
hdfs dfs -tail -10 /hdfs/a.txt 查看后十行数据
11.查看目录中的文件、目录的数量和大小
hdfs dfs -count /hdfs
12.查看HDFS的总空间
hdfs dfs -df / 以字节为单位
hdfs dfs -df -h / 智能单位,可读性高
13.修改某文件的副本数
hdfs dfs -setrep 2 /hdfs/a.txt 修改a.txt文件副本数为2,默认为3
14.开启/关闭HDFS的安全模式
hdfs dfsadmin -safemode enter/leave
- 常见的操作HDFS分布式文件系统的JavaAPI有哪些?
HDFS常用JAVA API有
1、创建文件夹(递归创建):fs. mkdirs()
2、写文件 : fs.create(new Path()),返回FSDataOutputStream对象
3、读文件 : fs.open(new Path()) , 返回FSDataInputStream对象
4、上传文件:fs.copyFormLocalFile()
5、下载文件:fs.copyToLocalFile()
6、删除文件:fs.delete()
7、重命名文件:fs.rename()
- 什么是数据的完整性?
答:数据完整性是数据生命周期(从数据被记录到被销毁)中数据准确性和一致性的保证。 简而言之,数据完整性意味着您已经按syncnavigator预期记录了数据,并且数据在其生命周期中没有被无意地更改。 这个概念很简单,但实践却不是。 数据完整性是创建或设计任何存储或移动数据的软件系统的关键组成部分。
- 常见的数据压缩格式有哪些?对文件压缩有哪些好处?
答:常见的数据压缩格式有DEFAULT、Gzip、bzip2、LZO、LZ4、Snappy。
好处:
减少存储磁盘空间
降低IO(网络的IO和磁盘的IO)
加快数据在磁盘和网络中的传输速度,从而提高系统的处理速度
- Hadoop的序列化框架中常见的数据类型有哪些?
答:常见的数据类型有:IntWritable(整数型)、LongWritable(长整型数)、FloatWritable(浮点型)、DoubleWritable(双字节型)、ByteWritable(单字节)、Text、BooleanWritable、NullWritable。
- 什么是MapReduce的编程模型?
答:MapReduce是采用一种分而治之的思想设计出来的分布式计算框架
如一项复杂的计算任务,单台服务器无法胜任时,可将此大任务切分成一个个小的任务,分别交给不同的服务器上并行执行,最终再汇总每个小任务的结果
MapReduce由两个阶段组成:Map阶段(切分成一个个小的任务),Reduce阶段(汇总小任务的结果)
- 简述MapReduce中JobTracker和TaskTracker的功能。
答:JobTracker的主要功能:1.作业控制:在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker的作业控制模块则负责作业的分解和状态监控。 最重要的是状态监控:主要包括TaskTracker状态监控、作业状态监控和任务状态监控。主要作用:容错和为任务调度提供决策依据。
TaskTracker的功能: 1.汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分: 机器级别信息:节点健康情况、资源使用情况等。 任务级别信息:任务执行进度、任务运行状态等。
-
使用MapReduce编程模型实现单词词频统计。
答:1.WordcountMapper:
package com.dev1.wordcount; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; /** * @author */ public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ Text k = new Text(); IntWritable v = new IntWritable(1); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 2 切割 String[] linewords = value.toString().split(" "); // 3 输出 for (String word : linewords) { //Text k = new Text(); k.set(word); context.write(k, v); } } }
2.WordcountReducer
package com.dev1.wordcount; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; /** * @author * @date 2021/3/28 */ public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{ int sum = 0; IntWritable v = new IntWritable(); @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { // 1 累加求和 sum = 0; for (IntWritable count : values) { sum += count.get(); } // 2 输出 v.set(sum); context.write(key,v); } }
3.WordcountDriver
package com.dev1.wordcount; import java.io.IOException; import java.util.Arrays; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; /** * @author * @date 2021/3/28 */ public class WordcountDriver { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { System.out.println(Arrays.toString(args)); // 1 获取配置信息以及封装任务 Configuration configuration = new Configuration(); Job job = Job.getInstance(configuration); // 2 设置jar加载路径 job.setJarByClass(WordcountDriver.class); // 3 设置map和reduce类 job.setMapperClass(WordcountMapper.class); job.setReducerClass(WordcountReducer.class); // 4 设置map输出 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); // 5 设置最终输出kv类型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); // 6 设置输入和输出路径 FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // 7 提交 boolean result = job.waitForCompletion(true); System.exit(result ? 0 : 1); } }
-
简述MapReduce编程模型的编程思路。
答:MapReduce 是一种编程模型,用于大规模数据集(大于1TB)的并行运算,源于 Google 一篇论文,它充分借鉴了 “分而治之” 的思想,将一个数据处理过程拆分为主要的Map(映射)与Reduce(化简)两步。
mapreduce编程模型核心为将数据运算流程分为两个阶段:
拆分,读取原始数据,形成key-value数据(map方法);
聚合,将相同key的数据聚合到一组(reduce方法)。
1)分布式的运算程序往往需要分成至少2个阶段
2)第一个阶段的MapTask并发实例, 完全并行运行,互不相干
3)第二个阶段的ReduceTask 并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就 只能多个MapReduce程序,串行运行。
- 简述MapReduce应用程序在集群上运行过程。
答:1.mr会在客户端启动,客户端会向rm发送一个app 请求,rm会返回一个appid给客户端,
2.客户端会拿着appid,用户名,队列,令牌向rm进行请求,
3.客户端会将应用程序所用的jar包,资源文件,以及程序运行时所需要的数据传送到hdfs,
4.rm会分配一个container0的资源包,由nm启动一个appmaster。
5.rm将集群容量信息发送给appmaster。
6.appmaster计算这个程序需要的资源量。
7.向rm 请求分配更多的container。
8.nm在各个节点上启动map任务和reduce任务。
15.分布式系统设计策略包括心跳机制、重试机制、副本机制。
16.分布式系统数据分布设计包括哈希方式,按数据范围分布;按数据量分布;一致性哈希。
17.ResourceManager包括2个核心组件,分别为调度器和应用程序管理器。
18.Doug Cutting所创立的项目的名称都受到其家人的启发他创立的项目是Hadoop、Nutch、Lucene。