Hadoop知识点整理

Hadoop 常见的端口

hdfs-site.xml

dfs.namenode.http-address:50070 HDFS的守护进程 存储着整个文件系统的元数据信息
dfs.datanode.http-address:50075 是具体文件系统的工作节点,namenode告诉我们去哪里找,DataNode进行读写
SecondaryNameNode辅助名称节点端口号:50090 namenode的元数据的备份机制
dfs.datanode.address:50010 hbunicom-ftp-nifi-07:50010 (192.168.0.8:50010)
fs.defaultFS:8020 或者9000 namenode RPC交互端口
yarn.resourcemanager.webapp.address:8088 yarn平台的守护进程,负责所有资源的分配与调度
历史服务器web访问端口:19888

job-tracker交互端口 9001
job tracker的web管理端口 50030
task-tracker的HTTP端口 50060

nodemanager => 是单个节点的资源管理,执行来自resourcemanager的具体任务和命令
zk集群 分布式协调服务,配置信息管理、命名、分布式同步、集群管理、数据

Hadoop配置文件

core-site.xml 全局配置

其他临时文件的父目录、文件系统名称(namenode+uri、主机端口)、序列文件缓冲区、zk集群地址和端口(奇数3+)

hdfs-site.xml hdfs的局部配置

指定datanode存储block副本数 默3小于4
HDFS块大小256MB 默认128MB namenode名称表目录、datanode块目录、HDFS集群名称、RPC远程调用服务器监听client线程数

mapred-site.xml mapred的局部配置

MR在yarn运行、历史服务器(WEB)端地址、map输出格式

yarn-site.xml yarn的局部配置

客户端地址 8032; ApplicationMaster地址 8030; NodeManager 8031; 管理员地址 8033; WebUI 8088;
资源调度器主类
NodeManager的RPC请求的Handler数目 ApplicationMaster的RPC请求的Handler数目
最小/最大内存资源量。1024/8192 最小/最大虚拟CPU个数。1/32
NodeManager黑白名单 NodeManager总的可用物理内存 虚拟内存2.1 CPU个数8
中间结果存放目录nm-local-dir、日志存放目录userlogs、日志存放时间10800秒
hadoop-env.sh,yarn-env.sh,mapred-env.sh这三个文件,我们主要配置一下 JAVA_HOME 的路径。
守护进程的内存大小\日志文件的存放目录(名称)\salves文件位置

集群搭建过程:

JDK安装
配置SSH免密登录
配置hadoop核心文件
格式化namenode
不是本地磁盘格式化,而是一些清除与准备工作。
第一次使用HDFS,在启动NameNode时,需要先执行-format命令,然后才能正常启动NameNode节点的服务。
在NameNode节点上,dfs.name.dir存储元数据信息和dfs.name.edits.dir操作日志,默认路径均是/tmp/hadoop/dfs/name。
格式化时,NameNode会清空两个目录下的所有文件,之后,在dfs.name.dir下创建文件:

fsimage:存储命名空间(实际上就是目录和文件)的元数据信息,文件结构如下:
edits:用来存储对命名空间操作的日志信息,实现NameNode节点的恢复;
fstime:用来存储元数据上一次check point 的时间;
VERSION:用来存储NameNode版本信息,命名空间ID(版本号),内容如下

简述安装配置apache开源版hadoop,列出步骤

解压hadoop包,到指定安装文件夹
配置linux基本网络环境、jdk环境、防火墙环境
修改主机名,方便后面UI的访问
修改hadoop/etc/hadoop/conf下的配置文件,根据部署的模式和需要进行配置
格式化namenode,对数据缓存的的路径进行格式化
启动hadoop进程

HDFS写入流程

1)客户端向namenode请求上传文件,namenode检查目标文件是否已存在返回是否可以上传
2)客户端请求一个block上传到那几个datanode服务器上,namenode返回可上传的datanode节点
3)客户端请求datanode上传数据,datanode应答客户端是否可以上传数据
4)客户端开始往datanode上传第一个block,当一个block传输完成后,客户端再次请求上传第二个block

HDFS写入HDFS过程(详细):

1、根namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在
2、namenode返回是否可以上传
3、client会先对文件进行切分,比如一个blok块128m,文件有300m就会被切分成3个块,一个128M、一个128M、一个44M请求第一个 block该传输到哪些datanode服务器上
4、namenode返回datanode的服务器
5、client请求一台datanode上传数据(本质上是一个RPC调用,建立pipeline),第一个datanode收到请求会继续调用第二个datanode,然后第二个调用第三个datanode,将整个pipeline建立完成,逐级返回客户端
6、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(一个packet为64kb),当然在写入的时候datanode会进行数据校验,它并不是通过一个packet进行一次校验而是以chunk为单位进行校验(512byte),第一台datanode收到一个packet就会传给第二台,第二台传给第三台;第一台每传一个packet会放入一个应答队列等待应答
7、当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。

