如何构建最优化的Hadoop集群
操作系统
我们选择Linux作为操作系统。Linux有许多不同的发行版,包括Ubuntu、RedHat和CentOS等,无论选择哪一个都可以。基于支持和许可费用的考虑,我们最终选择了CentOS 57。最好是定制一个CentOS的映像,把那些需要的软件都预装进去,这样所有的机器可以包含相同的软件和工具,这是一个很好的做法。
根据Cloudera的建议,OS层应该采用以下设置:
文件系统
Ext3文件系统
取消atime
不要使用逻辑卷管理
利用alternatives来管理链接
使用配置管理系统(Yum、Permission、sudoers等)
减少内核交换
撤销一般用户访问这些云计算机的权限
不要使用虚拟化
至少需要以下Linux命令:
/etc/alternatives
ln、chmod、chown、chgrp、mount、umount、kill、rm、yum、mkdir
硬件要求
由于Hadoop集群中只有两种节点(Namenode/Jobtracker和Datanode/Tasktracker),因此集群内的硬件配置不要超过两种或三种。
图2 - Hadoop集群服务器角色
硬件建议:
Namenode/Jobtracker:1Gb/s以太网口x2、16GB内存、4个CPU、100GB磁盘
Datanode:1Gb/s以太网口x2、8GB内存、4个CPU、多个磁盘,总容量500GB以上
实际的硬件配置可以与我们建议的配置不同,这取决于你们需要存储和处理的数据量。但我们强烈建议不要在集群中混用不同的硬件配置,以免那些较弱的机器成为系统的瓶颈。
Hadoop的机架感知
Hadoop有一个“机架感知”特性。管理员可以手工定义每个slave数据节点的机架号。为什么要做这么麻烦的事情有两个原因:防止数据丢失和提高网络性能。
图3 - Hadoop集群的机架感知
为了防止数据丢失,Hadoop会将每个数据块复制到多个机器上。想象一下,如果某个数据块的所有拷贝都在同一个机架的不同机器上,而这个机架刚好发生故障了(交换机坏了,或者电源掉了),这得有多悲剧为了防止出现这种情况,必须要有一个人来记住所有数据节点在网络中的位置,并且用这些知识来确定——把数据的所有拷贝们放在哪些节点上才是最明智的。这个“人”就是Name Node。
另外还有一个假设,即相比不同机架间的机器,同一个机架的机器之间有着更大的带宽和更小的延时。这是因为,机架交换机的上行带宽一般都小于下行带宽。而且,机架内的延时一般也小于跨机架的延时(但也不绝对)。
机架感知的缺点则是,我们需要手工为每个数据节点设置机架号,还要不断地更新这些信息,保证它们是正确的。要是机架交换机们能够自动向Namenode提供本机架的数据节点列表,那就太棒了。
Hadoop软件的安装和配置
Hadoop集群有多种构建方式:
手工下载tar文件并复制到集群中
利用Yum仓库
利用Puppet等自动化部署工具
我们不建议采用手工方式,那只适合很小的集群(4节点以下),而且会带来很多维护和排障上的问题,因为所有的变更都需要用scp或ssh的方式手工应用到所有的节点上去。
从以下方面来看,利用Puppet等部署工具是最佳的选择:
安装
配置
维护
扩展性
监控
排障
Puppet是Unix/Linux下的一个自动化管理引擎,它能基于一个集中式的配置执行增加用户、安装软件包、更新服务器配置等管理任务。我们将主要讲解如何利用Yum和Puppet来安装Hadoop。
利用Yum/Puppet搭建Hadoop集群
要利用Puppet搭建Hadoop集群,首先要符合以下前置条件:
包含所有必需Hadoop软件的中央仓库
用于Hadoop部署的Puppet装载单(manifest)
用于Hadoop配置管理的Puppet装载单
用于集群维护的框架(主要是sh或ksh脚本),以支持集群的start/stop/restart
利用puppet构建整个服务器(包括操作系统和其它软件)
注:如果要用Yum来安装Hadoop集群,则所有服务器应该预先构建完成,包括操作系统和其它软件都应安装完毕,yum仓库也应在所有节点上设置完毕。
构建Datanode/Tasktracker
如果用Yum安装Datanode/Tasktracker,需在所有数据节点上执行以下命令:
yum install hadoop-020-datanode –y
yum install hadoop-020-tasktracker –y
换成Puppet的话,则是:
class setup_datanode {
if ($is_datanode == true) {
make_dfs_data_dir { $hadoop_disks: }
make_mapred_local_dir { $hadoop_disks: }
fix_hadoop_parent_dir_perm { $hadoop_disks: }
}
# fix hadoop parent dir permissions
define fix_hadoop_parent_dir_perm() {
…
}
# make dfs data dir
define make_dfs_data_dir() {
…
}
# make mapred local and system dir
define make_mapred_local_dir() {
…
}
} # setup_datanode
构建Namenode(及辅助Namenode)
如果用Yum安装Namenode,需在所有数据节点上执行以下命令:
yum install hadoop-020-namenode –y
yum install hadoop-020-secondarynamenode –y
换成Puppet的话,则是:
class setup_namenode {
if ($is_namenode == true or $is_standby_namenode == true) {
}
exec {"namenode-dfs-perm":
}
exec { "make ${nfs_namenode_dir}/dfs/name":
}
exec { "chgrp ${nfs_namenode_dir}/dfs/name":
}
if ($standby_namenode_host != "") {
}
exec { "own $nfs_standby_namenode_dir":
}
}
# /standby_namenode_hadoop
if ($standby_namenode_host != "") {
}
exec { "own $standby_namenode_hadoop_dir":
}
}
}
}
class setup_secondary_namenode {
if ($is_secondarynamenode == true) {
}
}
exec {"namenode-dfs-perm":
}
}
}
构建JobTracker
如果用Yum安装Jobtracker,需在所有数据节点上执行以下命令:
yum install hadoop-020-jobtracker –y
换成Puppet的话,则是使用与构建Namenode相同的装载单,唯一的区别在于,在Jobtracker机器上,会启动Jobtracker——即将该机器上的is_jobtracker设置为true。
2000W已经算是大型网站了,不论数据量还有访问量都是非常大的,像这种情况下可以有两种配置方案,第一就是用很多台服务器通过集群来满足咱们的需要 第二就是配置高端的服务器来满足需求比如IBM的刀片服务器或者小型机,总体没个一二百W下不来
我们是IBM服务器的代理商 主做机房建设 系统集成 有需要了可以联系我 资料有我的****
按服务器的处理器架构(也就是服务器CPU所采用的指令系统)划分把服务器分为CISC架构服务器、RISC架构服务器和VLIW架构服务器三种。 CISC的英文全称为“Complex Instruction Set Computer”,即“复杂指令系统计算机”,从计算机诞生以来,人们一直沿用CISC指令集方式。早期的桌面软件是按CISC设计的,所以,微处理器(CPU)厂商一直在走CISC的发展道路,包括Intel、AMD,还有其他一些已经更名的厂商,如TI(德州仪器)、Cyrix以及VIA(威盛)等。在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。CISC架构的服务器主要以IA-32架构(Intel Architecture,英特尔架构)为主,而且多数为中低档服务器所采用。
如果企业的应用都是基于NT平台的应用,那么服务器的选择基本上就定位于IA架构(CISC架构)的服务器。如果企业的应用主要是基于Linux操作系统,那么服务器的选择也是基于IA结构的服务器。如果应用必须是基于Solaris的,那么服务器只能选择SUN服务器。如果应用基于AIX(IBM的Unix操作系统)的,那么只能选择IBM Unix服务器(RISC架构服务器)。 台式服务器也称为“塔式服务器”。有的台式服务器采用大小与普通立式计算机大致相当的机箱,有的采用大容量的机箱,像个硕大的柜子。低档服务器由于功能较弱,整个服务器的内部结构比较简单,所以机箱不大,都采用台式机箱结构。这里所介绍的台式不是平时普通计算机中的台式,立式机箱也属于台式机范围,这类服务器在整个服务器市场中占有相当大的份额。
优点:塔式服务器它的外形以及结构都跟我们平时使用的立式PC差不多,由于服务器的主板扩展性较强、插槽也多出一堆,所以个头比普通主板大一些,因此塔式服务器的主机机箱也比标准的ATX机箱要大,一般都会预留足够的内部空间以便日后进行硬盘和电源的冗余扩展。
由于塔式服务器的机箱比较大,服务器的配置也可以很高,冗余扩展更可以很齐备,所以它的应用范围非常广,应该说目前使用率最高的一种服务器就是塔式服务器。
缺点:目前常见的入门级和工作组级服务器基本上都采用这一服务器结构类型,不过由于只有一台主机,即使进行升级扩张也有个限度,所以在一些应用需求较高的企业中,单机服务器就无法满足要求了,需要多机协同工作,而塔式服务器个头太大,独立性太强,协同工作在空间占用和系统管理上都不方便,这也是塔式服务器的局限性。不过,总的来说,这类服务器的功能、性能基本上能满足大部分企业用户的要求,其成本通常也比较低,因此这类服务器还是拥有非常广泛的应用支持。 机架式服务器的外形看来不像计算机,而像交换机,有1U(1U=175英寸)、2U、4U等规格。机架式服务器安装在标准的19英寸机柜里面。这种结构的多为功能型服务器。
优点:作为为互联网设计的服务器模式,机架服务器是一种外观按照统一标准设计的服务器,配合机柜统一使用。可以说机架式是一种优化结构的塔式服务器,它的设计宗旨主要是为了尽可能减少服务器空间的占用,而减少空间的直接好处就是在机房托管的时候价格会便宜很多。
很多专业网络设备都是采用机架式的结构(多为扁平式,就像个抽屉),如交换机、路由器、硬件防火墙这些。机架服务器的宽度为19英寸,高度以U为单位(1U=175英寸=4445毫米),通常有1U,2U,3U,4U,5U,7U)几种标准的服务器。机柜的尺寸也是采用通用的工业标准,通常从22U到42U不等;机柜内按U的高度有可拆卸的滑动拖架,用户可以根据自己服务器的标高灵活调节高度,以存放服务器、集线器、磁盘阵列柜等网络设备。服务器摆放好后,它的所有I/O线全部从机柜的后方引出(机架服务器的所有接口也在后方),统一安置在机柜的线槽中,一般贴有标号,便于管理。
缺点:机架式服务器因为空间比塔式服务器大大缩小,所以这类服务器在扩展性和散热问题上受到一定的限制,配件也要经过一定的筛选,一般都无法实现太完整的设备扩张,所以单机性能就比较有限,应用范围也比较有限,只能专注于某一方面的应用,如远程存储和Web服务的提供等 在一些高档企业服务器中由于内部结构复杂,内部设备较多,有的还具有许多不同的设备单元或几个服务器都放在一个机柜中,这种服务器就是机柜式服务器。
对于证券、银行、邮电等重要企业,则应采用具有完备的故障自修复能力的系统,关键部件应采用冗余措施,对于关键业务使用的服务器也可以采用双机热备份高可用系统或者是高性能计算机,这样的系统可用性就可以得到很好的保证。 刀片式服务器是一种HAHD(High Availability High Density,高可用高密度)的低成本服务器平台,是专门为特殊应用行业和高密度计算机环境设计的,其中每一块“刀片”实际上就是一块系统母板,类似于一个个独立的服务器。在这种模式下,每一个母板运行自己的系统,服务于指定的不同用户群,相互之间没有关联。不过可以使用系统软件将这些母板集合成一个服务器集群。在集群模式下,所有的母板可以连接起来提供高速的网络环境,可以共享资源,为相同的用户群服务。当前市场上的刀片式服务器有两大类:一类主要为电信行业设计,接口标准和尺寸规格符合PICMG(PCI Industrial Computer Manufacturer's Group)1x或2x,未来还将推出符合PICMG 3x 的产品,采用相同标准的不同厂商的刀片和机柜在理论上可以互相兼容;另一类为通用计算设计,接口上可能采用了上述标准或厂商标准,但 尺寸规格是厂商自定,注重性能价格比,属于这一类的产品居多。刀片式服务器目前最适合群集计算和IxP提供互联网服务。
优点:刀片服务器适用于数码媒体、医学、航天、军事、通讯等多种领域。其中每一块“刀片”实际上就是一块系统主板。它们可以通过本地硬盘启动自己的操作系统,如Windows NT/2000、Linux、Solaris等等,类似于一个个独立的服务器。
在这种模式下,每一个主板运行自己的系统,服务于指定的不同用户群,相互之间没有关联。不过可以用系统软件将这些主板集合成一个集群服务器。在集群模式下,所有的主板可以连接起来提供高速的网络环境,可以共享资源,为相同的用户群服务。在集群中插入新的“刀片”,就可以提高整体性能。而由于每块“刀片”都是热插拔的,所以,系统可以轻松地进行替换,并且将维护时间减少到最小。值得一提的是,系统配置可以通过一套智能KVM和9个或10个带硬盘的CPU板来实现。CPU可以配置成为不同的子系统。一个机架中的服务器可以通过新型的智能KVM转换板共享一套光驱、软驱、键盘、显示器和鼠标,以访问多台服务器,从而便于进行升级、维护和访问服务器上的文件。
就学习强度来说,Python相对于Java来说更加简单易懂,学习起来也非常容易;而从应用范围来看,Java的应用虽然比较广泛,但随着近两年来人工智能、大数据、云计算的兴起,Python的应用领域正在逐渐扩大,甚至已经反超Java,成为新时代的必会语言。
作为一门面向对象编程语言,Java不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。同时,Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。所以Java具有优美、严谨、不易出错、使用广泛等优点,成为使用最多的语言之一。
而Python则是一种面向对象的解释型计算机程序设计语言。它是纯粹的自由软件,源代码和解释器CPython严格遵循着GPL(GNU General Public License)协议。Python的语法简洁清晰,特色之一是强制用空白符作为语句缩进。它的语法简洁优美,功能强大,同时标准库和第三方库也非常强大,应用领域非常广。
Java的几种分布式框架:
1、Ehcache – Java分布式缓存框架
EhCache 可以有效地减轻数据库的负载,可以让数据保存在不同服务器的内存中,在需要数据的时候可以快速存取。同时EhCache 扩展非常简单,官方提供的Cache配置方式有好几种。你可以通过声明配置、在xml中配置、在程序里配置或者调用构造方法时传入不同的参数。
官方网站:http://ehcacheorg/
使用教程:http://wwwcodeceocom/article/java-ehcachehtml
2、ASimpleCache – 轻量级Android缓存框架
ASimpleCache是一款基于Android的轻量级缓存框架,它只有一个Java文件,ASimpleCache基本可以缓存常用的Android对象,包括普通字符串、JSON对象、经过序列化的Java对象、字节数组等。
官方网站:https://githubcom/yangfuhai/ASimpleCache
使用教http://wwwcodeceocom/article/asimplecache-android-cachehtml
3、JBoss Cache – 基于事物的Java缓存框架
JBoss Cache是一款基于Java的事务处理缓存系统,它的目标是构建一个以Java框架为基础的集群解决方案,可以是服务器应用,也可以是Java SE应用。
官方网站:http://jbosscachejbossorg/
使用教程:http://wwwcodeceocom/article/jboss-cache-javahtml
4、Voldemort – 基于键-值(key-value)的缓存框架
Voldemort是一款基于Java开发的分布式键-值缓存系统,像JBoss Cache一样,Voldemort同样支持多台服务器之间的缓存同步,以增强系统的可靠性和读取性能。
官方网站:http://wwwproject-voldemortcom/voldemort/
使用教程:http://wwwcodeceocom/article/voldemort-java-key-value-catchhtml
首先,这种框架现在市面上是有的。强烈建议,不要重复造轮子。
先介绍几种比较主流的。
Elastic-Job,是当当网开源的分布式调度解决方案,支持任务分片功能,可以充分利用资源。Elastic-Job有两个独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。具体实现可以参考官方教程。其整体架构图如下。
Elastic-Job的特点:
1、分布式调度 2、作业高可用 3、任务分片执行。
另外,还有其他的一些框架,可以对比使用。比如TBSchedule是阿里巴巴开源的分布式调度框架,完全由java实现,目前被应用于淘宝,阿里巴巴,支付宝,京东, 汽车 之家等。大众点评开源的xxl-job,也是应用比较广泛的分布式调度任务。
目前我使用过的有 Elastic-Job和xxl-job。两者功能都很强大,后台管理也比较完善。很容易上手。都可以满足日常的工作需要。区别就是 Elastic-Job依赖zk,但是xxl-job不依赖zk,只依赖数据库。
目前市面上应该还有一些其他的框架,但是以上是比较主流的,可以根据自己的需要来选择。切记不要重复造轮子,造轮子需要大量的时间去验证。会让你在坑里爬不出来。
1XXL-JOB
2Elastic-Job
Elastic-Job 是一个分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成。
定位为轻量级无中心化解决方案,使用 jar 包的形式提供分布式任务的协调服务。
支持分布式调度协调、弹性扩容缩容、失效转移、错过执行作业重触发、并行调度、自诊断和修复等等功能特性。
分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。
Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。选择该项目可以满足大多数it企业的需求。
Elastic-Job-Cloud使用Mesos + Docker的解决方案,额外提供资源治理、应用分发以及进程隔离等服务。
轻量级无中心化:Elastic-Job-Lite并无作业调度中心节点,而是基于部署作业框架的程序在到达相应时间点时各自触发调度。
灵活的增删改查作业,集中式管理调度作业
支持高可用:一旦执行作业的服务器崩溃,等待执行的服务器将会在下次作业启动时替补执行。开启失效转移功能效果更好,可以保证在本次作业执行时崩溃,备机立即启动替补执行。
支持分片:作业分片一致性,保证同一分片在分布式环境中仅一个执行实例
任务监控:通过监听Elastic-Job-Lite的zookeeper注册中心的几个关键节点即可完成作业运行状态监控功能
一致性:使用zookeeper作为注册中心,为了保证作业的在分布式场景下的一致性,一旦作业与注册中心无法通信,运行中的作业会立刻停止执行,但作业的进程不会退出,这样做的目的是为了防止作业重分片时,将与注册中心失去联系的节点执行的分片分配给另外节点,导致同一分片在两个节点中同时执行。
同时支持动态扩容,将任务拆分为n个任务项后,各个服务器分别执行各自分配到的任务项。一旦有新的服务器加入集群,或现有服务器下线,elastic-job将在保留本次任务执行不变的情况下,下次任务开始前触发任务重分片
3opencron
opencron是一个功能完善且通用的开源定时任务调度系统,拥有先进可靠的自动化任务管理调度功能,提供可操作的 web 图形化管理满足多种场景下各种复杂的定时任务调度,同时集成了 linux 实时监控、webssh 等功能特性
4quartz
支持集群和分布式,但是没有友好的管理界面,功能单一,对于管理调用的任务比较困难。
quartz使用数据库锁。在quartz的集群解决方案里有张表scheduler_locks,quartz采用了悲观锁的方式对triggers表进行行加锁,以保证任务同步的正确性。一旦某一个节点上面的线程获取了该锁,那么这个Job就会在这台机器上被执行,同时这个锁就会被这台机器占用。同时另外一台机器也会想要触发这个任务,但是锁已经被占用了,就只能等待,直到这个锁被释放。
quartz的分布式调度策略是以数据库为边界资源的一种异步策略。各个调度器都遵守一个基于数据库锁的操作规则从而保证了操作的唯一性。同时多个节点的异步运行保证了服务的可靠。但这种策略有自己的局限性:集群特性对于高CPU使用率的任务效果很好,但是对于大量的短任务,各个节点都会抢占数据库锁,这样就出现大量的线程等待资源。这种情况随着节点的增加会越来越严重。
缺点:quartz的分布式只是解决了高可用的问题,并没有解决任务分片的问题,还是会有单机处理的极限。
5Saturn
Saturn
基于当当Elastic Job代码基础上自主研发的任务调度系统,是唯品会开源的分布式作业调度平台,取代传统的Linux Cron/Spring Batch Job的方式,做到统一配置,统一监控,任务高可用以及分片并发处理。主要是去中心化,高可用,可分片,动态扩容,有认证和授权功能。
主要特性
支持多种语言作业,语言无关(Java/Go/C++/PHP/Python/Ruby/shell)
支持秒级调度
支持作业分片并行执行
支持依赖作业串行执行
支持作业高可用和智能负载均衡
支持异常检测和自动失败转移
支持异地容灾
支持多个集群部署
支持跨机房区域部署
支持弹性动态扩容
支持优先级和权重设置
支持docker容器,容器化友好
支持cron时间表达式
支持多个时间段暂停执行控制
支持超时告警和超时强杀控制
支持灰度发布
支持异常、超时和无法高可用作业监控告警和简易的故障排除
支持失败率最高、最活跃和负荷最重的各域各节点TOP10的作业统计
优点:源码清晰,学习入手容易。应用部署简单,提供运维控制台,集中管理作业,运维控制台功能强大,提供作业统计报表 ,告警,增删改查作业,作业统一配置。
最后一个是国内团队封装的
前端时间研究了两款分布式任务调度框架,一个是XXL-Job,现在非常主流,很多常见的一些公司都在使用,像滴滴美团这样的公司都在用,这也是一款开源产品,下载下来导入IDEA就可以使用,分调度器和执行器和管理UI,有很美观的UI界面,可以对任务做增删改查,以及支持自定义开发,有很详细的帮助文档,还提供有demo,傻瓜式的,很简单,亮点是提供了管理界面。
另一个是Quartz,这个组件单机和集群都支持,单机的话是RAMJobStore任务存储,而要支持集群的话,就要将配置改成数据库方式,Quartz提供的有十几张表,其分布式的原理是利用了数据库的行锁,Quartz很简单,也是一款轻量级的开源产品,我们公司一直用这款组件,很成熟无Bug,推荐使用!
springcloudtask,springclouddataflow,正在学习中
0条评论