为了账号安全,请及时绑定邮箱和手机立即绑定

关于hadoop 系统是怎样增加节点的?

/ 猿问

关于hadoop 系统是怎样增加节点的?

慕桂英546537 2019-09-09 14:10:39

hadoop 系统是怎样增加节点的


查看完整描述

3 回答

?
潇湘沐

Hadoop添加节点的方法
自己实际添加节点过程:
1. 先在slave上配置好环境,包括ssh,jdk,相关config,lib,bin等的拷贝;
2. 将新的datanode的host加到集群namenode及其他datanode中去;
3. 将新的datanode的ip加到master的conf/slaves中;
4. 重启cluster,在cluster中看到新的datanode节点;
5. 运行bin/start-balancer.sh,这个会很耗时间
备注:
1. 如果不balance,那么cluster会把新的数据都存放在新的node上,这样会降低mr的工作效率;
2. 也可调用bin/start-balancer.sh 命令执行,也可加参数 -threshold 5
threshold 是平衡阈值,默认是10%,值越低各节点越平衡,但消耗时间也更长。
3. balancer也可以在有mr job的cluster上运行,默认dfs.balance.bandwidthPerSec很低,为1M/s。在没有mr job时,可以提高该设置加快负载均衡时间。

其他备注:
1. 必须确保slave的firewall已关闭;
2. 确保新的slave的ip已经添加到master及其他slaves的/etc/hosts中,反之也要将master及其他slave的ip添加到新的slave的/etc/hosts中
mapper及reducer个数
url地址: http://wiki.apache.org/hadoop/HowManyMapsAndReduces
HowManyMapsAndReduces
Partitioning your job into maps and reduces
Picking the appropriate size for the tasks for your job can radically change the performance of Hadoop. Increasing the number of tasks increases the framework overhead, but increases load balancing and lowers the cost of failures. At one extreme is the 1 map/1 reduce case where nothing is distributed. The other extreme is to have 1,000,000 maps/ 1,000,000 reduces where the framework runs out of resources for the overhead.
Number of Maps
The number of maps is usually driven by the number of DFS blocks in the input files. Although that causes people to adjust their DFS block size to adjust the number of maps. The right level of parallelism for maps seems to be around 10-100 maps/node, although we have taken it up to 300 or so for very cpu-light map tasks. Task setup takes awhile, so it is best if the maps take at least a minute to execute.
Actually controlling the number of maps is subtle. The mapred.map.tasks parameter is just a hint to the InputFormat for the number of maps. The default InputFormat behavior is to split the total number of bytes into the right number of fragments. However, in the default case the DFS block size of the input files is treated as an upper bound for input splits. A lower bound on the split size can be set via mapred.min.split.size. Thus, if you expect 10TB of input data and have 128MB DFS blocks, you'll end up with 82k maps, unless your mapred.map.tasks is even larger. Ultimately the [WWW] InputFormat determines the number of maps.
The number of map tasks can also be increased manually using the JobConf's conf.setNumMapTasks(int num). This can be used to increase the number of map tasks, but will not set the number below that which Hadoop determines via splitting the input data.
Number of Reduces
The right number of reduces seems to be 0.95 or 1.75 * (nodes * mapred.tasktracker.tasks.maximum). At 0.95 all of the reduces can launch immediately and start transfering map outputs as the maps finish. At 1.75 the faster nodes will finish their first round of reduces and launch a second round of reduces doing a much better job of load balancing.
Currently the number of reduces is limited to roughly 1000 by the buffer size for the output files (io.buffer.size * 2 * numReduces << heapSize). This will be fixed at some point, but until it is it provides a pretty firm upper bound.
The number of reduces also controls the number of output files in the output directory, but usually that is not important because the next map/reduce step will split them into even smaller splits for the maps.
The number of reduce tasks can also be increased in the same way as the map tasks, via JobConf's conf.setNumReduceTasks(int num).
自己的理解:
mapper个数的设置:跟input file 有关系,也跟filesplits有关系,filesplits的上线为dfs.block.size,下线可以通过mapred.min.split.size设置,最后还是由InputFormat决定。

较好的建议:
The right number of reduces seems to be 0.95 or 1.75 multiplied by (<no. of nodes> * mapred.tasktracker.reduce.tasks.maximum).increasing the number of reduces increases the framework overhead, but increases load balancing and lowers the cost of failures.
<property>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>2</value>
<description>The maximum number of reduce tasks that will be run
simultaneously by a task tracker.
</description>
</property>

