hadoop伪分布式平台搭建(centos 6.三)

  近来要写多个数据量较大的先后,所以想搭建贰个hbase平台试试。搭建hbase伪分布式平台,须求先搭建hadoop平台。本文首要介绍伪分布式平台搭建进程。

  公司的Riak版本是2.0.四,近年来已依据CMDB三级业务布局了十几套集群,超越二分之1是跨机房布置。监察和控制搜聚分为多少个大的维度,第2个维度是单机,也等于「IP:端口」;第一个维度是集群,也正是有着节点指标的总括结果。本文首要介绍采访的指标和征集程序。

目录:

  一、收集的目标

  一、前言

  ①、吞吐量指标

  2、环境搭建

  1.1 单机

  叁、命令测试

募集方法:

  四、启动YARN

/usr/sbin/riak-admin status

  五、web查看

指标 功能
node_gets 某节点前一分钟处理的 GET 请求数量,包括该节点上非本地虚拟节点处理的 GET 请求
node_puts 某节点前一分钟处理的 PUT 请求数量,包括该节点上非本地虚拟节点处理的 PUT 请求

 

  一、前言

 

  一、起首搭建前上官网看了一下,发现新型版本是三.0,但一想到跨版本而且又是风尚版本的形似都会产出各个分化的难题,所以决定运用了贰.七.三,hadoop二的摩登版本,至于跟后边搭建hbase的版本兼不相配的境况等蒙受再看怎么处理(实验验证最新版本的hbase一.二.三跟hadoop二.7.三是应有尽有包容的)。

 

  贰、机器唯有实体机1台 拾.一.二.10捌,centos 陆.3,陆13人系统

  1.2 集群

[root@root@ZhaoWei_10_1_2_108 ~]# cat /etc/issue 
CentOS release 6.3 (Final)
Kernel \r on an \m

[root@root@ZhaoWei_10_1_2_108 ~]# getconf LONG_BIT
64
指标 功能 统计方法
node_gets_total 集群前一分钟处理的 GET 请求数量 SUM(node_gets)
node_puts_total 集群前一分钟处理的 PUT 请求数量 SUM(node_puts)

  三、大约了然了下就网上到处找安装教程,发现写的好的要么一大堆的,可是我们差不离都是参照官方安装教程

 

  四、由于开了八个窗口,所以本文中的shell命令有时候是root运营,有时候是hadoop账号运转,须要注意hostname以便区分

 

  二、环境搭建

 

  1、新建hadoop用户

  二、延迟目标

[root@ZhaoWei_10_1_2_108 home]# useradd hadoop
[root@ZhaoWei_10_1_2_108 home]# passwd hadoop
Changing password for user hadoop.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

  2.1 单机

  二、下载安装包

征集方法:

亟待的装置包有hadoop 下载后方可依照MD伍相比较来决断是还是不是下载完整。

/usr/sbin/riak-admin status

jdk下载

指标 功能
node_get_fsm_time_mean 客户端发起 GET 请求到收到响应时间间隔的均值
node_get_fsm_time_median 客户端发起 GET 请求到收到响应时间间隔的中值
node_get_fsm_time_95 客户端发起 GET 请求到收到响应时间间隔的 95 百分位值
node_get_fsm_time_100 客户端发起 GET 请求到收到响应时间间隔的 100 百分位值
node_put_fsm_time_mean 客户端发起 PUT 请求到收到响应时间间隔的均值
node_put_fsm_time_median 客户端发起 PUT 请求到收到响应时间间隔的中值
node_put_fsm_time_95 客户端发起 PUT 请求到收到响应时间间隔的 95 百分位值
node_put_fsm_time_100 客户端发起 PUT 请求到收到响应时间间隔的 100 百分位值

hadoop的版本是2.7.三,hadoop后台首假如java,所以必要借助jdk环境运营,我下载的版本是jdk一.捌(jdk-8u40-linux-x6四.tar.gz)。可是不精通怎么下载后在linux下解压一向出错,后来向来在windows下解压后发到linux环境。

 

  3、安装jdk

 

tar xvzf jdk-8u40-linux-x64.tar.gz
mv jdk1.8.0_40/ /usr/local/java1.8.0_40
ln -s /usr/local/java1.8.0_40 /usr/local/java

cat >> /etc/profile <<'MUL'
JAVA_HOME=/usr/local/java/
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
MUL

source /etc/profile

[root@root@ZhaoWei_10_1_2_108 ~]# java -version
java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)

 

  肆、配置本机免密ssh登录

 

店肆的机器是配好ssh的,假使没设置机器能够运用命令

 

yum install openssh-clients -y
yum install openssh-server -y

 

安装成功后安顿免密登录必要先切换hadoop账号,使用ssh-keygen生成sshkeys,并且将公钥授权给本机

 

[root@root@ZhaoWei_10_1_2_108 ~]# su - hadoop
[hadoop@root@ZhaoWei_10_1_2_108 ~]$ ssh-keygen -t rsa    # 一路回车
[hadoop@root@ZhaoWei_10_1_2_108 ~]$ cd ~/.ssh/
[hadoop@root@ZhaoWei_10_1_2_108 .ssh]$ cat id_rsa.pub >> authorized_keys
[hadoop@root@ZhaoWei_10_1_2_108 .ssh]$ chmod 600 ./authorized_keys

  

修改/etc/hosts,增加localhosts

  2.2 集群

[hadoop@root@ZhaoWei_10_1_2_108 .ssh]$ hostname
root@ZhaoWei_10_1_2_108
[hadoop@root@ZhaoWei_10_1_2_108 .ssh]$ cat /etc/hosts
10.1.2.108   localhost
10.1.2.108   root@ZhaoWei_10_1_2_108
指标 功能 统计方法
node_get_fsm_time_mean_avg 客户端发起 GET 请求到收到响应时间间隔的均值 AVG(node_get_fsm_time_mean)
node_put_fsm_time_mean_avg 客户端发起 PUT 请求到收到响应时间间隔的均值 AVG(node_put_fsm_time_mean)

