- Datanode负责 HDFS 数据存储。
- HDfS 中的 block 默认保存3份。
- Jobtracker通常与 NameNode 在一个节点启动。
- HDFS 默认 Block Size为64MB或128MB
- 集群的最主要瓶颈是磁盘 IO
- SecondaryNameNode 的作用是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间
- Puppet 、Pdsh 、Zookeeper可以作为集群的管理
- Client 端上传文件时将文件切分为 Block,依次上传
Client 向 NameNode 发起文件写入的请求。NameNode 根据文件大小和文件块配置情况,返回给 Client 它所管理部分 DataNode 的信息。Client 将文件划分为多个 Block,根据 DataNode 的地址信息,按顺序写入到每一个DataNode 块中。具体查看HDFS 体系结构简介及优缺点。 - Hadoop 运行的模式:单机版 、伪分布式 、分布式
- Hadoop的核心配置是什么?
Hadoop拥有4个配置文件:1,core-site.xml;2,hdfs-site.xml;3,mapred-site.xml;4,yarn-site.xml。这些文件都保存在conf/子目录下。 - “jps”命令的用处?
这个命令可以检查Namenode、Datanode、Task Tracker、 Job Tracker是否正常工作。 - mapreduce的原理?
MapReduce采用”分而治之”的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。在Hadoop中,用于执行MapReduce任务的机器角色有两个:一个是JobTracker;另一个是TaskTracker,JobTracker是用于调度工作的,TaskTracker是用于执行工作的。一个Hadoop集群中只有一台JobTracker。在分布式计算中,MapReduce框架负责处理了并行编程中分布式存储、工作调度、负载均衡、容错均衡、容错处理以及网络通信等复杂问题,把处理过程高度抽象为两个函数:map和reduce,map负责把任务分解成多个任务,reduce负责把分解后多任务处理的结果汇总起来。需要注意的是,用MapReduce来处理的数据集(或任务)必须具备这样的特点:待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。 - HDFS存储的机制
hdfs写流程 :
- client链接namenode存数据
- namenode记录一条数据位置信息(元数据),告诉client存哪。
- client用hdfs的api将数据块(默认是64M)存储到datanode上。
- datanode将数据水平备份。备份完反馈client。client通知namenode存储块完毕。
- namenode将元数据同步到内存中。 另一块循环上面的过程。
hdfs读流程 :
- client链接namenode,查看元数据,找到数据的存储位置。
- client通过hdfs的api并发读取数据。
- 关闭连接。
- mapreduce是怎么来运行的 ?
MapReduce运行的时候,会通过Mapper运行的任务读取HDFS中的数据文件,然后调用自己的方法,处理数据,最后输出。Reducer任务会接收Mapper任务输出的数据,作为自己的输入数据,调用自己的方法,最后输出到HDFS的文件中。
Mapper任务的执行过程详解:
每个Mapper任务是一个Java进程,它会读取HDFS中的文件,解析成很多的键值对,经过我们覆盖的map方法处理后,转换为很多的键值对再输出。整个Mapper任务的处理过程又可以分为以下六个阶段:
- 把输入文件按照一定的标准分片(InputSplit),每个输入片的大小是固定的。默认情况下,输入片(InputSplit)的大小与数据块(Block)的大小是相同的。如果数据块(Block)的大小是默认值128MB,输入文件有两个,一个是32MB,一个是172MB。那么小的文件是一个输入片,大文件会分为两个数据块,那么是两个输入片。一共产生三个输入片。每一个输入片由一个Mapper进程处理。这里的三个输入片,会有三个Mapper进程处理。
- 对输入片中的记录按照一定的规则解析成键值对。有个默认规则是把每一行文本内容解析成键值对。“键”是每一行的起始位置(单位是字节),“值”是本行的文本内容。
- 调用Mapper类中的map方法。第二阶段中解析出来的每一个键值对,调用一次map方法。如果有1000个键值对,就会调用1000次map方法。每一次调用map方法会输出零个或者多个键值对。
- 按照一定的规则对第三阶段输出的键值对进行分区(hash)。默认是只有一个区。分区的数量就是Reducer任务运行的数量。默认只有一个Reducer任务。
- 对每个分区中的键值对进行排序。首先,按照键进行排序,对于键相同的键值对,按照值进行排序。比如三个键值对<2,2>、<1,3>、<2,1>,键和值分别是整数。那么排序后的结果是<1,3>、<2,1>、<2,2>。
如果有第六阶段,那么进入第六阶段;如果没有,直接输出到本地的Linux文件中。 - 对数据进行归约处理,也就是reduce处理。键相等的键值对会调用一次reduce方法。经过这一阶段,数据量会减少。归约后的数据输出到本地的linxu文件中。本阶段默认是没有的,需要用户自己增加这一阶段的代码。
Reducer任务的执行过程详解:
每个Reducer任务是一个java进程。Reducer任务接收Mapper任务的输出,归约处理后写入到HDFS中,可以分为三个阶段:
- Reducer任务主动从Mapper任务复制其输出的键值对。
- 把复制到Reducer的数据全部进行合并,即把分散的数据合并成一个大的数据。再对合并后的数据排序。
- 对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对。
- 最后把这些输出的键值对写入到HDFS文件中。
简单概括安装hadoop的步骤:
- 创建 hadoop 帐户。
- setup.改 IP。
- 安装 java,并修改/etc/profile 文件,配置 java 的环境变量。
- 修改 Host 文件域名。
- 安装 SSH,配置无密钥通信。
- 解压 hadoop。
- 配置 conf 文件下 hadoop-env.sh、core-site.sh、mapre-site.sh、hdfs-site.sh。
- 配置 hadoop 的环境变量。
- Hadoop namenode -format
- Start-all.sh
HDFS由 namenode、secondraynamenode、datanode 组成。
- Namenode: 负责管理元数据的信息
- SecondNameNode: 作为namenode的冷备份,对于namenode的机器当掉后能快速切换到制定的Secondname上
- DateNode:主要用来储存数据。
MapReduce 中排序发生在哪几个阶段?这些排序是否可以避免?为什么?
一个 MapReduce 作业由 Map 阶段和 Reduce 阶段两部分组成,这两阶段都会对数据排序。在 Map阶段,Map Task 会在本地磁盘输出一个按照 key 排序(采用的是快排序)的文件(中间可能产生多个文件,但最终会合并成一个);在 Reduce 阶段,每个 Reduce Task 会对收到的数据排序,这样,数据便按照 Key 分成了若干组,之后以组为单位交给 reduce()处理。很多人的误解在 Map 阶段,如果不使用 Combiner便不会排序,这是错误的,不管你用不用 Combiner,Map Task 均会对产生的数据排序(如果没有 Reduce Task,则不会排序,实际上 Map 阶段的排序就是为了减轻 Reduce端排序负载)。由于这些排序是 MapReduce 自动完成的,用户无法控制,因此,在hadoop 1.x 中无法避免,也不可以关闭,但 hadoop2.x 是可以关闭的。
hadoop的优化:优化的思路可以从配置文件和系统以及代码的设计思路来优化
- 配置文件的优化:调节适当的参数,在调参数时要进行测试
- 代码的优化:combiner的个数尽量与reduce的个数相同,数据的类型保持一致,可以减少拆包与封包的进度
- 系统的优化:可以设置linux系统打开最大的文件数预计网络的带宽MTU的配置
- 为 job 添加一个 Combiner,可以大大的减少shuffer阶段的maoTask拷贝过来给远程的 reduce task的数据量,一般而言combiner与reduce相同。
- 在开发中尽量使用stringBuffer而不是string,string的模式是read-only的,如果对它进行修改,会产生临时的对象,二stringBuffer是可修改的,不会产生临时对象。
怎样决定MapReduce的中的map以及reduce的数量
在MapReduce中Map是有块的大小来决定的,Reduce的数量可以按照用户的业务来配置。
MapReduce 中 shuffle、combiner、partition 比较详解:
Shuffle:
shuffle意为洗牌。它代表reduce task获取map task的输出的过程。shuffle过程有一部分是在Map端,有一部分是在Reduce端。Hadoop集群在运行作业的大部分的情况下,map task与reduce task的执行是分布在不同的节点上的,因此很多情况下,reduce执行时需要跨节点去copy其他节点上的map task输出结果,这样造成了集群内部的网络资源消耗很严重,而且在节点的内部,磁盘I/O对性能的影响是非常严重的。如果集群中运行的job有很多,那么task的执行对于集群内部网络的资源消费非常大。
因此,需要有一个shuffle的过程:
- 将Map的输出数据完整地传输到Reduce端。
- 在传输数据时,尽可能得减少不必要的带宽消耗。
- 降低磁盘I/O的影响。
Combine:
combine分为map端和reduce端,作用是把同一个key的键值对合并在一起,可以自定义。combine函数把一个map函数产生的< key,value >对(多个key,value)合并成一个新的< key2,value2 >输入到reduce函数中。这个value2亦可称之为values,因为有多个。这个合并的目的是为了减少网络传输。
Patition:
partition是分割map每个节点的结果,按照key分别映射给不同的reduce,也是可以自定义的。这里可以理解为归类。