单个node新加硬盘
1.修改需要新加硬盘的node的dfs.data.dir,用逗号分隔新、旧文件目录
2.重启dfs

同步hadoop 代码
hadoop-env.sh
# host:path where hadoop code should be rsync'd from. Unset by default.
# export HADOOP_MASTER=master:/home/$USER/src/hadoop

用命令合并HDFS小文件
hadoop fs -getmerge <src> <dest>

重启reduce job方法
Introduced recovery of jobs when JobTracker restarts. This facility is off by default.
Introduced config parameters "mapred.jobtracker.restart.recover", "mapred.jobtracker.job.history.block.size", and "mapred.jobtracker.job.history.buffer.size".
还未验证过。

IO写操作出现问题
0-1246359584298, infoPort=50075, ipcPort=50020):Got exception while serving blk_-5911099437886836280_1292 to /172.16.100.165:
java.net.SocketTimeoutException: 480000 millis timeout while waiting for channel to be ready for write. ch : java.nio.channels.SocketChannel[connected local=/
172.16.100.165:50010 remote=/172.16.100.165:50930]
at org.apache.hadoop.net.SocketIOWithTimeout.waitForIO(SocketIOWithTimeout.java:185)
at org.apache.hadoop.net.SocketOutputStream.waitForWritable(SocketOutputStream.java:159)
at org.apache.hadoop.net.SocketOutputStream.transferToFully(SocketOutputStream.java:198)
at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendChunks(BlockSender.java:293)
at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendBlock(BlockSender.java:387)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.readBlock(DataXceiver.java:179)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:94)
at java.lang.Thread.run(Thread.java:619)

It seems there are many reasons that it can timeout, the example given in
HADOOP-3831 is a slow reading client.

解决办法:在hadoop-site.xml中设置dfs.datanode.socket.write.timeout=0试试;
My understanding is that this issue should be fixed in Hadoop 0.19.1 so that
we should leave the standard timeout. However until then this can help
resolve issues like the one you're seeing.

HDFS退服节点的方法
目前版本的dfsadmin的帮助信息是没写清楚的,已经file了一个bug了,正确的方法如下:
1. 将 dfs.hosts 置为当前的 slaves,文件名用完整路径,注意,列表中的节点主机名要用大名,即 uname -n 可以得到的那个。
2. 将 slaves 中要被退服的节点的全名列表放在另一个文件里,如 slaves.ex,使用 dfs.host.exclude 参数指向这个文件的完整路径
3. 运行命令 bin/hadoop dfsadmin -refreshNodes
4. web界面或 bin/hadoop dfsadmin -report 可以看到退服节点的状态是 Decomission in progress,直到需要复制的数据复制完成为止
5. 完成之后,从 slaves 里(指 dfs.hosts 指向的文件)去掉已经退服的节点

附带说一下 -refreshNodes 命令的另外三种用途:
2. 添加允许的节点到列表中(添加主机名到 dfs.hosts 里来)
3. 直接去掉节点,不做数据副本备份(在 dfs.hosts 里去掉主机名)
4. 退服的逆操作——停止 exclude 里面和 dfs.hosts 里面都有的,正在进行 decomission 的节点的退服,也就是把 Decomission in progress 的节点重新变为 Normal (在 web 界面叫 in service)

Hadoop添加节点的方法
自己实际添加节点过程:
1. 先在slave上配置好环境,包括ssh,jdk,相关config,lib,bin等的拷贝;
2. 将新的datanode的host加到集群namenode及其他datanode中去;
3. 将新的datanode的ip加到master的conf/slaves中;
4. 重启cluster,在cluster中看到新的datanode节点;
5. 运行bin/start-balancer.sh,这个会很耗时间
备注:
1. 如果不balance,那么cluster会把新的数据都存放在新的node上,这样会降低mr的工作效率;
2. 也可调用bin/start-balancer.sh 命令执行,也可加参数 -threshold 5
threshold 是平衡阈值,默认是10%,值越低各节点越平衡,但消耗时间也更长。
3. balancer也可以在有mr job的cluster上运行,默认dfs.balance.bandwidthPerSec很低,为1M/s。在没有mr job时,可以提高该设置加快负载均衡时间。