HDFS读取流程

1)客户端向namenode请求下载文件,namenode通过查询元数据找到文件块所在的datanode地址
2)挑选一台datanode(就近原则)服务器,请求读取数据
3)datanode开始传输数据给客户端
4)客户端接收

读取文件过程

使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;Namenode会视情况返回文件的部分或全部block
列表,对于每个block,Namenode都会返回有该block拷贝的DataNode地址;客户端开发库Client会选取离客户端最接近的
DataNode来读取block;如果客户端本身就是DataNode,那么将从本地直接获取数据.读取完当前block的数据后,关闭与当前的
DataNode连接,并为读取下一个block寻找最佳的DataNode;当读完列表的block后,且文件读取还没有结束,客户端开发库会
继续向Namenode获取下一批的block列表。读取完一个block都会进行 checksum 验证,如果读取 datanode 时出现错误,客户端
会通知 Namenode,然后再从下一个拥有该 block 拷贝的 datanode 继续读。

NameNode与SecondaryNameNode区别?

1)NameNode 负责管理文件系统的元数据,以及每一个路径所对应的数据块信息
2)SecondaryNameNode 辅助NameNode工作,帮助NameNode合并镜像文件和编辑日志
3)NameNode 发生故障时,假如没有及时备份数据可以从SecondaryNameNode恢复数据,不是无损恢复

服役新节点

(1)将新节点添加到白名单

(2)直接启动DataNode,即可关联到集群

退役旧节点

(1)将退役节点添加到黑名单
(2)刷新NameNode、刷新ResourceManager

节点上线(详细)

1.关闭新增节点的防火墙
2.在 NameNode节点的hosts文件中加入新增数据节点的hostname
3.在每个新增数据节点的hosts文件中加入NameNode的hostname
4.在NameNode节点上增加新增节点的SSH免密码登录的操作
5.在NameNode节点上的dfs.hosts中追加上新增节点的hostname,
6.在其他节点上执行刷新操作:hdfs dfsadmin -refreshNodes
7.在 NameNode 节点上,更改slaves文件,将要上线的数据节点hostname追加
到slaves文件中
8.启动DataNode节点
9.查看NameNode的监控页面看是否有新增加的节点

节点下线(详细)

1.修改/conf/hdfs-site.xml文件
2.确定需要下线的机器,dfs.osts.exclude文件中配置好需要下架的机器,这个是阻
止下架的机器去连接NameNode
3.配置完成之后进行配置的刷新操作./bin/hadoop dfsadmin -refreshNodes,这个
操作的作用是在后台进行block块的移动
4.当执行三的命令完成之后,需要下架的机器就可以关闭了,可以查看现在集
群上连接的节点,正在执行 Decommission,会显示:
Decommission Status : Decommission in progress 执行完毕后,会显示:
Decommission Status : Decommissioned
5.机器下线完毕,将他们从 excludes 文件中移除。

namenode挂了怎么办?

使用-hdfs namenode -importCheckpoint
选项启动namenode守护进程,将SecondaryNameNode中数据拷贝到namenode存储数据的目录

mapreduce工作流程

JobClient通过RPC协议向JobTracker请求一个新应用的ID,用于MapReduce作业的ID
JobTracker检查作业的输出说明。例如,如果没有指定输出目录或目录已存在,作业就不提交,错误抛回给JobClient,否则,返回新的作业ID给JobClient
JobClient将作业所需的资源(包括作业JAR文件、配置文件和计算所得得输入分片)复制到以作业ID命名的HDFS文件夹中
JobClient通过submitApplication()提交作业
JobTracker收到调用它的submitApplication()消息后,进行任务初始化
JobTracker读取HDFS上的要处理的文件,开始计算输入分片,每一个分片对应一个TaskTracker
TaskTracker通过心跳机制领取任务(任务的描述信息)
TaskTracker读取HDFS上的作业资源(JAR包、配置文件等)
TaskTracker启动一个java child子进程,用来执行具体的任务(MapperTask或ReducerTask)

在这里插入图片描述

maptask过程

read map collect 溢写 合并
reduce过程
copy merge sort reduce

SecondaryNameNode工作机制