鉴于公司机器的ssh私下认可端口是32二,而不是2二,所以布署免密登录是亟需内定端口的ssh
-p32二,那里大家还供给修改配置文件,root权限查看配置文件末两行,第二行是设置使用32二端口举办通讯,第3行是将ssh配置成监听机器的全网段,包涵内外网ip。假使未有这一行,须要本身丰盛,不然前面运转hadoop
SecondNode会一向提醒连接0.0.0.0未果。

 

重启ssh服务。

 

[root@root@ZhaoWei_10_1_2_108 ~]#  tail /etc/ssh/sshd_config
Port 322 
ListenAddress 0.0.0.0

 

[root@root@ZhaoWei_10_1_2_108 ~]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]

  三、Erlang 财富采用状态指标(单机)

紧接着运维下边发号施令成功就能够。

募集方法:

[hadoop@root@ZhaoWei_10_1_2_108 ~]$ ssh localhost            
ssh: connect to host localhost port 22: Connection refused
[hadoop@root@ZhaoWei_10_1_2_108 ~]$ ssh -p322 localhost
Last login: Tue Nov  1 20:40:23 2016 from 10.1.2.108
/usr/sbin/riak-admin status

只要提醒

指标 功能
sys_process_count Erlang 进程的数量
memory_processes 分配给 Erlang 进程的内存总量(单位 bytes)
memory_processes_used Erlang 进程使用的内存总量(单位 bytes)
-bash: /usr/bin/ssh: Permission denied

 

则root下利用上面发号施令

 

chmod  a+x /usr/bin/ssh

 

 

  

  5、安装hadoop

  四、Riak 负荷/健康目的 

因为笔者下载的编写翻译后的包,所以是足以一贯解压运营的。

  4.1 单机

[root@root@ZhaoWei_10_1_2_108 tar]# cd /home/hadoop/tar/
[root@root@ZhaoWei_10_1_2_108 tar]# tar -xzf hadoop-2.7.3.tar.gz 
[root@root@ZhaoWei_10_1_2_108 tar]# chown -R hadoop: /home/hadoop/
[root@root@ZhaoWei_10_1_2_108 tar]# mv hadoop-2.7.3 /usr/local/hadoop
[root@root@ZhaoWei_10_1_2_108 tar]# chown -R hadoop: /usr/local/hadoop/ 

[hadoop@root@ZhaoWei_10_1_2_108 ~]$ cd /usr/local/hadoop/
[hadoop@root@ZhaoWei_10_1_2_108 hadoop]$ ./bin/hadoop version
Hadoop 2.7.3
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r baa91f7c6bc9cb92be5982de4719c1c8af91ccff
Compiled by root on 2016-08-18T01:41Z
Compiled with protoc 2.5.0
From source with checksum 2e4ce5f957ea4db193bce3734ff29ff4
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.7.3.

采访方法:

诚如在运维hadoop命令会提醒Error: JAVA_HOME is not set and could not be
found.那是因为hadoop的配备文件没布署好。修改 /usr/local/hadoop/etc/hadoop/hadoop-env.sh扶助java环境并计划好ssh
端口。

/usr/sbin/riak-admin status
export JAVA_HOME=/usr/local/java   # 本来是${JAVA_HOME}
export HADOOP_SSH_OPTS="-p 322"  # 末尾增加一行
指标 功能
read_repairs 某节点前一分钟处理的读取修复操作数量
node_get_fsm_siblings_mean 某节点前一分钟所有 GET 操作处理的兄弟数据数量均值
node_get_fsm_siblings_median 某节点前一分钟所有 GET 操作处理的兄弟数据数量中值
node_get_fsm_siblings_95 某节点前一分钟所有 GET 操作处理的兄弟数据数量 95 百分位值
node_get_fsm_siblings_100 某节点前一分钟所有 GET 操作处理的兄弟数据数量 100 百分位值
node_get_fsm_objsize_mean 某节点前一分钟流经 GET_FSM 的对象大小均值
node_get_fsm_objsize_median 某节点前一分钟流经 GET_FSM 的对象大小中值
node_get_fsm_objsize_95 某节点前一分钟流经 GET_FSM 的对象大小 95 百分位值
node_get_fsm_objsize_100 某节点前一分钟流经 GET_FSM 的对象大小 100 百分位值

  6、hadoop单机械运输营

 

hadoop私下认可正是单机形式,java单进程运营,方便调节和测试。大家能够直接使用原生的事例来测试hadoop是还是不是安装成功,运营上面发号施令就能够见到hadoop原生全数例子

 

若出现提醒 “WAMuranoN util.NativeCodeLoader: Unable to load native-hadoop
library for your platform… using builtin-java classes where
applicable”,该 WAEvoqueN 提醒能够忽略,不会影响 Hadoop 正常运作(可透过编译Hadoop 源码化解)。

 

[hadoop@root@ZhaoWei_10_1_2_108 hadoop]$ ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar 
An example program must be given as the first argument.
Valid program names are:
  aggregatewordcount: An Aggregate based map/reduce program that counts the words in the input files.
  aggregatewordhist: An Aggregate based map/reduce program that computes the histogram of the words in the input files.
  bbp: A map/reduce program that uses Bailey-Borwein-Plouffe to compute exact digits of Pi.
  dbcount: An example job that count the pageview counts from a database.
  distbbp: A map/reduce program that uses a BBP-type formula to compute exact bits of Pi.
  grep: A map/reduce program that counts the matches of a regex in the input.
  join: A job that effects a join over sorted, equally partitioned datasets
  multifilewc: A job that counts words from several files.
  pentomino: A map/reduce tile laying program to find solutions to pentomino problems.
  pi: A map/reduce program that estimates Pi using a quasi-Monte Carlo method.
  randomtextwriter: A map/reduce program that writes 10GB of random textual data per node.
  randomwriter: A map/reduce program that writes 10GB of random data per node.
  secondarysort: An example defining a secondary sort to the reduce.
  sort: A map/reduce program that sorts the data written by the random writer.
  sudoku: A sudoku solver.
  teragen: Generate data for the terasort
  terasort: Run the terasort
  teravalidate: Checking results of terasort
  wordcount: A map/reduce program that counts the words in the input files.
  wordmean: A map/reduce program that counts the average length of the words in the input files.
  wordmedian: A map/reduce program that counts the median length of the words in the input files.
  wordstandarddeviation: A map/reduce program that counts the standard deviation of the length of the words in the input files.

 