其他备注:
1. 必须确保slave的firewall已关闭;
2. 确保新的slave的ip已经添加到master及其他slaves的/etc/hosts中,反之也要将master及其他slave的ip添加到新的slave的/etc/hosts中



查看完整回答
反对 回复 2019-09-14
?
慕斯709654

越来越多的企业开始使用Hadoop来对大数据进行处理分析,但Hadoop集群的整体性能却取决于CPU、内存、网络以及存储之间的性能平衡。而在这篇文章中,我们将探讨如何为Hadoop集群构建高性能网络,这是对大数据进行处理分析的关键所在。

  关于Hadoop

  “大数据”是松散的数据集合,海量数据的不断增长迫使企业需要通过一种新的方式去管理。大数据是结构化或非结构化的多种数据类型的大集合。而 Hadoop则是Apache发布的软件架构,用以分析PB级的非结构化数据,并将其转换成其他应用程序可管理处理的形式。Hadoop使得对大数据处理成为可能,并能够帮助企业可从客户数据之中发掘新的商机。如果能够进行实时处理或者接近实时处理,那么其将为许多行业的用户提供强大的优势。

  Hadoop是基于谷歌的MapReduce和分布式文件系统原理而专门设计的,其可在通用的网络和服务器硬件上进行部署,并使之成为计算集群。

  Hadoop模型

  Hadoop的工作原理是将一个非常大的数据集切割成一个较小的单元,以能够被查询处理。同一个节点的计算资源用于并行查询处理。当任务处理结束后,其处理结果将被汇总并向用户报告,或者通过业务分析应用程序处理以进行进一步分析或仪表盘显示。

  为了最大限度地减少处理时间,在此并行架构中,Hadoop“moves jobs to data”,而非像传统模式那样“moving data to jobs”。这就意味着,一旦数据存储在分布式系统之中,在实时搜索、查询或数据挖掘等操作时,如访问本地数据,在数据处理过程中,各节点之间将只有一个本地查询结果,这样可降低运营开支。

  Hadoop的最大特点在于其内置的并行处理和线性扩展能力,提供对大型数据集查询并生成结果。在结构上,Hadoop主要有两个部分:

  Hadoop分布式文件系统(HDFS)将数据文件切割成数据块,并将其存储在多个节点之内,以提供容错性和高性能。除了大量的多个节点的聚合I/O,性能通常取决于数据块的大小——如128MB。而传统的Linux系统下的较为典型的数据块大小可能是4KB。

  MapReduce引擎通过JobTracker节点接受来自客户端的分析工作,采用“分而治之”的方式来将一个较大的任务分解成多个较小的任务,然后分配给各个TaskTrack节点,并采用主站/从站的分布方式(具体如下图所示):

Hadoop系统有三个主要的功能节点:客户机、主机和从机。客户机将数据文件注入到系统之中,从系统中检索结果,以及通过系统的主机节点提交分析工作等。主机节点有两个基本作用:管理分布式文件系统中各节点以及从机节点的数据存储,以及管理Map/Reduce从机节点的任务跟踪分配和任务处理。数据存储和分析处理的实际性能取决于运行数据节点和任务跟踪器的从机节点性能,而这些从机节点则由各自的主机节点负责沟通和控制。从节点通常有多个数据块,并在作业期间被分配处理多个任务。

  部署实施Hadoop

  各个节点硬件的主要要求是市县计算、内存、网络以及存储等四个资源的平衡。目前常用的并被誉为“最佳”的解决方案是采用相对较低成本的旧有硬件,部署足够多的服务器以应对任何可能的故障,并部署一个完整机架的系统。

  Hadoop模式要求服务器与SAN或者NAS进行直接连接存储(DAS)。采用DAS主要有三个原因,在标准化配置的集群中,节点的缩放数以千计,随着存储系统的成本、低延迟性以及存储容量需求不断提高,简单配置和部署个主要的考虑因素。随着极具成本效益的1TB磁盘的普及,可使大型集群的TB级数据存储在DAS之上。这解决了传统方法利用SAN进行部署极其昂贵的困境,如此多的存储将使得Hadoop和数据存储出现一个令人望而却步的起始成本。有相当大一部分用户的Hadoop部署构建都是采用大容量的DAS服务器,其中数据节点大约1-2TB,名称控制节点大约在1-5TB之间,具体如下图所示:

来源:Brad Hedlund, DELL公司

  对于大多数的Hadoop部署来说,基础设施的其他影响因素可能还取决于配件,如服务器内置的千兆以太网卡或千兆以太网交换机。上一代的CPU和内存等硬件的选择,可根据符合成本模型的需求,采用匹配数据传输速率要求的千兆以太网接口来构建低成本的解决方案。采用万兆以太网来部署Hadoop也是相当不错的选择。

  万兆以太网对Hadoop集群的作用

  千兆以太网的性能是制约Hadoop系统整体性能的一个主要因素。使用较大的数据块大小,例如,如果一个节点发生故障(甚至更糟,整个机架宕机),那么整个集群就需要对TB级的数据进行恢复,这就有可能会超过千兆以太网所能提供的网络带宽,进而使得整个集群性能下降。在拥有成千上万个节点的大型集群中,当运行某些需要数据节点之间需要进行中间结果再分配的工作负载时,在系统正常运行过程中,某个千兆以太网设备可能会遭遇网络拥堵。

  每一个Hadoop数据节点的目标都必须实现CPU、内存、存储和网络资源的平衡。如果四者之中的任意一个性能相对较差的话,那么系统的潜在处理能力都有可能遭遇瓶颈。添加更多的CPU和内存组建,将影响存储和网络的平衡,如何使Hadoop集群节点在处理数据时更有效率,减少结果,并在Hadoop集群内添加更多的HDFS存储节点。

  幸运的是,影响CPU和内存发展的摩尔定律,同样也正影响着存储技术(TB级容量的磁盘)和以太网技术(从千兆向万兆甚至更高)的发展。预先升级系统组件(如多核处理器、每节点5-20TB容量的磁盘,64-128GB内存),万兆以太网卡和交换机等网络组件是重新平衡资源最合理的选择。万兆以太网将在Hadoop集群证明其价值,高水平的网络利用率将带来效益更高的带宽。下图展示了Hadoop集群与万兆以太网的连接:

许多企业级数据中心已经迁移到10GbE网络,以实现服务器整合和服务器虚拟化。随着越来越多企业开始部署Hadoop,他们发现他们完全不必要大批量部署1U的机架服务器,而是部署更少,但性能更高的服务器,以方便扩展每个数据节点所能运行的任务数量。很多企业选择部署2U或4U的服务器(如戴尔 PowerEdge C2100),每个节点大约12-16个核心以及24TB存储容量。在这种环境下的合理选择是充分利用已经部署的10GbE设备和Hadoop集群中的 10GbE网卡。

  在日常的IT环境中构建一个简单的Hadoop集群。可以肯定的是,尽管有很多细节需要微调,但其基础是非常简单的。构建一个计算、存储和网络资源平衡的系统,对项目的成功至关重要。对于拥有密集节点的Hadoop集群而言,万兆以太网能够为计算和存储资源扩展提供与之相匹配的能力,且不会导致系统整体性能下降。



查看完整回答
反对 回复 2019-09-14
?
凤凰求蛊

直接用机器搭建Hadoop集群是一个相当痛苦的过程,尤其对初学者来说。他们还没开始跑wordcount,可能就被这个问题折腾的体无完肤了。而且也不是每个人都有好几台机器对吧。你可以尝试用多个虚拟机搭建,前提是你有个性能杠杠的机器。

我的目标是将Hadoop集群运行在Docker容器中,使Hadoop开发者能够快速便捷地在本机搭建多节点的Hadoop集群。其实这个想法已经有了不少实现,但是都不是很理想,他们或者镜像太大,或者使用太慢,或者使用了第三方工具使得使用起来过于复杂。下表为一些已知的Hadoop on Docker项目以及其存在的问题。

项目 镜像大小 问题
sequenceiq/hadoop-docker:latest 1.491GB 镜像太大,只支持单个节点
sequenceiq/hadoop-docker:2.7.0 1.76 GB
sequenceiq/hadoop-docker:2.60 1.624GB

sequenceiq/ambari:latest 1.782GB 镜像太大,使用太慢,使用复杂
sequenceiq/ambari:2.0.0 4.804GB
sequenceiq/ambari:latest:1.70 4.761GB

alvinhenrick/hadoop-mutinode 4.331GB 镜像太大,构建太慢,增加节点麻烦,有bug

我的项目参考了alvinhenrick/hadoop-mutinode项目,不过我做了大量的优化和重构。

查看完整回答
反对 回复 2019-09-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信