1)第一阶段:namenode启动根据客户端的请求记录fsimage和edits,在内存中进行增删改查
第一次启动namenode格式化后,创建fsimage和edits文件
客户端对元数据进行增删改的请求
namenode记录操作日志,更新滚动日志
namenode在内存中对数据进行增删改查
2)第二阶段:Secondary NameNode工作帮助NameNode具体操作edits和fsimage文件,NameNode只是在内存中执行增删改查)
Secondary NameNode询问namenode是否需要checkpoint
Secondary NameNode请求执行checkpoint
namenode滚动正在写的edits日志
将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode
Secondary NameNode加载编辑日志和镜像文件到内存,并合并
生成新的镜像文件fsimage.chkpoint
拷贝fsimage.chkpoint到namenode
namenode将fsimage.chkpoint重新命名成fsimage

yarn提交过程

1、客户端提交到节点
2、申请application
3、提交job所需资源
4、申请mrappmaster
5、初始化task
6、领取到task任务
7、创建容器
8、下载job资源
9、申请maptask容器
10、运行reducetask
13、获取数据
14、程序结束 注销

Spark和MR区别

MR是基于进程,spark是基于线程
Spark的多个task跑在同一个进程上,这个进程会伴随spark应用程序的整个生命周期,即使没有作业进行,进程也是存在的
MR的每一个task都是一个进程,当task完成时,进程也会结束
所以,spark比MR快的原因也在这,MR启动就需要申请资源,用完就销毁,但是spark把进程拿到以后,这个进程会一直存在,即使没有job在跑,所以后边的job可以直接启动,不需要再重新申请资源

spark把运算的中间数据存放在内存,迭代计算效率更高;MR的中间结果需要落地,需要保存到磁盘,这样必然会有磁盘IO操作,影响性能

spark容错性高,它通过弹性分布式数据集RDD来实现高效容错,RDD是一组分布式的存储在节点内存中的只读性质的数据集,这些集合石弹性的,某一部分丢失或者出错,可以通过整个数据集的计算流程的血缘关系来实现重建;MR的话容错可能只能重新计算了,成本较高

spark更加通用,spark提供了transformation和action这两大类的多个功能的api,另外还有流式处理sparkstreaming模块,图计算GraphX等;MR只提供了map和reduce两种操作,流计算以及其他模块的支持比较缺乏

Spark进程网元详解

Cluster Manager在standalone模式中即为Master主节点,控制整个集群,监控worker。在YARN模式中为资源管理器负责分配资源,有点像YARN中ResourceManager那个角色,大管家握有所有的干活的资源,属于乙方的总包。

WorkerNode是可以干活的节点,听大管家ClusterManager差遣,真正有资源干活的主。从节点,负责控制计算节点,启动Executor或者Driver。

Executor是WorkerNode上起的一个进程,相当于一个包工头,负责准备Task环境和执行

Task,负责内存和磁盘的使用。Task是施工项目里的每一个具体的任务。

Driver是Task的产生与发送给Executor,运行Application 的main()函数,是甲方司令员。

SparkContext是与ClusterManager打交道的,负责给钱申请资源的,是甲方的接口人。

Spark互动流程:

1 甲方来了个项目,创建了SparkContext,SparkContext去找ClusterManager申请资源同时给出报价,需要多少CPU和内存等资源。ClusterManager去找WorkerNode并启动Excutor,并介绍Excutor给Driver认识。
2 Driver根据施工图拆分一批批的Task,将Task送给Executor去执行。
3 Executor接收到Task后准备Task运行时依赖并执行,并将执行结果返回给Driver
4 Driver会根据返回回来的Task状态不断的指挥下一步工作,直到所有Task执行结束。

在这里插入图片描述

Hadoop调度器

FIFO(先进先出调度器)
Capacity Scheduler(容量调度器) 默认
Fair Scheduler(公平调度器)

MapReducer跑的慢的原因

计算机性能
CPU,内存,磁盘健康,网络
I/O操作优化
数据倾斜,map和reduce数设置不合理,reduce等待过久,小文件过多,大量不可分块的超大文件,spill次数过多,merge次数过多等

MapReduce优化方法

数据输入
1.合并小文件:在执行mr任务前将小文件进行合并,大量的小文件会产生大量的map任务,增大map任务装载次数,而任务的装载比较耗时,从而导致mr运行较慢
2.采用ConbinFileInputFormat来作为输入,解决输入端大量小文件场景

map阶段

