我的服务器养成计划 -- hadoop搭建
起因
在一周前,突然心血来潮,想整理一下我的服务器群,我放下一个暂时在研究的node库,开始研究hadoop(其实就是一开始脑抽了,想搭个分布式文件系统用来共享数据而已,后来选了hdfs,因为可以顺便做做云计算)
于是就开始了每天数小时的搭建旅程
当时我有的服务器:
代理服务器 : 上面挂着一个 shadowsock 服务器,作为我的日常梯子
主服务器 : 测试性的挂了个gitlab ,本来预期放个人页面
数据服务器 : 上面挂了个 mongo,mysql,redis
全部机器统一配置:
单核,不明型号cpu(其实我忘了)
1g内存 (你知道有多心累吗)
硬盘30g(测了一下写入的,60m/s ಠ_ಠ 慢)
centos 7.2
每台机器不同 子网,网速无限大乁( ˙ω˙ )厂 (上传,没测,下载:20m/s ),位置韩国,ping 延迟60-100ms,不过我连接过去速度并不高,看个720p 视频算是差不多了
第一天
单机helloworld
根据我之前搭 数据服务器 的经验,用docker搭建,速度妥妥的,而且还很舒服
先去docker 的 hub想找了一个star最多的hadoop镜像,直接安装了,然后开始跑数绵羊……哦不,数单词程序(给我的感觉就是 MapReduce 的helloworld)
…………(╯‵□′)╯︵┻━┻ 10分钟还没跑完,我都要睡着了
又过了一会,终于跑完了,起码算是成功了!!
然而……这一切只是开始…………
联机无法连接
一开始在我的数据服务器上面搭的,现在想扩展一下集群,就开始动手在代理服务器上面搭一个slave
我所看的教程:
http://www.powerxing.com/install-hadoop-cluster/
http://www.powerxing.com/install-hadoop-in-centos/
第一步:修改host
我的情况是 有一个外网IP,nat映射到本地的ip, 然后再docker 内部的ip.....恩,所以我经过hadoop的有三个ip
恩...算了,别人家是同一个子网的,我又不是,我直接挂域名就好了,让DNS解析解析,略过 :v:
第二步:没密码SSH
我在docker 下载的镜像已经帮我搞得妥妥的,略过 :v:
第三步: 配置文件
既然人家的docker 都能跑起来了,我觉得不用修改什么,修改了一下 主机地址:我的域名
修改一下 slaves 的文件,添加代理服务器的域名进去(代理服务器也跑了docker+hadoop)
第四步:启动
激动人心的时刻到了(^o^)/....启动........不了......what????
错误提示:XXXXX:9000 cannot assign requested address
(假装有图→_→)
在跑的过程中...被那1G内存虐死了..怒加虚拟内存..
在启动的时候,也是经过很多很多遍的一个一个情况的测试,跑得又慢,浪费了好多时间
当有一个解决方案,但已经到了睡觉时间了,闪
第二天
接着前一天,不能分配地址?9000?
然后jps一下,果然 namenode 没有启动...
过了良久(这里省略N字)....
好吧,设置了
//服务器集群还没做安全设置....,请允许我做个屏蔽//core-site .xml fs.defaultFS hdfs:// *.meislzhua.space:9000
因为这个ip 是 映射最外层的ip,在本机根本找到这个ip,所以绑定不了...
然后修改了host
vi /etc/hosts127.0.0.1 *.meislzhua.space
让本机 解析这个域名的时候,指向本地
启动,终于把namenode 启动了
打开 *.meislzhua.space:50070 的时候, live nodes = 0
(╯‵□′)╯︵┻━┻
这天的配置时间,就这样过去了,上午去 https://leetcode.com/ 做做算法,下午配置...
下午配置的期间,也用了很多时间去爬帖...
发现 docker 最多star 那个只是预览,只支持伪分布式,不知道直接挂成集群.....
但是我决定要这个里面改装下去!
第三天
第三天是反复浪费时间的....
因为反复修改配置重试,终于搞定了....伪分布式
主 从都在本地
第三天有事忙用时不是很多....,就是这样过了....
第四天
继续在代理服务器 上面搭slave
终于成功搭好 HDFS
所以打算的架构:
hadoop-namenode:数据服务器
hadoop-slave:数据服务器,代理服务器,主服务器
然后配置好以后,发现....
live nodes = 1
不用想了,肯定又是这个ip的问题 (╯‵□′)╯︵┻━┻
经过我不懈的努力
发现
vi /etc/hosts127.0.0.1 *.meislzhua.space
绑定 127.0.0.1 是不可以对外的!!!! 于是改成
vi /etc/hosts0.0.0.0 *.meislzhua.space
再打开 *.meislzhua.space:50070
live nodes = 3
感动啊/(ㄒoㄒ)/~~
放弃docker
经历这么久,终于搭好了了我的网盘...哦不,是HDFS (:з」∠)
但是发现 好像有点不对经... 我的一个主机 是有30G的, 现在3个才30G?
以为是分片的原因,一开始我修改成3了,以为就这样缩小3倍.....修改几次配置,重启,一样没有效果
最后在系统运行 df -hl 发现我的系统只有10G....
恩,这肯定是docker 的锅...
想到了几个方案:
将 docker 空间默认30G
在 服务器本地 新建一个文件夹,映射到 docker内部,再充当datanode 的数据目录
对于方案一
由于如果空间是 空间设置了30G,可能会造成 系统用了15G,而docker 内部只用了几G,而docker内部还不知道!继续写文件,会出错..
不采取
对于方案二
能延缓 方案一的问题,但是还没有解决,毕竟hdfs 写入过多的话,再在docker 系统里面写东西,也会报错,但是感觉几率会小很多
恩,所以我觉得也不采用方案二,直接抛弃了docker
重新搭建
同时又申请一个hadoop服务器,用这个来做namenode ,其他服务器都用来做slave....
同时namenode 服务器用开nfs 服务器,给我的电脑接上....
于是我的网盘就真的完成了!!!
内部文件共享
后来心血来潮,又开了一个 内部服务器,用来给集群共享文件
其实主要是想在内部服务器开一个nfs,然后把hadoop 文件夹共享出去,这样,只要其他服务器挂载这个目录就好啦,哈哈哈哈哈,而且不用跑每一台一台修改配置了
错误的修改1
于是 我把在内部服务器的/usr/local/hadoop做成共享文件夹,挂到其他服务器中去.
//hdfs-site.xml dfs.namenode.name.dir file:/usr/local/hadoop/tmp/dfs/name dfs.datanode.data.dir file:/usr/local/hadoop/tmp/dfs/data
那么问题来了 这样全部都指向 内部服务器的tmp文件夹了,于是我吧内部服务器的tmp 文件夹改了,改成link 文件,指向 /hadoop/tmp,然后每个服务器再建立的/hadoop/tmp就好了~
(或者修改配置文件的配置目录就好了,但是要手动一个一个移动,懒啊 (:з」∠),于是就不修改了)
OK,搞定
后来想了一下,如果内部服务器挂了,读不了/usr/local/hadoop/tmp了....就整个集群挂了...哎
错误的修改2
不知道怎么脑抽了,只后来变成共享 /usr/local/hadoop/etc/ 这个文件,当每个hadoop节点都复制一份hadoop,然后再挂/usr/local/hadoop/etc/变成共享的...来统一修改配置
其实一开始修改配置目录就好了!!!
其实第四天还是学到挺多的东西的
参考到的网站:
hadoop 挂载 NFS : http://duguyiren3476.iteye.com/blog/2209242
linux 挂载 NFS : http://desert3.iteye.com/blog/1675522
hadoop 限额配置(虽然本文没提到) : http://blog.chinaunix.net/uid-20577907-id-3531548.html
第五天
又是一个被ip问题搞死的日子 (╯‵□′)╯︵┻━┻
能挂内网,就尽量挂内网吧....
或者 搞个什么DNS服务器啊,VPN服务器啊什么,也搞得我累了
开始测试
yarn jar hadoop-mapreduce-client-jobclient-2.7.2-tests.jar TestDFSIO -write -nrFiles 20 -fileSize 1024
提示 .meislzhua.space/0.0.0.0 to .meislzhuas.space:9000 connect refuse
居然自己给自己连接拒绝了...
我也懒得查什么原因了..(应该是我漏掌握的一些网络知识了,0.0.0.0 或者不能当源地址还是什么的)
直接改hosts吧,心累了
vi /etc/hosts172.16.32.2 *.meislzhua.space
172.16.32.2是本机网卡的ip地址,对外IP地址的请求,都会转发给它的(我怎么可能告诉你,这个ip是我乱写的(:з」∠) )
又到报错时刻
再运行 yarn jar hadoop-mapreduce-client-jobclient-2.7.2-tests.jar TestDFSIO -write -nrFiles 20 -fileSize 1024 可以提交任务了
期间各种乱点 *.meislzhua.space:8088 中各种能点的东西,学会如何查看log,和各种不明不白的东西
发现上面这个代码,有一定几率出错!!!
点了 首页的 某个任务(其实不是任务,是application)的ID
(由于服务器还没时间做防护,所以暂时先不公布地址,打个马赛克)
当node 是 hadoop服务器 的时候,就全部链接不上了....map 全部链接了一个不对的地址上!
后来我推断(没有验证过)出,他是先拿ip地址 问DNS服务器,拿到域名之后,把这个得到的域名分发出去,生成各个子map任务
因为我的服务器的特殊性,他拿着172.16.32.2这个IP向DNS服务器拿域名,结果拿了一个乱七八糟的,其他slave不能识别的域名(这个是因为我的服务器环境的特殊性)
其他slaves 看到这个域名的时候 真的一脸懵逼了...一直连接,一直连接不上....
目测估计 上图中的 node 项,应该是 用来指挥的,随机挑选一个主机来 任务的进行指挥的,当是 hadoop服务器指挥的时候,解析 *.meislzhua.space 的时候,就解析出自己的内网ip了...然后再去DNS转换出一个乱七八糟的域名
当时能想到的方法:
改DNS为谷歌的
hadoop 服务器 就不要挂NodeManager.
方法一:
当给出一个内网的地址是,谷歌DNS也是一脸懵逼的...所以也是不行
只能执行方案二了.
然后一次无意中看log 的时候, 发现其他node 会连接172.16.32.2:50010,什么鬼啊!这个ip也会上传上去?我没有看源码,你不要欺负我... 50010 端口是datanode的端口
办法了,只能 也吧datanode 也去掉了
直接slaves的名单里面没有它了...
从此,一主4从 5个服务器 开始了辛苦快乐的生活,完结撒花 ~(≧≦)/~
用到的东西:
增删节点(虽然我是失败一半的):http://my.oschina.net/MrMichael/blog/291802?fromerr=5UYiEJvb
centos ip查域名工具: http://u.sanwen.net/subject/250517.html
虽然不知道有没有人看,但是你有问题,或者觉得我有问题都可以在下面留言~
关键字:hadoop, linux
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!