数据平台笔记-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