运转上边发号施令能够测试单词过滤例子grep

 

[hadoop@root@ZhaoWei_10_1_2_108 hadoop]$ mkdir input
[hadoop@root@ZhaoWei_10_1_2_108 hadoop]$ cp *.txt input/
[hadoop@root@ZhaoWei_10_1_2_108 hadoop]$ ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'SOFT[A-Z]+'

[hadoop@root@ZhaoWei_10_1_2_108 hadoop]$ cat output/part-r-00000
49      SOFTWARE

[hadoop@root@ZhaoWei_10_1_2_108 hadoop]$ ls output/
part-r-00000  _SUCCESS

 

设若出现 metrics.MetricsUtil: Unable to obtain
hostName的失实那就是hostname没布置好,修改好就可以。

 

[root@root@ZhaoWei_10_1_2_108 tar]# hostname root@root@ZhaoWei_10_1_2_108

 

借使在那以前早已设置了伪分布式平台,则以上命令是不会输出到近期文件系统的,而是会发到hdfs文件系统中。

  

  6、伪分布式安装

  4.2 集群

先安装环境变量,修改~/.bashrc,修改后source ~/.bashrc

指标 功能 统计方法
read_repairs_total 集群前一分钟处理的读取修复操作数量 SUM(read_repairs)
node_get_fsm_siblings_mean_avg 集群前一分钟所有 GET 操作处理的兄弟数据数量均值 AVG(node_get_fsm_siblings_mean)
node_get_fsm_objsize_mean_avg 集群前一分钟流经 GET_FSM 的对象大小均值 AVG(node_get_fsm_objsize_mean)
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

 

hadoop的布署文件在etc/hadoop上边,伪分布式必要修改二个布局文件 core-site.xml 和 hdfs-site.xml 。配置文件是
xml 格式,每种配置以宣称 property 的 name 和 value 的主意来贯彻。

 

修改core-site.xml,扩展四个property,某个人会把ip写成localhost,但个体提议利用ip会相比较有保证,不会那么轻易失误。

 

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://10.1.2.108:9000</value>
        <description>NameNode URI</description>
    </property>
</configuration>

  

修改hdfs-site.xml

  5、其他

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
</configuration>

  5.一 LevelDB合并错误(单机)

下一场实行格式化

采访方法:

[hadoop@root@ZhaoWei_10_1_2_108 hadoop]$ hdfs namenode -format
16/11/01 21:50:08 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = localhost/127.0.0.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 2.7.3
*****
****
find /data1/riak/data/leveldb -name "LOG" -exec grep -l 'Compaction error' {} \; | wc -l

得逞的话,汇合到 “successfully formatted” 和 “Exitting with status 0”
的指示,若为 “Exitting with status 1”
则是失误,出错的话能够尝尝删掉tmp文件夹然后再度来,还百般就只可以重新检查铺排文件有无错误。

  5.贰 LevelDB读取块操作错误(单机)

接着运行NameNode,SecondNameNode,DataNode进程

搜罗方法:

[hadoop@root@ZhaoWei_10_1_2_108 hadoop]$ start-dfs.sh   
16/11/01 21:53:18 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting namenodes on [localhost]
localhost: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-root@ZhaoWei_10_1_2_108.out
localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hadoop-datanode-root@ZhaoWei_10_1_2_108.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-secondarynamenode-root@ZhaoWei_10_1_2_108.out
16/11/01 21:53:34 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
/usr/sbin/riak-admin status

留意那里的0.0.0.0,跟上边的ssh配置相应。因为伪分布式不用配置SecondNameNode,所以选择暗许的host是0.0.0.0:32贰。尽管此刻ssh免密登录失效则会须求输入密码,那就重新配置ssh免密登入只怕输入密码。有时候会唤起输入yes,输入就能够。

指标 功能
leveldb_read_block_error LevelDB 读取块操作错误数量

初阶成功后基于 jps 命令来推断是还是不是运转成功。借使jps命令未找到则运转

 

[hadoop@root@ZhaoWei_10_1_2_108 hadoop]$ alias jps='/usr/local/java1.8.0_40/bin/jps'

[hadoop@root@ZhaoWei_10_1_2_108 hadoop]$ jps
54004 Jps
54871 NameNode
55800 NodeManager55023 DataNode

 

上边四个进程缺一不可,贫乏的话能够另行检查计划恐怕谷歌(谷歌(Google))寻找,当然也得以查阅日志,start-dfs.sh的出口有认证日志的门径,/usr/local/hadoop/logs下的.log文件

  五.三 节点存活状态(单机)

[hadoop@root@ZhaoWei_10_1_2_108 hadoop]$ tail logs/hadoop-hadoop-secondarynamenode-root@ZhaoWei_10_1_2_108.log 
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:191)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
        at com.sun.proxy.$Proxy11.rollEditLog(Unknown Source)
        at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.doCheckpoint(SecondaryNameNode.java:512)
        at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.doWork(SecondaryNameNode.java:395)
        at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode$1.run(SecondaryNameNode.java:361)
        at org.apache.hadoop.security.SecurityUtil.doAsLoginUserOrFatal(SecurityUtil.java:415)
        at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.run(SecondaryNameNode.java:357)

搜聚方法:

万一发现DataNode未运营则壹般情形下是id不壹致,停掉dfs删掉tmp目录然后再一次format就能够。若是是互联网难点,则关闭防火墙:

/usr/sbin/riak-admin member-status | grep `ifconfig | grep "inet addr:10" | awk -F':' '{print $2}' | awk '{print $1}'`
1) 重启后生效
开启: chkconfig iptables on
关闭: chkconfig iptables off
2) 即时生效,重启后失效
开启: service iptables start
关闭: service iptables stop

在开启了防火墙时,做如下设置,开启相关端口,
修改/etc/sysconfig/iptables 文件,添加以下内容:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 322 -j ACCEPT

出口如下,valid表示节点符合规律

倘诺赶过hadoop datanode Does not contain a valid host:port
authority导致的DataNode未运转则相似是hostname的主题素材,hostname有时候不可能包罗‘.’
‘/’ ‘_’等不法字符的主机名。修改/etc/hosts的hostname,然后hostname
newhostname,接着删掉tmp,重新format,重新start-dfs.sh

valid       9.0%      --      'riak@10.1.80.114'

  3、命令测试

  5.4 Riak Error Log(单机)

  由于DataNode出难题之后,作者把hostname修改为了master,之后的命令会是下边那样

Riak 日志路径:/data1/riak/logs 
采集文件:/data1/riak/logs/* 
采集时间段:最近一分钟 
采集内容:最近一分钟发生的错误数 
采集示例:grep error -rn /data1/riak/logs | wc -l 
说明:这个采集需要程序处理下逻辑,在此不给出完整的采集方法
[root@master ~]# 
[hadoop@master ~]$ 

   2、搜集程序

  上边运维的单机例子读取和写入的都以本地的文件系统,而伪分布式读取写入的是HDFS上的数目。

  一、Riak监察和控制系统规划

[hadoop@master ~]$ hdfs dfs -mkdir /user/hadoop  # 新建目录作为个人账号目录
[hadoop@master ~]$ hdfs dfs -mkdir input  # 新建

[hadoop@master ~]$ hdfs dfs -ls
16/11/03 00:10:18 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2016-11-03 00:06 input

[hadoop@master ~]$ hdfs dfs -ls /user/hadoop
16/11/03 00:10:42 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2016-11-03 00:06 /user/hadoop/input

[hadoop@master ~]$ hdfs dfs -ls -R /        
16/11/03 00:14:39 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
drwxr-xr-x   - hadoop supergroup          0 2016-11-03 00:14 /user
drwxr-xr-x   - hadoop supergroup          0 2016-11-03 00:14 /user/hadoop
drwxr-xr-x   - hadoop supergroup          0 2016-11-03 00:06 /user/hadoop/input

 DBA通过前台页面依据CMDB三级业务增加/卸载Riak集群监察和控制,依据CMDB的ip增多Riak单机监察和控制(单机属于集群,不可能独立存在,可增量增添单机监控),填写ip和端口,配置阈值、管事人等新闻

 在运营hadoop伪分布式实例此前大家先删掉以前单机形式产生的output文件夹,然后发轫运转

一)数据库设计

[hadoop@master hadoop]$ hdfs dfs -put *.txt input
16/11/03 09:58:32 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

[hadoop@master hadoop]$ hdfs dfs -ls input       
16/11/03 09:58:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 3 items
-rw-r--r--   1 hadoop supergroup      84854 2016-11-03 09:58 input/LICENSE.txt
-rw-r--r--   1 hadoop supergroup      14978 2016-11-03 09:58 input/NOTICE.txt
-rw-r--r--   1 hadoop supergroup       1366 2016-11-03 09:58 input/README.txt

[hadoop@master hadoop]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'SOFT[A-Z]+'

[hadoop@master hadoop]$ hdfs dfs -ls output
16/11/03 09:59:47 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r--r--   1 hadoop supergroup          0 2016-11-03 09:59 output/_SUCCESS
-rw-r--r--   1 hadoop supergroup         12 2016-11-03 09:59 output/part-r-00000

[hadoop@master hadoop]$ ls output
ls: cannot access output: No such file or directory

[hadoop@master hadoop]$ hdfs dfs -cat output/part-r-00000
16/11/03 10:00:23 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
49      SOFTWARE

[hadoop@master hadoop]$ hdfs dfs -get output ./output  # 将文件夹取回到本地文件系统
16/11/03 10:03:18 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

[hadoop@master hadoop]$ ls output/
part-r-00000  _SUCCESS      
[hadoop@master hadoop]$ cat output/part-r-00000 
49      SOFTWARE
[hadoop@master hadoop]$ 
mysql> use riakMonitor
show tabReading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------------------+
| Tables_in_riakMonitor     |
+---------------------------+
| riakClusterConf           | 
| riakClusterDisplay        | 
| riakClusterStatus         | 
| riakClusterStatusTemplate | 
| riakSingleConf            | 
| riakSingleDisplay         | 
| riakSingleStatus          | 
| riakSingleStatusTemplate  | 
+---------------------------+
8 rows in set (0.00 sec)

小心运营 Hadoop 程序时,程序内定的输出目录(如
output)不能够存在,不然会唤起错误,因而运营前须要先删除输出目录

Template表作为正史库表模板,历史库按月分库,按ip分表

  四、启动YARN

2) 单机Agent设计

   hadoop2使用了新的MapReduce框架(MapReduce V二,也称之为 YAHummerH二N,Yet
Another Resource
Negotiator),YARAV四N是从MapReduce中分离出来的,负责财富管理与任务调度。YAHighlanderN
运营于 MapReduce
之上,提供了高可用性、高扩大性。为啥要升高到YAKugaN,能够参见那篇文章《Hadoop
新 MapReduce 框架 Yarn 详解》。那里只援引文章的少数内容,有意思味的读者可径直展开小说查看越多内容:

  • Agent会通过机关调度平台发出到对象机器,Crond周期是一分钟,直接反映到mysql数据库。运营时刻超越肆五s
    会被调度平台kill
  • 假设检验不到riak或许命令出错则会发送rtx告警给admins + dba,
    系统错误会发送给admins

原框架的标题逐步浮出水面,首要的难题汇总如下:
一、JobTracker 是 Map-reduce 的汇总处理点,存在单点故障。
二、JobTracker 达成了太多的天职,产生了过多的能源消耗,当 map-reduce job
11分多的时候,会产生十分的大的内部存储器开支,潜在来讲,也加进了 JobTracker fail
的风险,那也是产业界普遍总结出老 Hadoop 的 Map-Reduce 只好帮忙 4000节点主机的上限。
三、在 TaskTracker 端,以 map/reduce task
的数目作为能源的表示过于简短,未有思虑到 cpu/
内部存款和储蓄器的挤占景况,若是四个大内存消耗的 task 被调度到了1块,很轻巧出现OOM。
肆、在 TaskTracker 端,把能源强制划分为 map task slot 和 reduce task
slot, 若是当系统中唯有 map task 恐怕唯有 reduce task
的时候,会形成财富的浪费,相当于后边提过的集群能源利用的标题。
5、源代码层面分析的时候,会发当代码相当的难读,平常因为一个 class
做了太多的工作,代码量达 三千 多行,,形成 class 的职分不明晰,增添 bug
修复和版本维护的难度。
陆、从操作的角度来看,今后的 Hadoop MapReduce
框架在有任何重大的依旧不根本的变化 ( 例如 bug 修复,质量提高和特征化 )
时,都会强制举行系统级其余晋升翻新。更糟的是,它不管用户的喜好,强制让分布式集群系统的每三个用户端同时更新。那一个创新会让用户为了证实他们事先的应用程序是否适用新的
Hadoop 版本而浪费多量岁月。

三) 集群集聚设计

Yarn 框架相对于老的 MapReduce 框架什么优势呢?我们能够观看:
一、那一个安排大大减小了 JobTracker(也正是今日的
ResourceManager)的财富消耗,并且让监测每1个 Job 子职务 (tasks)
状态的次序分布式化了,更安全、更美丽。
二、在新的 Yarn 中,ApplicationMaster
是二个可转移的某些,用户可以对两样的编制程序模型写本身的
AppMst,让越来越多门类的编制程序模型能够跑在 Hadoop 集群中,可以参照 hadoop Yarn
官方配置模板中的 mapred-site.xml 配置。
三、对于财富的象征以内部存款和储蓄器为单位 ( 在当前版本的 Yarn 中,未有考虑 cpu
的占用 ),比此前以剩余 slot 数目更合理。
4、老的框架中,JobTracker 2个非常的大的担当正是督查 job 下的 tasks
的运维处境,未来,那些部分就扔给 ApplicationMaster 做了,而
ResourceManager 中有三个模块叫做 ApplicationsMasters( 注意不是
ApplicationMaster),它是监测 ApplicationMaster
的运转处境,假如出题目,会将其在其余机器上海重机厂启。
伍、Container 是 Yarn
为了前几天作财富隔断而建议的一个框架。这点应该借鉴了 Mesos
的行事,如今是一个框架,仅仅提供 java 虚拟机内部存款和储蓄器的隔开 ,hadoop
团队的设计思路应该承袭能支撑越多的能源调度和调控 ,
既然财富表示成内部存款和储蓄器量,那就未有了事先的 map slot/reduce slot
分开形成集群能源闲置的两难情景。

  • 集群数据遵照节点agent上报数据在50s的时候select出当下1秒钟的数量总结汇聚入库
  • 先后每分钟都会免去clusterStatus的数量,倘诺agent在本分钟上报心跳12分恐怕上报时间不在集群程序运维前(50s),cluster则不会总括该ip数据,但平均值总括时的除数会算上该ip(+一)
  • 集群总结同时会写进历史库,并创立历史表

  接下去起先修改配置文件。

四) CGI接口设计(NodeJs)

[hadoop@master hadoop]$ cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
  • 异步接收agent上报的数据,依据redis的ip列表调换到ip一
  • 假定redis获取的ip一不设有singleConf表中则会拒绝上报,重临300三荒唐
  • 反馈成功会入singleStatus和历史库,并创立历史表

修改etc/hadoop/mapred-site.xml,增加property

伍) 代码列表

    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
CGI :  /data/riakMonitor   # daemon
agent: /home/opd/script/riakMonitor  #  crond
analyzer: /opdData/opdOnline/script/kmc/riakMonitor/analyzer  # crond
1、从CMDB更新single/cluster conf数据  
2、同步conf和display
3、解析status数据到display
4、异常数据写入
5、告警
riakTool: /opdData/opdOnline/script/kmc/riakMonitor/riakTool  # daemon
每分钟第50s运行一次
1、获取监控集群和集群的ip,计算结果并汇聚
2、操作redis,将集群数据入历史库

修改etc/hadoop/yarn-site.xml,增加property

  2、搜集程序部分代码 (单机,python贰.四)

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

一) 搜罗指标函数

启动YARN

def getRiakMeta():
    thisFuncName = str(sys._getframe().f_code.co_name)
    cmdStr = "/usr/sbin/riak-admin status"
    cmdCode, cmdStdout, cmdStderr = getCmdResult(cmdStr)
    if 0 != cmdCode:
        msgTxt = "[%s] %s failed" % (thisFuncName, cmdStr)
        logger.error(msgTxt)
        sendRtx(MYCONF.riakAdmins, thisFuncName+" %s Fail:" % cmdStr)
        return 1

    data["node_gets"] = data["node_puts"] = data["node_get_fsm_time_mean"] = data["node_get_fsm_time_median"] = 0
    data["node_get_fsm_time_95"] = data["node_get_fsm_time_100"] = data["node_put_fsm_time_mean"] = 0
    data["node_put_fsm_time_median"] = data["node_put_fsm_time_95"] = data["node_put_fsm_time_100"] = 0
    data["sys_process_count"] = data["memory_processes"] = data["memory_processes_used"] = 0
    data["read_repairs"] = data["node_get_fsm_siblings_mean"] = data["node_get_fsm_siblings_median"] = 0
    data["node_get_fsm_siblings_95"] = data["node_get_fsm_siblings_100"] = data["node_get_fsm_objsize_mean"] = 0
    data["node_get_fsm_objsize_median"] = data["node_get_fsm_objsize_95"] = data["node_get_fsm_objsize_100"] = 0
    data["leveldb_read_block_error"] = 0

    riakItemInfo = cmdStdout.split('\n')
    for each in riakItemInfo:
        eachInfo = each.split(" : ")
        if 2 == len(eachInfo):
            itemKey = eachInfo[0]
            itemValue = eachInfo[1].replace('<<"', '').replace('">>', '')
            if itemKey in data: 
                logger.debug("%s:%s" % (itemKey, itemValue))
                try:
                    data[itemKey] = str(round(float(itemValue), 2))
                except ValueError:
                    data[itemKey] = itemValue
                except:
                    raise

    cmdStr = """ find /data1/riak/data/leveldb -name "LOG" -exec grep -l 'Compaction error' {} \; | wc -l """
    cmdCode, cmdStdout, cmdStderr = getCmdResult(cmdStr)
    if 0 != cmdCode:
        msgTxt = "[%s] %s failed" % (thisFuncName, cmdStr)
        logger.error(msgTxt)
        sendRtx(MYCONF.riakAdmins, thisFuncName+" Fail:" + msgTxt)
        return 1
    data["leveldb_compaction_error"] = cmdStdout #不用转int

    cmdStr = "/usr/sbin/riak-admin member-status | grep %s" % data["mainIp"]
    cmdCode, cmdStdout, cmdStderr = getCmdResult(cmdStr)
    logger.debug(cmdStdout)
    if 0 != cmdCode:
        msgTxt = "[%s] %s failed" % (thisFuncName, cmdStr)
        logger.error(msgTxt)
        sendRtx(MYCONF.riakAdmins, thisFuncName+" Fail:" + msgTxt)
        return 1
    if cmdStdout.strip().startswith('valid'):
        data["is_active"] = 1
    else:
        data["is_active"] = 0

    data["riak_error_log"] = 0
    riakLogPath = "/data1/riak/logs/"
    if not os.path.isdir(riakLogPath):
        msgTxt = "[%s] %s not exists" % (thisFuncName, riakLogPath)
        logger.error(msgTxt)
        sendRtx(MYCONF.riakAdmins, thisFuncName+" Fail:" + msgTxt)
        return 1
    riakLogInfo = os.listdir(riakLogPath)
    reportTimeSec = time.mktime(time.strptime(data["report_time"], "%Y-%m-%d %H:%M:%S"))
    for each in riakLogInfo:
        logger.debug("fileName: "+each)
        eachFile = os.path.join(riakLogPath, each)
        if os.path.isfile(eachFile):
            try:
                eachFd = open(eachFile, 'r')
            except IOError, e:
                msgTxt = "I/O error({}): {}".format(e.errno, e.strerror)
                logger.error(msgTxt)
                sendRtx(MYCONF.riakAdmins, thisFuncName+" Fail:" + msgTxt)
                return 1
            else:
                for eachLine in eachFd: #从头读,怕文件太大撑爆内存
                    if "error" in eachLine: #2016-03-20 04:57:09.704 [info] <0.19012.49>@riak_kv_index_h
                        eachInfo = eachLine.split(' ')
                        try:
                            eachTimeStr = "%s %s" % (eachInfo[0], eachInfo[1][:-4])
                            eachTimeSec = time.mktime(time.strptime(eachTimeStr, "%Y-%m-%d %H:%M:%S"))
                            if reportTimeSec - 60 <= eachTimeSec < reportTimeSec:
                                logger.debug(eachLine)
                                data["riak_error_log"] += 1
                            elif eachTimeSec >= reportTimeSec:
                                break
                        except:
                            msgTxt = "file(%s) format wrong " % eachFile
                            logger.error(msgTxt)
                            break
                            #sendRtx(MYCONF.riakAdmins, thisFuncName+" Fail:" + msgTxt)
                            #eachFile.close()
                            #return 1
                eachFd.close()
    return 0
[hadoop@master hadoop]$ start-yarn.sh 
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-hadoop-resourcemanager-master.out
localhost: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-hadoop-nodemanager-master.out

[hadoop@master hadoop]$ jps
51616 NameNode
51771 DataNode
51995 SecondaryNameNode
3421 ResourceManager
3550 NodeManager
3919 Jps

2)  上报和失利重传函数

能够发现,比以前多了五个进度 NodeManager, ResourceManager。运维 YA昂CoraN
之后,运维实例的秘诀只怕同样的,仅仅是能源管理措施、任务调度不一样。有意思味的读者能够考查日志相比变化。

def report2server(content, retry):
    '''上报到入库程序,根据ip求余获取优先的server,如果上报失败会遍历server列表'''
    thisFuncName = ""
    try:
        thisFuncName = str(sys._getframe().f_code.co_name)
        pos = data["ip"] % len(MYCONF.reportServer)
        serverKeys = MYCONF.reportServer.keys()
        serverKeys.sort()
        serverKeys = serverKeys[pos:] + serverKeys[:pos]
        for serverId in serverKeys:
            cmdStr = "/usr/bin/curl -s --connect-timeout %d -m %d -d '%s&reTry=%d' %s" %(
                    MYCONF.curlConnectTimeout, MYCONF.curlMaxTimeout, content, retry, MYCONF.reportServer[serverId])
            cmdCode, cmdStdout, cmdStderr = getCmdResult(cmdStr)
            logger.info(cmdStr + "\ncmdCode:" + str(cmdCode) + "\n" + cmdStdout + cmdStderr)
            if 0 == cmdCode:
                return 0
        return 1
    except:
        exceptmsg = StringIO.StringIO()
        traceback.print_exc(file=exceptmsg)
        msgTxt = exceptmsg.getvalue()
        sendRtx(MYCONF.admins, thisFuncName + " Fail:" + msgTxt)
        return 1

def reportScheduler(reportRecord=0):
    '''reportRecord = 0 表示上报data中采集的新数据, 
    reportRecord = 1 表示从reportFailFile里面获取最新的一条数据上报到server,然后需要处理reportFailFile'''
    thisFuncName = ""
    try:
        thisFuncName = str(sys._getframe().f_code.co_name)
        if 1 == reportRecord: # 从上报失败文件中获取最后一条数据,上报之
            if not reportFail.has_section("index"): #这里不要去add_section("index") 该谁add谁add去
                return 0
            if not reportFail.has_option("index", "index") or "" == reportFail.get("index", "index").strip():
                return 0
            indexVec = MYCONF.splitRe.split(reportFail.get("index", "index").strip())
            index = indexVec[-1]
            if "" == index:
                msgTxt = reportFail.get("index", "index").strip()
                sendRtx(MYCONF.admins, thisFuncName + "[系统错误] index.index 末尾有多余的逗号 " + msgTxt)
                return 1
            if not reportFail.has_option("content", index + "_c") or not reportFail.has_option("content", index + "_t"): 
                # _c 是内容  _t 是重试次数
                msgTxt = "content sector 缺少 %s_c 或 %s_t" %(index, index)
                sendRtx(MYCONF.admins, thisFuncName + "[系统错误] " + msgTxt)
                return 1
            content = reportFail.get("content", index + "_c")
            retry = reportFail.getint("content", index + "_t")
            retry += 1
            code = report2server(content, retry)
            if 0 == code: # 发送成功
                indexVec.remove(index)
                if indexVec:
                    reportFail.set("index", "index", ",".join(indexVec))
                else:
                    reportFail.set("index", "index", "")
                reportFail.remove_option("content", index + "_c")
                reportFail.remove_option("content", index + "_t")
            elif retry > MYCONF.maxRetry: # 重发失败,且超过最大重试次数
                indexVec.remove(index)
                if indexVec:
                    reportFail.set("index", "index", ",".join(indexVec))
                else:
                    reportFail.set("index", "index", "")
                reportFail.remove_option("content", index + "_c")
                reportFail.remove_option("content", index + "_t")
            else: # 重发失败, 更新 _t (retry) 字段
                reportFail.set("content", index + "_t", retry)
        else: # 发送新数据
            index = data["report_time"].replace(" ", "").replace("-", "").replace(":", "")
            content = urllib.urlencode(data)
            retry = 0
            code = report2server(content, retry)
            if 0 == code:
                return 0
            if not reportFail.has_section("index"):
                reportFail.add_section("index")
                reportFail.set("index", "index", index)
                reportFail.add_section("content")
                reportFail.set("content", index + "_c", content)
                reportFail.set("content", index + "_t", retry)
            else:
                indexVec = MYCONF.splitRe.split(reportFail.get("index", "index").strip())
                indexVec.append(index)
                if len(indexVec) > MYCONF.maxFailRecord: # 超过最大 fail record 数
                    reportFail.set("index", "index", ",".join(indexVec[len(indexVec) - MYCONF.maxFailRecord:]))
                    reportFail.set("content", index + "_c", content)
                    reportFail.set("content", index + "_t", retry)
                    for i in range(0, len(indexVec) - MYCONF.maxFailRecord):
                        delIndex = indexVec[i]
                        reportFail.remove_option("content", delIndex + "_c")
                        reportFail.remove_option("content", delIndex + "_t")
                else:
                    reportFail.set("index", "index", ",".join(indexVec))
                    reportFail.set("content", index + "_c", content)
                    reportFail.set("content", index + "_t", retry)
        return 0
    except:
        exceptmsg = StringIO.StringIO()
        traceback.print_exc(file=exceptmsg)
        msgTxt = exceptmsg.getvalue()
        sendRtx(MYCONF.admins, thisFuncName + " Fail:" + msgTxt)
        return 1

留神在单机上运行YA景逸SUVN恐怕会意识测试实例的运转速度变慢了(能够观望单机伪分布式并不吻合采用YA途睿欧N),那时候假若要关闭YALX570N直接开发银行伪分布式平台则须求将mapred-site.xml删掉,保留原来的mapred-site.xml.template 就能够。停止YA汉兰达N命令如下

叁) 获取shell命令输出函数

[hadoop@master hadoop]$ stop-yarn.sh
stopping yarn daemons
stopping resourcemanager
localhost: stopping nodemanager
no proxyserver to stop

[hadoop@master hadoop]$ jps
51616 NameNode
7236 Jps
51771 DataNode
51995 SecondaryNameNode
def getCmdResult(cmdStr):
    '''获取shell命令的返回码,标准输出,标准错误'''
    #child = subprocess.Popen(cmdStr, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)
    #cmdStdout, cmdStderr = child.communicate()
    #cmdCode = child.wait() 
    #return (cmdCode, cmdStdout, cmdStderr)
    thisFuncName = str(sys._getframe().f_code.co_name)
    nowTime = int(time.time())
    tmpstdout = os.path.join(MYCONF.basePath, "cmd.stdout.%d.tmp" % nowTime)
    tmpstderr = os.path.join(MYCONF.basePath, "cmd.stderr.%d.tmp" % nowTime)
    if "debug" == MYCONF.role:
        msgTxt = "[%d]Run Cmd: %s" % (nowTime, cmdStr)
        logger.debug(msgTxt)

    cmdStr = "(%s) 1>%s 2>%s" %(cmdStr, tmpstdout, tmpstderr)
    cmdCode = os.system(cmdStr) >> 8
    cdmStdout = cmdStderr = ""
    try:
        outfd = open(tmpstdout)
        cmdStdout = outfd.read()
        errfd = open(tmpstderr)
        cmdStderr = errfd.read()
    except:
        exceptmsg = StringIO.StringIO()
        traceback.print_exc(file=exceptmsg)
        msgTxt = exceptmsg.getvalue()
        sendRtx(MYCONF.admins, thisFuncName + " Fail:" + msgTxt)
        cmdCode = 110
    else:
        outfd.close()
        errfd.close()
        os.remove(tmpstderr)
        os.remove(tmpstdout)
    return (cmdCode, cmdStdout, cmdStderr)

比方要关闭hadoop伪分布式平台,则先截止YA卡宴N,再停止NameNode

4) 读/写Cache函数

hadoop@master hadoop]$ stop-yarn.sh
stopping yarn daemons
stopping resourcemanager
localhost: stopping nodemanager
no proxyserver to stop
、
[hadoop@master hadoop]$ jps
51616 NameNode
7236 Jps
51771 DataNode
51995 SecondaryNameNode

[hadoop@master hadoop]$ stop-dfs.sh 
16/11/03 10:36:37 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Stopping namenodes on [localhost]
localhost: stopping namenode
localhost: stopping datanode
Stopping secondary namenodes [0.0.0.0]
0.0.0.0: stopping secondarynamenode
16/11/03 10:36:56 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

[hadoop@master hadoop]$ jps
9463 Jps
def readLastCache():
    global lastCache
    lastCache = ConfigParser.ConfigParser()
    if not os.path.isfile(MYCONF.lastCacheFile):
        try:
            fd = open(MYCONF.lastCacheFile, "w")
        except IOError, e:
            logger.error("I/O error({}): {}".format(e.errno, e.strerror))
            return 1
        else:
            fd.close()
    lastCache.readfp(open(MYCONF.lastCacheFile), "rb")
    return 0

def writeCache():
    thisFuncName = ""
    try:
        thisFuncName = str(sys._getframe().f_code.co_name)
        lastCache.write(open(MYCONF.lastCacheFile, 'w'))
        return 0
    except:
        exceptmsg = StringIO.StringIO()
        traceback.print_exc(file=exceptmsg)
        msgTxt = exceptmsg.getvalue()
        logger.error(msgTxt)
    return 1

重新启航并查阅运转进度和集群状态音讯

伍)  读/写战败记录

[hadoop@master hadoop]$ start-dfs.sh 
[hadoop@master hadoop]$ start-yarn.sh
[hadoop@master hadoop]$ jps
12178 ResourceManager
12690 Jps
11540 NameNode
11943 SecondaryNameNode
12312 NodeManager
11707 DataNode
[hadoop@master hadoop]$ hdfs dfsadmin -report 
def readFailRecord():
    global reportFail
    reportFail = ConfigParser.ConfigParser()
    if not os.path.isfile(MYCONF.lastReportFailFile):
        try:
            fd = open(MYCONF.lastReportFailFile, "w")
        except IOError, e:
            logger.error("I/O error({}): {}".format(e.errno, e.strerror))
            return 1
        else:
            fd.close()
    reportFail.readfp(open(MYCONF.lastReportFailFile), "rb")
    return 0

def writeFailRecord():
    thisFuncName = ""
    try:
        thisFuncName = str(sys._getframe().f_code.co_name)
        reportFail.write(open(MYCONF.lastReportFailFile, 'w'))
        return 0
    except:
        exceptmsg = StringIO.StringIO()
        traceback.print_exc(file=exceptmsg)
        msgTxt = exceptmsg.getvalue()
        logger.error(msgTxt)
    return 1

  五、web查看

6) main函数

出于小编从未选用web查看过,所以不晓得网页查看是长什么样子的。但端口应该是50030和和50070。能够展开页面访问http://your
ip:50030,http://your ip:50070

def main():
    data["osType"] = 0 # 0表示 linux
    data["version"] = MYCONF.version # 当前程序的自定义版本号
    data["report_time"] = time.strftime("%Y-%m-%d %H:%M:00") #上报时间,由于目前基础监控是分钟级监控粒度,因此秒取 00

    initLog()
    logger.info('='*80)
    if 0 == checkLastPid() and 0 == readLastCache() and 0 == getLoginIp():
        readFailRecord() # 读取早迁采集周期上报失败,需要重传的数据
        reportScheduler(reportRecord=1) #从 fail record 中选取最近的一条信息上报给服务器
        if 0 == getRiakMeta():
            reportScheduler(reportRecord=0)
        writeFailRecord()
        writeCache()
    logger.info('='*80)
    logging.shutdown()
    return 

 

  三、增添/卸载监察和控制

到现在,伪分布式hadoop平台搭建完成。要打听更加多请参见官方网址文书档案

一) 增加监察和控制

原创文章,转发请备注原作地址 http://www.cnblogs.com/lxmhhy/p/6006252.html

添加监控需要先添加集群(不支持先添加IP),添加集群会默认把所有IP都添加监控(前台将在clusterConf新增记录,并在singleConf增加对应的ip记录,然后调用调度平台,检测ip是否已经安装)如果该集群在CMDB里面新增Ip,则需要手动添加监控(前台提供新增监控节点,插入singleConf)

文化沟通座谈请加qq群:1802144四一。多谢合营

贰) 卸载监察和控制

(1) 卸载监控可以卸载整个集群的监控(将clusterConf needMonitor置0,同步将singleConf的needMonitor都置0,然后调用

调度平台

卸载集群下的所有机器,如果该ip存在其他集群并且需要监控,则不用调用

调度平台

卸载)也可以卸载单个节点的监控(前台将singleConf的needMonitor置0,调用

调度平台

,同样判断ip是否存在其他集群) (2) 添加卸载监控部由前台调用

调度平台

接口,并修改数据库(插入数据或者更新need_monitor) (3) Single/cluster dislplay表会同步conf表的数据,只保留need_monitor=1的数据

  四、CMDB数据同步

后台一直同步CMDB的数据和conf表的数据,如果不在CMDB的则需要删掉conf里面的数据,不管needMonitor的值为多少。删除三级业务的话只需要删除clusterConf表对应的记录,single会自动同步外键(尝试调用

调度平台

卸载接口,卸载掉被删除的三级业务ID下面的所有已安装监控的IP)

  5、前台显示

一) 集群状态体现

图片 1

 

图片 2

二) 单机节点状态呈现

图片 3

 

图片 4

 

原创小说,转发请备注原来的文章地址 http://www.cnblogs.com/lxmhhy/p/6036330.html

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注