数据平台笔记-数据不一致问题排查
对于突然停电导致系统shutdown,最受伤的就是hbase的数据,完全重启后,会发现hbase的表出问题,要么表不存在,要么存在但是根本写不进去数据。大部分是由于zookeeper中保存的数据和hbase不一致,所以需要从源头进行排查,就是hbase的存储hdfs。
检查hdfs
进入hadoop的管理页面http://ibdp-00:50070,会显示错误的blocks信息,如果没有说明hdfs文件没有问题。
如果存在问题,就扫描hdfs,根据错误提示删除掉坏的block
hadoop fsck / a
hadoop fs -rm /xxxxx
检查HBase
这个时候在写hbase看看,能否写入,如果还是有问题,先查看hbase日志,如果出现下面所示异常,说明hbase集群状态不一致。
表有问题是,hbase客户端连接时,会不停的重试,默认是35次,可以修改小一点的值(主配置文件hbase.client.retries.number),减少重试次数。
删除zookeeper中的hbase目录,然后重启habse,在zk中自动重新建立目录。
hbase zkcli
rmr /hbase
hbase-start.sh
如果还是出现错误,那就对hbase进行状态检查和修复,先查看hbase的管理页面,查看表状态,根据所在节点,在继续查看regin server的log日志。
如上图中的hdfs中没有对应的文件,而habse meta中有数据,不一致,那么使用如下命令先检查一致性,在进行修复,修复后需要重启hbase。
hbase hbck -details
hbase hbck -fixMeta -fixAssignments
出现问题,应该先检查日志,根据日志进行判断,而不是瞎猜,浪费时间。
Ambari安装笔记
通过Ambari安装hadoop是很多人的选择,但是由于各种环境问题,通常安装不顺利,而且hadoop系统最好是手动安装部署,这样维护起来也比较清晰明了,我想使用的Ambari对服务器硬件资源的监控,hadoop服务组件的监控,可以通过后期修改配置文件的方式,集成进Ambari中。
精简安装
只安装必要的组件即可,先把服务器资源监控起来。
前戏
在所在集群中设定一台安装ambari-server,非hadoop的master概念,其他被监控机器安装ambari-agent,非hadoop的slave概念;集群所有机器为centos7,所需软件从看这里下载(不同ambar版本可以自己修改链接中的版本号),请不要在线安装,很慢;找到你的OS版本,找到Tarball对应的链接地址,下载所需的全部安装文件。
以下操作没有特别说明,都在所有机器上执行。
下载文件中包含对应版本的centos的软件源地址文件,文件名为ambari.repo
,拷贝到/etc/yum.repos.d/
下即可,这样yum有时候需要在线安装源就不会有问题。将所有文件拷贝到集群服务器上面。另外,安装hadoop的服务器设置默认都已经做了,比如从ambari-server机器免密ssh登录到ambari-agent机器上,hosts配置等等,这里不再说了。
修改认证相关的系统配置,文件位于/etc/python/cert-verification.cfg,设置为disable。
安装
先安装ambari-server,使用如下命令直接安装server程序
yum localinstall -y ambari-server-2.5.0.3-7.x86_64.rpm
这里会将默认的依赖库postgresql安装,因为ambari默认使用postgresql存储。安装完毕后,执行如下命令进行数据库设置等初始化,默认即可
ambari-server setup
如果此过程中,发生反复,数据库需要还原,请执行如下命令
ambari-server reset
然后启动ambari server,如下命令。启动成功后,可通过http://ip:8080
访问
ambari-server start
下面开始安装agent,请不要通过web页面提供的ssh安装,我们手动在各个被监控服务器上安装agent,以及其他所需的包,执行命令
yum localinstall -y ambari-agent-2.5.0.3-7.x86_64.rpm
yum localinstall -y ambari-metrics-hadoop-sink-2.5.0.3-7.x86_64.rpm
yum localinstall -y ambari-metrics-monitor-2.5.0.3-7.x86_64.rpm
yum localinstall -y smartsense-hst-1.4.0.2.5.0.3-7.x86_64.rpm
以上几个是每个被监控服务器上必须有的,手动安装好后,设置agent连接的服务器,我们这里是server所在的机器ip地址,设置文件为/etc/ambari-agent/conf/ambari-agent.ini
,修改hostname为server端ip。然后启动agent服务。
ambari-agent start
然后我们访问web端正式开始安装,选择amdin下的manager ambari开始,具体根据web提示进行安装即可,因为server端会安装其他组件,如果安装过程中失败,根据log日志,直接安装下载包中的软件即可。另外,在组件选择上只选择zookeeper和ambari-metrics即可,最小化安装,其他组件暂时不需要。会要求输入一些服务的密码,请记录保存,在后期使用zeppelin等服务时会用到。
这里zookeeper也是搭建一个集群,选择3台服务器,系统也是要求最小3台机器。如图安装过程:
安装成功后,所有服务启动时,ambari-metrics服务有问题,根本问题是Metrics Collector服务启动失败,它用于收集所有被监控机器的数据,有2个原因导致:
ambari-metrics服务需要使用hbase,hbase启动时默认使用自带的zookeeper,请使用前面我们安装的zookeeper集群,既然有了我们就不在使用其他zk服务了,后面hadoop组件同样也使用这一个zk集群,找到zk服务的client端口设置,在页面中找到Ambari Metrics服务的config选项卡,设置
hbase.zookeeper.property.clientPort
属性和hbase.zookeeper.quorum
属性。hbase启动过程中,提示找不到
ClassNotFoundException: org.apache.commons.httpclient.methods.RequestEntity
,问题在于缺少依赖包commons-httpclient-3.1.jar,下载一个放在hbase所在目录lib包下,位于/usr/lib/ams-hbase/lib
。
所有服务启动成功后,如下图:
某一台服务器监控如下图所示,可以在Hosts菜单中增加新的服务器,过程同安装agent一样,新安装的机器,监控数据要等会儿才能看见,页面会自动刷新。
服务自定义
很难实现
服务的清除
安装这种分布式系统,难免来来回回几次,那么我们需要清除组件,ambari给我们提供了清除脚本很方便。
停止所有服务
停止server和agent的服务
ambari-server stop
ambar-agent stop
执行清除脚本
sudo python /usr/lib/python2.6/site-packages/ambari_agent/HostCleanup.py --silent --skip=users -o cleanup.log
手动删除相关
yum erase -y ambari-*
rm -rf /usr/lib/ambari-server
rm -rf /usr/lib/python2.6/site-packages/ambari_agent
rm -rf /usr/lib/python2.6/site-packages/指向ambari目录的软连接
rm -rf /usr/lib/python2.6/site-packages/ambari* /usr/lib/python2.6/site-packages/resource-management
yum erase -y postgresql-*
rm -rf /var/lib/pgsql*
yum clean all
rm -f /etc/yum.repos.d/ambari.repo
rm -rf /usr/iop/
rm -rf /hadoop
rm -rf /etc/hadoop/ /etc/hive /etc/hbase/ /etc/oozie/ /etc/zookeeper/ /tmp/spark
数据平台笔记-Hadoop搭建
基本的硬件组装完成后,需要安装hadoop,目前有好几个版本可供选择,我选择的是较低的一个版本,而且是手动安装,具体下载链接请去官网寻找。在安装之前,先做好hadoop平台规划,那个节点是主节点,那个是从节点,机器名统一,做到见名知意。
服务器环境准备
ssh免密码登录
在主从节点通信时,通过ssh时需要验证密码,我们需要设置免密码的方式进行通讯。包括master到所有slave免密码,master到master自身需要免密码,具体设置方式请看以前的一篇文章。另外,在所有节点的hosts中配置好所有节点和机器名的对应关系。
关闭防火墙和selinux
systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service
设置selinux为disable /et/selinux/config
配置ntp服务
所有节点需要同步时间,保证软件的工作正常,安装ntp服务
yum -y install ntp
systemctl enable ntpd
systemctl start ntpd
timedatectl set-timezone Asia/Shanghai
timedatectl set-ntp yes
systemctl restart ntpd
ntpq -p
linux文件打开数目
在使用hbase时会打开很多文件,所有节点需要设置linux系统本身支持的文件打开数,同时还要设置hadoop组件的进程数目。
* soft nofile 1000000
* hard nofile 1000000
hdfs - nofile 32768
mapred - nofile 32768
hbase - nofile 32768
hive - nproc 32768
yarn - nproc 32768
storm - nproc 32768
文件压缩配置
hbase或者hadoop存储数据时支持多种压缩,可以使用命令hadoop checknative -a
来检查支持的压缩方式。其中使用snappy压缩时,需要os支持,所以要先在os中安装好snappy功能。具体的linux安装snappy和配置过程还是比较麻烦的,参考这里和这里。
linux环境变量
在系统的环境配置文件(/etc/profile)中设置好所有hadoop的环境变量,包括java环境变量,供各个组件使用
export JAVA_HOME=/usr/java/jdk1.8.0_121
export HADOOP_HOME=/opt/hadoop-2.5.2
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HBASE_HOME=/opt/hbase-0.98.9-hadoop2
export CLASSPATH=.:$JAVA_HOME/lib:$HADOOP_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:$PATH
export SPARK_HOME=/opt/spark-1.6.3
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
hadoop
下载的hadoop以及其他软件都放在/opt目录下,然后进入目录/opt/hadoop-2.5.2/etc下,配置相关文件
slaves
填写所有的从节点机器名
core-site.xml
填写hdfs协议的地址和端口hdfs://ibdp-00:9000
,属性名为fs.defaultFS
;还有压缩项的配置io.compression.codecs
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ibdp-00:9000</value>
</property>
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec
</value>
</property>
</configuration>
hdfs-site.xml
配置好hdfs的备份份数和namenode和datanode的存储目录,以及开启webhdfs功能
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/dfs/data</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- Specifies the maximum number of threads to use for transferring data in and out of the DN. -->
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>8192</value>
</property>
</configuration>
yarn-env.sh
主要是配置好java_home
这个环境变量,其他不动
export JAVA_HOME=/usr/java/jdk1.8.0_121
yarn-site.xml
主要配置资源管理器yarn主节点相关
<property>
<name>yarn.resourcemanager.address</name>
<value>ibdp-00:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>ibdp-00:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>ibdp-00:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>ibdp-00:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>ibdp-00:8088</value>
</property>
hadoop-env.sh
主要配置java_home
export JAVA_HOME=/usr/java/jdk1.8.0_121
配置好后,拷贝目录到所有slave的相同目录下即可,然后开始第一次格式化所有节点的hdfs
cd /opt/hadoop/bin/
./hdfs namenode -format
在安装过程中可能会反复这个步骤,那就需要清空hdfs的数据,如下
清空配置的namenode和datanode目录下所有数据
清空/tmp下hadoop目录中的临时数据
清空zookeeper中/opt/zookeeper-data/version-2目录下所有数据,该目录存储了zookeeper的数据
启动hadoop命令比较简单,在master上直接执行一条命令即可,会启动所有slave节点的hadoop组件
./opt/hadoop-2.5.2/sbin/start-all.sh
通过命令jps可以查看hadoop的组件是否已经安装完成
slave:
6176 NodeManager
5339 DataNode
master:
5603 SecondaryNameNode
5174 NameNode
5820 ResourceManager
在hadoop维护过程中,会需要重启单个节点的服务,比如namenode服务挂掉,或者datanode服务挂掉
./opt/hadoop-2.5.2/sbin/yarn-daemon.sh start nodemanager
./opt/hadoop-2.5.2/sbin/hadoop-daemon.sh start datanode
zookeeper
虽然hadoop本身是不需要zookeeper支持的,但是后面我们数据存储选择了hbase,hbase自身携带的zk服务我们不需要,所以需要一个统一的zk服务,支持集群,以保证整个大数据平台的zk服务的稳定性。zk集群需要奇数位的节点,我们选择3个节点部署zk集群。
同样,zookeeper下载后,统一放在/opt目录下,然后进行配置,主要配置文件为zoo.cfg,配置通信节点和数据保存目录。
server.1=ibdp-01:2888:3888
server.2=ibdp-02:2888:3888
server.3=ibdp-03:2888:3888
dataDir=/opt/zookeeper-data
clientPort=2181
在/opt/zookeeper-data/
目录下增加文件myid, 内容为zk节点值,即server.后面的数值。然后拷贝到其他两个节点,每个节点分别启动,命令如下
./opt/zookeeper-3.4.9/bin/zkServer.sh start
zk服务决定了整个集群的数据一致性,特别对于hbase的数据,其中region数据等等的一致性都是通过zk来保存的,如果一旦hbase出现问题,请先清空zk中的hbase目录数据,重新启动hbase即可重新写入zk。日常维护zk,使用命令行即可。
./opt/zookeeper-3.4.9/bin/zkCli.sh -server 192.168.3.201:2181,192.168.3.202:2181,192.168.3.203:2181
另外zk的日志很大,需要定时清理,如果手动清理的话,可以使用命令保留最近几日的数据。通过jps可以查看到zk服务的进程QuorumPeerMain
./bin/zkCleanup.sh -n 5
hbase
hbase我们使用zk集群提供服务,并且hbase是依赖hdfs的,配置位于/opt/hbase-0.98.9-hadoop2/conf
下。对于hbase和zookeeper服务紧密结合在一起的,所有的表和region信息都存储在zk中,如果hbase出现一致性问题,请先删除zk中的相应目录数据,参考上面部分如何删除。
hbase-site.xml
配置依赖的hdfs地址和zk服务
<property>
<name>hbase.rootdir</name>
<value>hdfs://ibdp-00:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/zookeeper-data</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>ibdp-01,ibdp-02,ibdp-03</value>
</property>
hbase-env.sh
配置是否需要使用自带的zk服务和java_home
export HBASE_MANAGES_ZK=false
export JAVA_HOME=/usr/java/jdk1.8.0_121
hbase正常使用前提是,指定了zk服务和压缩功能的设置,以及os的文件数目设置,前文中已经提及snappy的配置,请自行参考。启动hbase通过master即可,在master上一个命令所有slave即启动
./opt/hbase-0.98.9-hadoop2/bin/start-hbase.sh
我们在使用hbase时是通过python的客户端进行操作的,需要打开hbase的thrift服务,命令如下
./opt/hbase-0.98.9-hadoop2/bin/hbase-daemon.sh start thrift
如果某个regionserver挂点,需要单独启动,用如下命令
/bin/hbase-daemon.sh start regionserver
jps查看hbase进程,可以看到
master:
7092 HMaster
slave:
7072 HRegionServer
kafka
为了实时接收交易所的行情数据,先把数据存储在kafka中,然后在进行处理写库。同样搭建kafka集群保证接收行情数据第一关不会出问题,搭建3个节点的集群,使用大数据平台的zk服务。配置文件位于/opt/kafka_2.12-0.10.2.0/config
下。
server.properties
配置kafka数据目录,zk服务地址等
advertised.host.name=192.168.3.202 # 每个节点ip都不同
advertised.host.port=9092 # 每个节点端口保持一致
broker.id=0 # 每个节点broken id不同
log.dirs=/home/kafka-data # 数据保存位置
num.partitions=3 # 每个topic保留3分,总共3个节点
log.retention.hours=168 # 数据保存时间
zookeeper.connect=192.168.3.201:2181,192.168.3.202:2181,192.168.3.203:2181
default.replication.factor=3
使用外部的zk服务时,zookeeper.properties中的dataDir配置失效。在维护kafka的过程中,有时需要删除topic的数据,而且是所有的数据,步骤如下
停止kafka
停止所有的生产者和消费者程序,如果不停止很可能删除topic后又被惯回来
删除某一个zk节点,如rmr /brokers/topics,其他节点中的相应目录自动同步删除
删除kafka安装目录中的server.properties中的log.dirs配置目录中的所有数据
重启kafka ./bin/kafka-server-start.sh -daemon config/server.properties
启动kafka后,用jps会查看到kafka进程。
以上是hadoop平台搭建的主要配置,就单个组件的配置来说还有很多可配置的地方,请参考官方文档。在启动所有组件时,安装如下顺序启动,命令如下
hadoop集群
./sbin/start-all.sh
./sbin/stop-all.sh
Zookeeper集群
./zkServer.sh start
kafka集群
./bin/kafka-server-start.sh -daemon config/server.properties
hbase集群
./bin/start-hbase.sh
thrift(主节点上)
./hbase-daemon.sh start thrift
Copyright © 2015 Powered by MWeb, Theme used GitHub CSS.