文中,我们介绍了Hadoop集群部署模型中的2个类型,分别是存储/计算绑定模型和单一计算模型。这篇文章我们会着重介绍存储/计算分离的Hadoop集群部署模型。
存储和计算节点分离模型(Data-ComputeSeparation Deployment)
如果你把存储和计算部署在相同的节点内,这固然可以达到数据本地化(DataLocality)的需要,但是当你的计算能力不足需要扩容时,增加计算节点的同时也必须增加存储节点。因此存储和计算绑定模型下,对于存储和计算节点的扩容必须同时进行,无法灵活定制,这难免会造成计算或存储资源的浪费。
这里我们向您推荐一种新的部署模型——存储和计算节点分离模型。该模型是指您可以把存储服务(DataNode)和计算服务(TaskTracker)等分开部署在不同的虚拟机中。这样您既可以灵活地为存储节点和计算节点单独扩容,也为多个计算集群共享相同的存储集群打下基础,为您节省了绑定模式下扩容导致的资源浪费,减少CAPEX,也避免了维护多个存储集群、造成大量数据迁移拷贝的OPEX麻烦。关于多个计算集群使用同一的存储,请参见本文的自定制集群部分。
但是纯粹的分离模型并不能保证传统的Hadoop的数据本地性特性。因此BDE做了相应改进。用户可以指定将独立的计算节点虚拟机部署在存储节点所在的物理主机(Host)上,这样就避免其间的通信经过网络。
为了方便用户控制存储节点和计算节点的拓扑,BDE提供了几类节点分布策略。首先是单位主机节点数目策略(InstancePerHost),用户可以指定在同一台物理主机上,同时运行的存储节点和计算节点的数目;其次,节点组依赖关系(GroupAssociation),用户也可以指定计算节点组和存储节点组之间的依赖关系——弱依赖(weakgroupAssociation)和严格依赖(strictgroupAssociation)等;第三,当然对于任何一种部署模型,BigData Extensions都提供机架感知网络拓扑结构策略(RackAwareness),这部分与本文关系不大,如果您感兴趣,请参考BDE的官方用户手册获取更多信息。
因此,后续我们会从不适用任何分布策略和应用分布策略两个方面为大家详细介绍本模型。
不包含主机排布限制的存储/计算分离模型
BDE支持部署不包含任何节点排布限制的存储/计算分离的Hadoop集群。部署计算节点时不会考虑存储节点的主机排布,也无法利用存储节点的磁盘空间作为计算节点运行任务的临时文件夹(BDE提供的TempFS功能能够让计算节点利用存储节点的磁盘空间作为运行Job的临时文件夹。有关TempFS简介,请参加下一小节的介绍)。这种集群无法充分支持Hadoop的数据本地化特性,适用于简单的概念验证(PoC)。
下面列举了这种集群部署的示例定义文件,使用它,您可以创建四个数据存储节点和八个计算节点,instanceNum配置节点数目。默认情况下,BDE使用RoundRobin算法将各个节点排布在物理主机上。
{
"nodeGroups":[
{
"name": "master",
"roles": [
"hadoop_namenode",
"hadoop_jobtracker"
],
"instanceNum": 1,
"cpuNum": 2,
"memCapacityMB": 7500,
},
{
"name": "data",
"roles": [
"hadoop_datanode"
],
"instanceNum": 4,
"cpuNum": 1,
"memCapacityMB": 3748,
"storage": {
"type": "LOCAL",
"sizeGB": 50
}
},
{
"name": "compute",
"roles": [
"hadoop_tasktracker"
],
"instanceNum": 8,
"cpuNum": 2,
"memCapacityMB": 7500,
"storage": {
"type": "LOCAL",
"sizeGB": 20
}
},
{
"name": "client",
"roles": [
"hadoop_client",
"hive",
"pig"
],
"instanceNum": 1,
"cpuNum": 1,
"storage": {
"type": "LOCAL",
"sizeGB": 50
}
}
],
"configuration": {
}
}
包含节点网络拓扑和主机排布策略的存储/计算分离模型
看到这里您一定会发问,如果不将计算节点(TaskTracker)部署在存储节点(DataNode)所在的虚拟机上,那如何保证数据本地化的特性呢?BDE提供了优雅的分布策略可以既享有存储/计算分离的易扩展性,同时又保证数据本地化的要求。
如果您对数据本地化诉求很高,希望尽量减少网络通讯、以节约带宽并提升处理速度,BDE在部署存储/计算分离的Hadoop集群时,也可以同时考虑网络拓扑和主机排布策略。
下面列举了这种集群部署的示例定义文件,使用它可以创建四个数据存储节点(DataNode)和八个计算节点(TaskTracker),每个节点组(NodeGroup)中的placementPolicy字段定义了该组节点的排布策略。
其中存储节点(节点组data),instancePerHost=1表明一个物理主机上最多有且仅有一个数据节点,因此四个数据节点会被部署在四台物理主机上。groupRacks定义了存储节点的网络拓扑定义,4台要使用的物理主机会按照RoundRobin算法在Rack1,Rack2,Rack3这三个机架里面选择。
计算节点(节点组compute),instancePerHost=2表明一个物理主机上最多有且仅有两个节点。groupAssociations定义了节点组之间的依赖关系,reference=data表明计算节点的分布会依赖于存储节点的位置,依赖程度由“type=STRICT”定义,意即计算节点将被严格部署在存储节点所在的物理主机上,否则将会部署失败。从物理主机的视图,您会看到所用到的4台物理主机上,每个都将会部署一个存储节点和两个计算节点,这样在同一台物理主机上的存储虚拟机和计算虚拟机之间可以避免网络通信。
这样做在保持了存储/计算相分离的可扩展性优势的同时,如果在部署集群时,指定网络拓扑结构为HVE,就可以彻底保证数据本地化的要求。HVE功能会使得Hadoop自身对虚拟化架构感知,能够配合数据本地化的策略进行计算任务的调度。目前PivotalHD 1.2之后的版本都支持HVE功能。
HVE功能简介:
传统的Hadoop集群节点拓扑结构包括机架和主机层,但虚拟化在此基础上还需要知道hypervisor这一层。HVE功能使得Hadoop集群能够感知机架-物理主机-Hadoop节点三层架构,并且根据相应算法使运行于同一台物理主机上的存储节点和计算节点之间的通信方式满足数据本地化的要求。
另外,如果在集群定义文件中开启计算节点tempFS功能,那计算节点会利用存储节点的磁盘空间作为任务运行的临时文件夹,有效地使用磁盘空间。
TempFS功能简介:
当我们部署存储/计算分离的集群时,要为计算节点设置一个容量能满足业务需求的临时文件夹以保存任务运行期间的中间过程文件。另外如果整个集群的计算负载降低,计算节点被收缩减除(decommission),他所占用的磁盘空间无法被回收,也会造成存储空间的浪费。
所以这里我们引入了TempFS功能。这个功能使得计算节点可以使用部署在同一台物理主机上的存储节点的磁盘空间,这样既能够保证临时文件夹的空间充足,同时也能在计算节点被decommission后,也可以回收它的空间以供其他节点或应用使用。
另外BDE对于独立的计算节点,提供自动动态伸缩功能(Auto-Elasticity)。如果通过命令行cluster setParam --name cluster_name --elasticityMode auto --minComputeNodeNum minNum,可以根据当前vCenter的负载,避免资源的过量使用,适时地动态调整已经启动的计算节点的数目,并且保证开机运行的计算节点的数目不少于minNum,这样就可以最大化地有效利用资源,又可以节能减排。
关于HVE,tempFS和Auto-Elasticity功能的详细介绍,请参见BDE的官方用户手册。
{
"nodeGroups":[
{
"name": "master",
"roles": [
"hadoop_namenode",
"hadoop_jobtracker"
],
"instanceNum": 1,
"cpuNum": 2,
"memCapacityMB": 7500,
},
{
"name": "data",
"roles": [
"hadoop_datanode"
],
"instanceNum": 4,
"cpuNum": 1,
"memCapacityMB": 3748,
"storage": {
"type": "LOCAL",
"sizeGB": 50
},
"placementPolicies": {
"instancePerHost": 1,
"groupRacks": {
"type": "ROUNDROBIN",
"racks": ["rack1", "rack2", "rack3"]
},
}
},
{
"name": "compute",
"roles": [
"hadoop_tasktracker"
],
"instanceNum": 8,
"cpuNum": 2,
"memCapacityMB": 7500,
"storage": {
"type": "LOCAL",
"sizeGB": 20
},
"placementPolicies": {
"instancePerHost": 2,
"groupAssociations": [
{
"reference": "data",
"type": "STRICT"
}
}
},
{
"name": "client",
"roles": [
"hadoop_client",
"hive",
"pig"
],
"instanceNum": 1,
"cpuNum": 1,
"storage": {
"type": "LOCAL",
"sizeGB": 50
}
}
]
}