2014年3月

python解析配置文件

项目中经常需要解析配置文件,最简单的就是有很多个section,然后每个section里面都是很多option,每一项option的组成都是key=value,怎么解析这个配置文件?python有内置的库可以解决,比如下面是一个配置文件的demo

#WatchDir 配置文件
#配置的value的时候除了第一项就先别加单引号或者双引号了

[monitor]
#监控路径
WatchPath='/var/log/'

#数据写到本地磁盘cache时间间隔,单位:S
Interval=10


#是否以守护进程方式运行
Daemon=False

#mysql配置
[mysql]
mysql_host = 127.0.0.1
mysql_username = root
mysql_password = 12345678
mysql_port = 3306
mysql_dbname = db_a
mysql_table = tb_b

- 阅读剩余部分 -

Hadoop slaves文件解析

slaves文件里面记录的是集群里所有DataNode的主机名,到底它是怎么作用的呢?slaves文件只作用在NameNode上面,比如我在slaves里面配置了

host1
host2
host3 

三台机器,这时候如果突然间新增了一台机器,比如是host4,会发现在NN上host4也自动加入到集群里面了,HDFS的磁盘容量上来了,这下子不是出问题了?假如host4不是集群的机器,是别人的机器,然后配置的时候指向了NN,这时候NN没有做判断岂不是把数据也有可能写到host4上面?这对数据安全性影响很大。所以可以在hdfs-site.xml里面加限制。

<property>
    <name>dfs.hosts</name>
    <value>/home/hadoop-2.0.0-cdh4.5.0/etc/hadoop/slaves</value>
</property> 

这相当于是一份对于DN的白名单,只有在白名单里面的主机才能被NN识别。配置了这个之后,就能排除阿猫阿狗的DN了。其实slaves文件里不一定要写主机名,最终的都是通过IP来判断,完全可以写一个IP就行。 我还尝试了配置了上面的dfs.hosts项之后,然后在slaves删除一个节点,然后 $ hadoop-daemon.sh stop namenode $ hadoop-daemon.sh start namenode 这时候NN就拒绝了那个被删除了的DN数据,而NN会自动把DN上丢失的数据重新备份,通过其他的备份来copy,这里是很智能的过程。

Ganglia监控Hadoop

$ vim hadoop-metrics2.properties

#*.sink.file.class=org.apache.hadoop.metrics2.sink.FileSink
# default sampling period, in seconds
#*.period=10

*.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31  
*.sink.ganglia.period=10  
  
*.sink.ganglia.slope=jvm.metrics.gcCount=zero,jvm.metrics.memHeapUsedM=both  
*.sink.ganglia.dmax=jvm.metrics.threadsBlocked=70,jvm.metrics.memHeapUsedM=40  
  
namenode.sink.ganglia.servers=hadoop_master_ip:8649  
resourcemanager.sink.ganglia.servers=hadoop_master_ip:8649  
  
datanode.sink.ganglia.servers=hadoop_master_ip:8649    
nodemanager.sink.ganglia.servers=hadoop_master_ip:8649    

maptask.sink.ganglia.servers=hadoop_master_ip:8649    
reducetask.sink.ganglia.servers=hadoop_master_ip:8649 

然后分发配置文件,接可以ganglia监控HDFS等基本情况
ganglia2hadoop

Ganglia配置

ganglia工作原理 ganglia主要有两个角色,gmond(ganglia monitor daemons)和gmetad(ganglia metadata daemons)。gmond是agent,需要在被监控的每台机器上部署,负责采集所在机器的系统状态,信息都是存储在内存里面的。

ganglia-icm ganglia有一种工作模式是组播,顾名思义,以组播的形式发出自己采集到的信息。这时候集群内所有配置成组播的都可以接收数据,也就是说在组播的情形下,集群内的数据都是共享并且一致的(和路由协议很像),gmetad的功能就是从采集集群内所有系统状态信息,在组播的工作模式下,gmetad可以从任一台gmond上采集集群信息。但是组播的局限性就是在于集群要在一个网段内,并且网络负载提高。 ganglia还有一种工作模式是单播,每个agent上的gmond采集好各自的信息,然后通过udp汇总到一台gmond上,然后这台gmond汇总所有来自其他gmond的信息并且联合本机信息也发送给ganglia,单播的模式就是push,gmetad等待从gmond中心节点上过来的信息。 gmetad会把从gmond收集到的信息写入rrdtool里面,rrdtool是一个环形数据库,用来存储集群信息,然后在ganglia-web可以去读取rrdtool,并且绘图呈现给前端。

- 阅读剩余部分 -

Ganglia安装过程中几个问题

在ganglia安装好,呈现web的过程中。

问题一

RRDs directory '/var/lib/ganglia/rrds' is not readable

解决方案: 1.chown nobody:nobody -R RRDs /var/lib/ganglia 2.chmod 777 -R /var/lib/ganglia 3.vim /etc/php.ini safe_mode = Off 依次执行上面的,就能解决。

问题二 ganglia安装后好,jss无法加载,导致图片都没有呈现。

gangliabug 原因:ganglia web使用graph.php来生成rrd图,调用的函数为passthru,而默认的php.ini限制了passthru的执行。 解决方案: vim /etc/php.ini disable_functions = exec,passthru,popen,proc_open 把这个函数去了就行。

Hadoop invalid shuffle port number

Hadoop2,yarn-site.xml 配置过程中,yarn.nodemanager.aux-services这一项值配置的时候配得不对,结果每次在reducer的时候就挂了,提示错误都是"ContainerLauncherImpl"失败,提示:

* java.lang.IllegalStateException: Invalid shuffle port number -1 returned fo
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>