1.减少spill次数,通过调整io.sort.mb及sort.spill.percent参数值,增大触发spill的内存上限,减少spill次数,从而减少磁盘IO
2.减少merge次数,通过调整io.sort.factor参数,增大merge的文件数目,减少merge的次数,从而缩短mr处理时间
3.在map之后先进行combine处理,减少IO

reduce阶段

1.合理设置map和reduce数,两个都不能设置太少,也不能设置太多。太少会导致task等待,延长处理时间。太多会导致map,reduce任务间竞争资源,造成处理超时等错误
2.设置map,reduce共存,调整slowstart.completedmaps参数,使map运行到一定程度后,reduce也开始运行,减少reduce的等待时间
3.规避使用reduce,因为reduce在用于连接数据集的时候将会产生大量的网络消耗
4.合理设置reduce端的buffer,默认情况下,数据达到一个阈值的时候buffer中的数据就会写入磁盘,然后reduce会从磁盘中获得所有的数据。也就是说buffer和reduce是没有直接关联的,中间多个一个写磁盘->读磁盘的过程,既然有这个弊端,那么就可以通过参数来配置,使得buffer中的一部分数据可以直接输送到reduce,从而减少IO开销:mapred.job.reduce.input.buffer.percent,默认为0.0,当值大于0的时候会保留指定比例的内存读buffer中的数据直接拿给reduce使用。这样一来,设置buffer需要内存,读取数据需要内存,reduce计算也要内存,所以要根据作业的运行情况进行调整

IO传输

1.采用数据压缩的方式,减少网络IO的时间。安装Snappy和LZOP压缩编码器
2.使用SequenceFile二进制文件

数据倾斜问题
1.数据倾斜现象
数据频率倾斜——某一个区域的数据量要远远大于其他区域
数据大小倾斜——部分记录的大小远远大于平均值
2.减少数倾斜的方法
抽样和范围分区
自定义分区
Combine

HDFS小文件优化方法

Hadoop Archive
是一个高效的将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件
Sequence file
由一系列的二进制key/value组成,如果key为文件名,value为文件内容,则可以将大批小文件合并成一个大文件
CombineFileInputFormat
是一种新的inputformat,用于将多个文件合并成一个单独的split,另外,他会考虑数据的存储位置
开启JVM重用
对于大量小文件job,可以开启JVM重用会减少45%的运行时间
具体设置:mapreduce.job.jvm.numtasks值在10-20之间

hadoop都需要启动哪些进程,作用是什么

namenode =>HDFS的守护进程,负责维护整个文件系统,存储着整个文件系统的元数据信息,有image+edit log namenode不会持久化存储这些数据,而是在启动时重建这些数据。
datanode =>是具体文件系统的工作节点,当我们需要某个数据,namenode告诉我们去哪里找,就直接和那个DataNode对应的服务器的后台进程进行通信,由DataNode进行数据的检索,然后进行具体的读/写操作
secondarynamenode =>一个冗余的守护进程,相当于一个namenode的元数据的备份机制,定期的更新,和namenode进行通信,将namenode上的image和edits进行合并,可以作为namenode的备份使用
resourcemanager =>是yarn平台的守护进程,负责所有资源的分配与调度,client的请求由此负责,监控nodemanager
nodemanager => 是单个节点的资源管理,执行来自resourcemanager的具体任务和命令

hadoop报错指向

error org.apache.hadoop.hdfs.server.namenode.NameNode
找不到主类,应该是配置文件的hadoop的安装位置配置错误,对hadoop-env.sh文件进行检查修改
org.apache.hadoop.hdfs.server.common.inconsistentFSStateException
这个是存储目录不存在,或者被删除,对namenode进行格式化,或重新格式化,对tmp.dir进行自己的设置
Directory /tmp/hadoop-root/dfs/name is in an inconsistent
这个和上面一样的,重新设置core-site.xml中hadoop.tmp.dir的值,对namenode进行格式化,
state storage direction does not exist or is not accessible?
之前是默认的tmp目录,每次重启都会清除这个数据,所以找不到整个文件系统的信息,重新设置core-site.xml中hadoop.tmp.dir的值,对namenode进行格式化,

请列出你所知道的hadoop调度器,并简要说明其工作方法?

