集群环境
公司给分配了3台新的虚拟机,打算从头配置一下zookeeper,kafka,storm,hadoop,hbase的环境。
(以后配置mongodb,spark的时候,在陆续更新,目前(2016/4/21)只接触这么多)
配置的过程中发生了一些问题。这里共享一下笔记。当然,我做配置的时候的原则是:
只配置知道的,不知道的就不去配置。虽然会发生问题,但是在解决问题的过程中,能达到学习的目的。
所以,我在配置的过程中,才发生了下面这么多的弱智的问题。略有愧疚。所以,往往前期要比别人花上更多的时间和精力。
-----------------------
软件版本:(不同版本的问题有可能不一样,这里的解决方法仅供参考,出现问题概不负责)
【zookeeper】:zookeeper-3.4.6.tar.gz
【kafka】:kafka_2.9.2-0.8.1.1.tgz
【storm】:apache-storm-0.9.5.tar.gz
【hadoop】:hadoop-2.7.1.tar.gz
【hbase】:hbase-1.2.1-bin.tar.gz
-----------------------
(1)查看zookeeper.out的日志发现了如下错误。
后来发现是我的配置文件中,将dataDir的路径写错了,修改之后就不再出现这个错误。
这里其实只是我的一个最单纯的错误,留下这个错误的目的是:养成查看日志的习惯。大多数问题通过查看日志是可以找到原因的。
(2)查看zookeeper.out的日志发现了如下错误。
日志中提示是端口发生了冲突,尝试更换了一下端口。问题解决。
大多数情况下,我们都会使用zookeeper自带的端口号,当集群中启动的服务很多的时候,是会发生端口号冲突的。
(3)hadoop的配置文件不知道该如何配置。(无图)
hadoop的集群构建的时候,基本上都需要配置下面几个文件:
hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
但是,根据Hadoop的版本不同,有可能配置的内容会有些许区别,网上的配置方法也众说纷纭。
当然,还是要感谢网上的人能将配置项加上中文翻译的。
我最初配置的时候,是打算参考正确答案(官网),结果官网上罗列了很多的配置项,
后来咨询了一些大牛得到如下结论:(当然,这个结论还是需要验证的)
①、官网上的配置项是一个“合集”,每一项都介绍的很详细。但是,其实大部分都用不上,最低配其实大部分指定点路径就行了。
②、除开JAVA_HOME等必须配置的项目之外,即使什么都不配,按理说也可以启动起来。
总结来说:配置文件需要按需配置
(4)停止hadoop的时候出现"“no datanode to stop"的错误
网上大概有三个方法来解决这个问题,我这里偷懒罗列一下。我这次是用第③种方法解决的。
【第一种解决方法】
①、删除“/usr/hadoop/tmp”里面的内容:rm -rf /usr/hadoop/tmp
②、重新创建“/usr/hadoop/tmp”文件夹。
③、删除“/tmp”下以“hadoop”开头文件。
④、重新格式化hadoop:hadoop namenode -format
⑤、重新启动hadoop
【第二种解决方法】
修改每个Slave的namespaceID,使其与Master的namespaceID一致。
或者
修改Master的namespaceID使其与Slave的namespaceID一致。
Master的“namespaceID”位于“/usr/hadoop/tmp/dfs/name/current/VERSION”文件里面,
Slave的“namespaceID”位于“/usr/hadoop/tmp/dfs/data/current/VERSION”文件里面。
【第三种解决方法】
在重新格式化分布式目录及对应文件时,需要将NameNode及DataNode上所配置的dfs.name.dir对应的路径删掉或移除,否则hadoop无法正常工作。
根据某资料所说的,这是为了避免由于格式化而删掉已有且有用的的hdfs数据,所以格式化前dfs.name.dir对应的路径应当是不存在的。
(5)停止hadoop的时候出现"no nodemanager to stop"的错误
网上找到了一篇很牛的博客(不知道是不是原创)
看了这篇博客之后,总算知道了PID的意义和配置的必要性。配置一下之后,果真解决了。
我修改了两个文件的PID的保存位置:
①、hadoop-env.sh
②、yarn-env.sh
需要注意以下两点:
1、hadoop-env.sh中已经邮PID_DIR的属性了,修改它的值就可以,yarn-env.sh需要自己追加属性
2、记住要先关闭Hadoop再修改,不然你修改完又无法关闭了。
(6)nodemanager启动后一段时间自动关闭
略有感慨,总是有大牛能够写出非常透彻的分析。这次也找到了一篇很好的博客:
http://my.oschina.net/u/1451042/blog/223235
按照博客上的说法,如果不在yarn-site.xml中追加yarn.resourcemanager.hostname,
nodemanager启动后要通过心跳机制定期与RM通信,否则RM会认为NM死掉,会停止NM的服务。
如下如所示,修改yarn-site.xml后,问题解决。
(7)HBase的regionServer无法通过Master节点启动
现象如下图所示,Master节点到时可以启动了,Slave节点未能与Master一同启动。
下图中左面是Master节点的进行状态,右面是Slave节点的进程状态。
原因是hbase-site.xml中【hbase.cluster.distributed】属性没有配置。
如果不设置这个属性,就不能构成完全集群模式。像下图所示追加属性之后,ReginServer正常启动。
(8)HBase的RegionServer过会就自动关闭
按照上述问题6中配置完成之后,过了一会我又去看了一下进程状态,发现Slave节点的RegionServer进行突然消失了。
(通过问题1养成了查看Log的好习惯)将原来的Log日志全部删除掉,重新启动Hbase,尝试实时监控Slave端的Log日志,
发现Log中出现大量的下面的日志:
从Log中能看出来,貌似一直在尝试与ZK集群建建立连接,可是连接不上。于是乎,想到了配置文件中的需要追加zookeeper的配置。
向下面这样修改之后,再次监控上面的Log,发现不在出现这个问题了。
注意:在配置zookeeper的地址的时候,如果不写明后面的端口号,默认为2181,由于我修改过默认端口号,所以必须写明。
如果没有修改过端口号,value中写[master,slave1,slave2]或者[192.168.1.179,192.168.1.180,192.168.1.181]都可以。
另外有一点也需要注意,如果需要zookeeper和hbase分别单独启动,不需要Hbase启动的时候自动去启动zookeeper时,
需要在hbase-env.sh的属性【HBASE_MANAGES_ZK】设置为false。默认是true的。修改后如下:
(9)启动hadoop的时候,总是提示下面的警告
在公司的时候,使用的版本是2.7.1没有出现这个问题,周末在家搞的时候,使用的是自己机器上的虚拟机,
hadoop的版本为2.5.1,就会出现这个问题。
在网上查看了一下相关信息,说是由于本地库没有加载成功的原因,使用hadoop checknative查看了一下,确实是有问题。
比较蛋疼的是,在网上找到的文章中,都是说在hadoop-env.sh中加入以下下面配置就可以解决。
export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib/"
结果尝试了几次之后没有效果。开启hadoop的debug模式之后,检测了一下启动Log。有如下提示:
说明系统中的glibc的版本和libhadoop.so需要的版本不一致导致。查看一下系统的libc版本。显示版本为2.12
*后来在网上找到一个与我一样的问题的博客:http://blog.sina.com.cn/s/blog_4eca88390102vn86.html
到网站【http://ftp.gnu.org/gnu/glibc/】上下载【glibc-2.14.tar.bz2】和【glibc-linuxthreads-2.5.tar.bz2】上传到Linux上。
(待更新)