构建基于Docker的HDFS+Spark可伸缩集群的几个疑问


1,数据如何存放?

通过卷存放在宿主机服务器上。假如在集群里运行了100个HDFS DataNode实例,一段时间后需要升级,那么干掉以前容器,再次运行升级后的镜像。

这个时候如何保证新运行的容器能够找到之前所有的文件数据?

难道需要记录以前的100个实例运行在哪台服务器上,每台服务器分别运行了多少个实例?这样的话太死,不利于资源利用率,也不利于系统的容错性。

或者在重新启动新容器前,把需要的文件数据转移到合适的地方去?但是这样大规模的移动数据,在分布式系统里面成本太高。如果只是在升级HDFS时需要这样做,倒还好。是否还有其它场景也需要停掉所有的容器,再来一次呢?

2,HDFS DataNode和Spark Slave必须运行于同一个容器中吗?

按对Docker的理解,一个进程/服务放在一个容器中,那么HDFS DataNode一个容器,Spark Slave一个容器,那么即使它俩在一台机器上,也会有不同的IP。这种情况下Spark的数据本地性还能正常工作吗?

如果把HDFS DataNode和Spark Slave运行在同一个容器中倒没有这个问题。

对于这两个问题,感觉总是没有抓到关键,不知道如何解决,求助。
已邀请:

xds2000 - 数人科技CTO

赞同来自: 喬海軍1985 寻觅神迹


楼主完全没有抓住重点。我在讲一下:
HDFS集群是不应该频繁的伸缩的,应该讲只能扩,不要缩。它的数据是有状态的存在主机上,把数据节点缩回去,那么数据咋办。所以这里说Docker来启动DataNode,是水平扩容。但其中不能说,要升级就把以前的容器干掉。这完全是一种想象中的场景,不要这么干,会丢数据的。
所以,我认为用Docker把HDFS包裹一层再部署,目前并不是生产环境的做法。如果有兴趣,应该是hdfs on mesos去搭建一套,那样,容错和调度都由mesos来管理。

Spark集群模式是使用Mesos实现的,建议你多看看场景,不要乱用Docker。

喬海軍1985

赞同来自: 汪洋澹泊


这个确实是一个很值得思考的问题,就是如何对有状态的数据使用docker做封装。

对于hdfs这样的关键的基础组件,最好还是不要用docker。

要回复问题请先登录注册