先进先出调度器(FIFO)
Hadoop 中默认的调度器,也是一种批处理调度器。它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业
容量调度器(Capacity Scheduler)
支持多个队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略,为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。调度时,首先按以下策略选择一个合适队列:计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的队列;然后按以下策略选择该队列中一个作业:按照作业优先级和提交时间顺序选择,同时考虑用户资源量限制和内存限制
公平调度器(Fair Scheduler)
公平调度是一种赋予作业(job)资源的方法,它的目的是让所有的作业随着时间的推移,都能平均的获取等同的共享资源。所有的 job 具有相同的资源,当单独一个作业在运行时,它将使用整个集群。当有其它作业被提交上来时,系统会将任务(task)空闲资源(container)赋给这些新的作业,以使得每一个作业都大概获取到等量的CPU时间。与Hadoop默认调度器维护一个作业队列不同,这个特性让小作业在合理的时间内完成的同时又不"饿"到消耗较长时间的大作业。公平调度可以和作业优先权搭配使用——优先权像权重一样用作为决定每个作业所能获取的整体计算时间的比例。同计算能力调度器类似,支持多队列多用户,每个队列中的资源量可以配置, 同一队列中的作业公平共享队列中所有资源。

hive有哪些方式保存元数据

内嵌Derby数据库存储
这个是hive默认自带的内嵌数据库,用来储存元数据,但这个在配置了hiveserver2和metastore服务后,不支持多个用户同时登录,不方便对数据库的安全访问
multi user mode
在自己本地配一个,mysql的数据库用作,hive的元数据的存储数据库,这个需要要自己本地搭建一个mysql数据库,通过配置文件创建一个,hive自己的元数据库,也是我们学习一般会用的方式,配置一般如下
remote server mode
一种在远端配置数据库服务的方式,这个需要配置metastore服务,通过客户端的metastore服务访问服务器上的元数据库达到访问数据的目的

请简述hadoop怎么样实现二级排序

在MapReduce中本身就会对我们key进行排序,所以我们要对value进行排序, 主要思想为将key和部分value拼接成一个
组合key(实现WritableComparable接口或者调用 setSortComparatorClass函数),这样reduce获取的结果便是先按key排序,
后按value排序的结果,在这个方法中,用户需要自己实现Paritioner,继承Partitioner<>,以便只按照key进行数据划分。
Hadoop显式的支持二次排序,在Configuration类中有个 setGroupingComparatorClass()方法,可用于设置排序group的key值。

用非递归方法实现二分查找

代码如下,二分查找只适用于有序数列,对其进行查找,效率非常高,不适用于无序数列

public static int binSearch(int srcArray[], int key) {
int mid;
int start = 0;
int end = srcArray.length - 1;
while (start <= end) {
mid = (end - start) / 2 + start;
if (key < srcArray[mid]) {
end = mid - 1;
} else if (key > srcArray[mid]) {
start = mid + 1;
} else {
return mid;
}
}
return -1;
}
递归的二分查找

public static int binSearch_di(int srcArray[], int start, int end, int key) {
int mid = (end - start) / 2 + start;
if (srcArray[mid] == key) {
return mid;
}
if (start >= end) {
return -1;
} else if (key > srcArray[mid]) {
return binSearch_di(srcArray, mid + 1, end, key);
} else if (key < srcArray[mid]) {
return binSearch_di(srcArray, start, mid - 1, key);
}
return -1;
}

请简述mapreduce中,combiner,partition作用?

在MapReduce整个过程中,combiner是可有可无的,需要是自己的情况而定,如果只是单纯的对map输出的key-value
进行一个统计,则不需要进行combiner,combiner相当于提前做了一个reduce的工作,减轻了reduce端的压力,Combiner只应该
适用于那种Reduce的输入(key:value与输出(key:value)类型完全一致,且不影响最终结果的场景。比如累加,最大值等,
也可以用于过滤数据,在 map端将无效的数据过滤掉。在这些需求场景下,输出的数据是可以根据key值来作合并的,合并的目
的是减少输出的数据量,减少IO的读写,减少网络传输,以提高MR的作业效率。
1.combiner的作用就是在map端对输出先做一次合并,以减少传输到reducer的数据量.
2.combiner最基本是实现本地key的归并,具有类似本地reduce,那么所有的结果都是reduce完成,效率会相对降低。
3.使用combiner,先完成的map会在本地聚合,提升速度.
partition意思为分开,分区。它分割map每个节点的结果,按照key分别映射给不同的reduce,也是可以自定义的。其实可以理解归类。也可以理解为根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理
partition的作用就是把这些数据归类。每个map任务会针对输出进行分区,及对每一个reduce任务建立一个分区。划分分区由用户定义的partition函数控制,默认使用哈希函数来划分分区。
HashPartitioner是mapreduce的默认partitioner。计算方法是
which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks,得到当前的目的reducer。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值