hadoop概述:Hadoop实现了一个分布式文件系统(HadoopDistributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop框架最核心的设计就是:HDFS和MapReduce,HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
命名空间
分布式存储:分布式文件系统管理的是一个服务器集群。在这个集群中,数据存储在集群的节点(即集群中的服务器)中,但是该文件系统把服务器的差异屏蔽了。那么,我们就可以像使用普通的文件系统一样使用,但是数据却分散在不同的服务器中。
Namespace:在分布式存储系统中,分散在不同节点中的数据可能属于同一个文件,为了组织众多的文件,把文件可以放到不同的文件夹中,文件夹可以一级一级的包含。我们把这种组织形式称为命名空间Namespace;命名空间管理着整个服务器集群中的所有文件,命名空间的职责与存储真实数据的职责是不一样的,负责命名空间职责的节点称为主节点master node,负责存储真实数据职责的节点称为从节点slave node。
主、从节点:主节点负责管理文件系统的文件结构,从节点负责存储真实的数据,合称为主从式结构master-slaves,用户操作时,也应该先和主节点打交道,查询数据在哪些从节点上存储,然后再从从节点读取。在主节点上,为了加快用户访问的速度,会把整个命名空间信息都放在内存中,当存储的文件越多时,那么主节点就需要越多的内存空间。
块(block):在从节点存储数据时,有的原始数据文件可能很大,有的可能很小,大小不一的文件不容易管理,那么可以抽象出一个独立的存储文件单位,称为块(block)。
容灾
容灾:数据存放在集群中,可能因为网络原因或者服务器硬件原因造成访问失败,最好采用副本(replication)机制,把数据同时备份到多台服务器中,这样数据就安全了,数据丢失或者访问失败的概率就小了。
分布式计算角色:
主节点称为作业节点(jobtracker)
从节点称为任务节点(tasktracker)
在任务节点中,运行第一阶段的代码称为 map 任务(map task),运行第二阶段的代码称为 reduce任务(reduce task)。
名词解释
Hadoop:Apache 开源的分布式框架。
HDFS:Hadoop 的分布式文件系统。
NameNode:Hadoop HDFS 元数据主节点服务器,负责保存 DataNode 文件存储元数据信息,这个服务器是单点的。
JobTracker:Hadoop 的 Map/Reduce 调度器,负责与TaskTracker 通信分配计算任务并跟踪任务迚度,这个服务器也是单点的。
DataNode:Hadoop 数据节点,负责存储数据。
TaskTracker:Hadoop 调度程序,负责 Map,Reduce 任务的启动和执行。
Zkfc:DFS故障转移控制器
RM:资源管理程序,负责集群中所有资源的统一管理和分配
注:Namenode 记录着每个文件中各个块(block)所在的数据节点的位置信息。
hadoop ha安装配置
(先把/app/hadoop2.7/etc/hadoop目录下的mapred-site.xml.template 进行重命名方便后续查找。命令# mv mapred-site.xml.template mapred-site.xml)
注意:bigdata241是主机,bigdata242是备份,bigdata243/244/245是计算节点配置zk
配置如下文件
core-site.xml Hadoop核心配置文件
fs.defaultFS
hdfs://cluster
hadoop ha 部署方式下namenode访问地址,cluster是名字可自定义,后面hdfs-site.xml会用到
hadoop.tmp.dir
/home/hadoop/app/hadoop2.7/tmp
指定hadoop临时目录
ha.zookeeper.quorum
bigdata243:2181,bigdata244:2181,bigdata245:2181
指定zookeeper地址
ha.zookeeper.session-timeout.ms
300000
zk的超时时间,单位为毫秒,默认为5000,这个值比较小。建议设置得大一些,zk过于敏感,避免因为网路抖动等原因引起NameNode进行无所谓的>主备切换
fs.trash.interval
1440
开启垃圾回收站功能,防止误删除文件,HDFS文件删除后先放入回收站,单位为分,垃圾回收站最长保留数据时间为1天,超过一天后删除
io.file.buffer.size
131072
设置SequenceFile中用到的读/写缓存大小,合理设置缓存大>小有利于提高数据传输效率,单位为byte,默认为4KB,这里设置为128KB
hdfs-site.xml 分布式文件系统HDFS的配置文件
dfs.nameservices
cluster
指定hdfs的nameservice为cluster,需要和core-site.xml文件中的保持一致
dfs.ha.namenodes.cluster
bigdata241,bigdata242
cluster下有两个NameNode,分别为bigdata241和bigdata242
dfs.namenode.rpc-address.cluster.bigdata241
bigdata241:9000
NameNode1的RPC通信地址,端口要和core-site.xml中fs.defaultFS的一致
dfs.namenode.http-address.cluster.bigdata241
bigdata241:50070
NameNode1的HTTP通信地址
dfs.namenode.rpc-address.cluster.bigdata242
bigdata242:9000
NameNode2的RPC通信地址,端口要和core-site.xml中fs.defaultFS的一致
dfs.namenode.http-address.cluster.bigdata242
bigdata242:50070
NameNode2的HTTP通信地址
dfs.namenode.shared.edits.dir
qjournal://bigdata243:8485;bigdata244:8485;bigdata245:8485/cluster
指定NameNode的元数据在JournalNode上的存放位置
dfs.journalnode.edits.dir
/home/hadoop/app/hadoop2.7/journaldata
指定NameNode的元数据在JournalNode上的存放位置
dfs.ha.automatic-failover.enabled
true
指定支持高可用自动切换机制
dfs.client.failover.proxy.provider.cluster
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
配置失败自动切换实现方式
dfs.ha.fencing.methods
sshfence
shell(/bin/true)
配置隔离机制,主要用于远程管理监听其他机器相关服务
dfs.ha.fencing.ssh.private-key-files
/home/hadoop/.ssh/id_rsa
使用隔离机制时需要ssh免密码登陆,/home/hadoop/为用户目录
dfs.ha.fencing.ssh.connect-timeout
30000
使用隔离机制时需要ssh免密码登陆时的超时时间,单位为毫秒
dfs.namenode.name.dir
file:/home/hadoop/app/hadoop2.7/tmp/name
NameNode结点存储hadoop文件系统信息的本地系统路径
dfs.datanode.data.dir
file:/home/hadoop/app/hadoop2.7/tmp/data
DataNode结点被指定要存储数据的本地文件系统路径,这个值只对NameNode有效,DataNode并不需要使用到它
dfs.webhdfs.enabled
true
指定可以通过web访问hdfs目录
dfs.permissions.enabled
false
设置不启用 HDFS 文件系统的权限检查
mapred-site.xml 分布式计算框架MapReduce的配置文件
mapreduce.framework.name
yarn
配置MapReduce运行于yarn中
mapreduce.jobhistory.address
bigdata241:10020
mapreduce.jobhistory.webapp.address
bigdata241:19888
mapreduce.jobhistory.address
bigdata242:10020
mapreduce.jobhistory.webapp.address
bigdata242:19888
yarn.app.mapreduce.am.staging-dir
/tmp/yarn/MR-History
配置ApplicationMaster的jobhistory在hdfs存储路径
mapreduce.jobhistory.done-dir
${yarn.app.mapreduce.am.staging-dir}/history/done
mapreduce.jobhistory.intermediate-done-dir
${yarn.app.mapreduce.am.staging-ir}/history/done_intermediate
yarn-site.xml 分布式资源管理系统YARN的配置文件
Hadoop 2.4之前的版本,Yarn的ResourceManager是单点的。在Hadoop 2.4版本中,引入了ResourceManager HA。
主备模式切换有两种模式:
对于手工切换模式:
yarn rmadmin -transitionToActive rm1 yarn rmadmin -transitionToStandby rm1
对于自动切换模式,可以强制手工切换:
yarn rmadmin -transitionToActive rm1 --forcemanual
yarn rmadmin -transitionToStandby rm1 --forcemanual
yarn.resourcemanager.ha.automatic-failover.enabled
true
yarn.resourcemanager.connect.retry-interval.ms
2000
yarn.resourcemanager.recovery.enabled
true
yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms
5000
yarn.client.failover-proxy-provider
org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider
yarn.resourcemanager.ha.automatic-failover.zk-base-path
/yarn-leader-election
yarn.nodemanager.aux-services
mapreduce_shuffle,spark_shuffle
yarn.nodemanager.aux-services.mapreduce.shuffle.class
org.apache.hadoop.mapred.ShuffleHandler
yarn.nodemanager.aux-services.spark_shuffle.class
org.apache.spark.network.yarn.YarnShuffleService
spark.shuffle.service.port
7337
yarn.nodemanager.local-dirs
/home/hadoop/app/hadoop/tmp
yarn.nodemanager.log-dirs
/home/hadoop/app/hadoop/logs
yarn.scheduler.minimum-allocation-mb
512
yarn.scheduler.maximum-allocation-mb
4096
yarn.nodemanager.resource.memory-mb
16384
yarn.nodemanager.vmem-pmem-ratio
4.2
允许的虚拟内存倍数
yarn.nodemanager.resource.cpu-vcores
8
mapreduce.map.output.compress
true
mapreduce.map.output.compress.codec
org.apache.hadoop.io.compress.SnappyCodec
mapreduce.output.fileoutputformat.compress
true
mapreduce.output.fileoutputformat.compress.codec
org.apache.hadoop.io.compress.SnappyCodec
数据的压缩类型,这里使用Snappy压缩
mapreduce.output.fileoutputformat.compress.type
BLOCK
数据的压缩级别,这里设置按数据块压缩
yarn.log.server.url
http://bigdata241:19888/jobhistory/logs
历史日志对应路径
yarn.resourcemanager.scheduler.class
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
配置yarn启用容量调度模式(默认即是容量调度),配置文件为capacity-scheduler.xml
yarn.log-aggregation-enable
true
开启日志聚合功能,默认为false
yarn.log-aggregation.retain-seconds
259200
在HDFS上聚合的日志最长保留多少秒,这里配置为3天
一天yarn.log-aggregation.retain-check-interval-seconds
86400
清理过期聚合日志程序的执行间隔时间一天
yarn.nodemanager.remote-app-log-dir
/tmp/logs
聚合日志在hdfs上的目录
yarn.resourcemanager.ha.enabled
true
开启resourcemanager ha,默认为false
yarn.resourcemanager.cluster-id
yrc
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
bigdata241
node1
yarn.resourcemanager.hostname.rm2
bigdata242
node2
yarn.resourcemanager.zk-address
bigdata243:2181,bigdata244:2181,bigdata245:2181
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.nodemanager.aux-services.mapreduce.shuffle.class
org.apache.hadoop.mapred.ShuffleHandler
yarn.nodemanager.resource.memory-mb
51200
集群中机器都有100/200GB的RAM。部分RAM应保留用于操作系统。在每个节点上,我们将为YARN分配50GB RAM。以下属性设置YARN可在节点上使用的最大内存
yarn.nodemanager.vmem-pmem-ratio
2.1
yarn.resourcemanager.webapp.address.rm1
bigdata241:8088
yarn.resourcemanager.webapp.address.rm2
bigdata242:8088
slaves(子机名对应子机个数)
bigdata243
bigdata244
bigdata245
启动Hadoop集群准备 :root用户下,可以省略,阿里云服务器默认关闭防火墙
关闭防火墙(子机照做)
# systemctl disable firewalld
# systemctl stop firewalld
进程守护(子机照做)
# setenforce 0
# vi /etc/selinux/config 设置SELINUX=disabled
Yarn的资源分配
配置
配置FairScheduler一般需要配置两个文件。首先调度器相关的选项可以在yarn-site.xml文件中配置。其次,大多数情况下用户希望创建一个分配文件来列出哪些队列用来分配以及对应的权重和容量。这个分配文件会每10秒钟重新加载一次,从而支持运行时配置变更。
yarn-site.xml中的配置属性
yarn.scheduler.fair.allocation.file
分配文件的路径地址。分配文件是一个XML文件来描述队列和队列的属性以及特定的策略。这个文件必须是一个XML格式的文件。如果配置一个相对路径,那么该文件会在classpath中被搜索到。默认是fair-scheduler.xml。
yarn.scheduler.fair.user-as-default-queue
是否使用用户名关联分配的默认队列名称,如果是false或者未设置,所有的作业都有一个共享的默认队列,叫做default。默认是true。如果队列分配策略在分配文件中配置过,那么这个属性会被忽略。
yarn.scheduler.fair.preemption
是否抢占。默认false。
yarn.scheduler.fair.preemption.cluster-utilization-threshold
当抢占式配置后,配置使用阈值。该阈值计算是按照所有资源的容量使用量的最大比例来算的。默认是0.8f。
yarn.scheduler.fair.sizebasedweight
是否分配资源给独立的作业,基于作业的size而不是均等的分配所有的资源。设置为true时,应用的权重通过1+请求资源内存大小的自然对数来计算。默认是false。
yarn.scheduler.fair.assignmultiple
是否允许在一次心跳中进行多次容器分配。默认是false。
yarn.scheduler.fair.max.assign
如果上个属性设置为true,这个属性明确一次心跳中能分配的最大的容器数。默认是-1,表示没有限制。
yarn.scheduler.fair.locality.threshold.node
对于特定node上请求容器的应用作业,该属性代表了自从上次容器分配等待调度到其他节点node上的机会的次数。表示为0到1之间的一个浮点数,该数字表达了集群规模的比例,代表了向上传递的调度机会数。默认值是-1.0,代表不传递任何调度机会。
yarn.scheduler.fair.locality.threshold.rack
对于特定rack上请求容器的作业,该属性代表了自从上次容器分配等待调度到其他rack上的机会的次数。表示为0到1之间的一个浮点数,该数字表达了集群规模的比例,代表了向上传递的调度机会数。默认值是-1.0,代表不传递任何调度机会。
yarn.scheduler.fair.allow-undeclared-pools
如果为true,新的队列可以在作业提交时创建,无论是提交者指定的应用作业的队列还是default的队列。如果为false,应用作业在任何时间都会被分配到一个没有在分配文件张声明过的队列中,相反就只会分配到default队列。该属性默认是true。如果队列分配策略在分配文件中设置过,那么这个属性失效。
yarn.scheduler.fair.update-interval-ms
锁定调度器和重新计算资源分配和需求,检查是否有抢占的时间间隔属性。默认是500ms。