美文网首页
21.CDH搭建攻略

21.CDH搭建攻略

作者: 经纶先生 | 来源:发表于2017-10-23 15:40 被阅读0次

    设备规划

    我们使用6台真实服务器设备来演示整个CDH搭建、添加服务、调试、监控的整个过程

    操作系统及内核版本说明

    cat /etc/redhat-release 
    CentOS Linux release 7.3.1611 (Core) 
    
    uname -r 
    3.10.0-514.el7.x86_64
    

    ip及角色规划

    我们一共有6台设备,6台设备IP与域名规划分别是:

    192.169.20.201   test001.tpy.corp
    192.169.20.202   test002.tpy.corp
    192.169.20.203   test003.tpy.corp
    192.169.20.204   test004.tpy.corp
    192.169.20.205   test005.tpy.corp
    192.169.20.206   test006.tpy.corp
    
    • 192.169.20.206:
      CMserver、CMagent、namenode、ResourceMANAger、spark 管理节点、HIVE 管理节点
    • 192.169.20.205:
      CMagent、namenode(HA)、second_namenode、ResourceMANAger、spark 管理节点、HIVE 管理节点
    • 192.169.20.201-204:
      CMagent、datanode、snn、nodemanager 、spark运算节点、hive普通节点、zookeeper

    整个安装过程介绍:

    • 硬盘规划及分区
    • 安装依赖包
    • 修改主机名
    • 域名规划
    • 安装JAVA
    • 配置root用户的ssh免密登陆
    • 配置NTP时间同步
    • 下载主程序cm
    • 安装mysql服务端与客户端
    • 创建并配置CM数据库
    • 配置parcel 源(CDH版本HADOOP源)
    • 启动cloudera manager server 与 agent
    • 通过管理界面进行CDH 版 HADOOP 分发、启动、 配置

    一 、硬盘规划及分区

    我来给大家说一下真实环境的大数据服务器应该怎么选购硬盘类型和做raid
    首先我们进行大数据服务器选型的时候就应该注意,我们要采购两种不同类型的服务器,一种作为namenode等管理节点,一种作为datanode的数据节点

    • namenode管理节点对数据的安全性很高,一般我会这样做:
      两块300G SAS 15K 做raid1,用作系统盘,多块大容量磁盘做RAID5+全局热备
    • datanode数据节点:
      datanode数据节点,两块300G SAS 15K 做raid1,用作系统盘,这个与namenode保持一致
      但是数据盘一般会选用2T或者4T盘,JBOD模式或者(单盘做RAID0,在不支持JBOD情况下选用此模式)
      千万不要把数据盘做raid,因为HDFS本身就有备份机制,你再用raid的备份机制,会浪费大量空间

    生产环境namenode 大于 2T硬盘分区脚本:

    #!/bin/bash 
    for x in b
    do
    echo "
    mklabel gpt 
    yes 
    mkpart primary 0% 100% 
    quit 
    " | parted /dev/sd$x
    
    mkfs.xfs /dev/sd${x}1
    
    mkdir -p /data
    mount /dev/sd${x}1 /data
    echo "/dev/sd${x}1                           /data        xfs     defaults        0 0" >>/etc/fstab
    done
    
    分区完成之后检查:
    
    [root@localhost opt]# df -TH 
    /dev/sdb1      xfs       4.2T   34M  4.2T   1% /data
    

    生产环境datanode 提供分区脚本:
    大于2T的盘需要使用GPT格式,然后12块盘分别挂载至 /data/dn/{b,c,d,e,f,g,h,i,j,k,l,m},并写入/etc/fstab , 上面路径中的dn是datanode的简称

    #!/bin/bash
    for x in b c d e f g h i j k l m
    do
    echo "
    mklabel gpt
    yes
    mkpart primary 0% 100%
    quit
    " | parted /dev/sd$x
    
    
    mkfs.xfs /dev/sd${x}1
    
    mkdir -p /data/dn/$x
    mount /dev/sd${x}1 /data/dn/$x
    echo "/dev/sd${x}1                           /data/dn/$x        xfs     defaults        0 0" >>/etc/fstab
    
    done
    

    本次实验环境的磁盘情况:
    因为我们是测试环境,没有那么多硬盘,所以我们就使用了如下
    六台服务器全部使用了一样的硬盘配置
    两块300G 15K SAS 做了raid 1,作为系统盘
    几块硬盘做了RAID5+一块全局热备,作为数据盘,并挂载至/data 目录
    生产环境强烈不建议这样做

    二、安装依赖包

    yum install -y chkconfig python bind-utils psmisc libxslt zlib sqlite cyrus-sasl-plain cyrus-sasi-gssapi fuse portmap fuse-libs redhat-lsb
    

    三、修改主机名

    第一步:hostname test001.tpy.corp
    第二步:vim /etc/sysconfig/network
    HOSTNAME=test001.tpy.corp
    或者使用sed
    
    sed -i "s#HOSTNAME=zmxs.com#HOSTNAME=test001.tpy.corp #g" /etc/sysconfig/network && hostname=test001.tpy.corp
    

    坑1:
    如果使用hadoop1.com 这种后面会出现各种问题,所以一定要遵从规范,使用如下类型的主机名
    hadoop1.zipeiyi.com

    四、域名规划

    在每一台机器上都做主机名解析,或者你也可以使用DNS,生产环境还是建议使用DNS

    vim /etc/hosts
    192.169.20.201   test001.tpy.corp
    192.169.20.202   test002.tpy.corp
    192.169.20.203   test003.tpy.corp
    192.169.20.204   test004.tpy.corp
    192.169.20.205   test005.tpy.corp
    192.169.20.206   test006.tpy.corp
    

    五、安装JAVA

    [ -d /app/zpy/java ]  &&  {
    echo "java is already installed ,fuck off"
    exit
    }
    
    mkdir -p /app/zpy/java
    tar zxvf jdk-8u51-linux-x64.tar.gz -C /app/zpy/java  > /dev/null 2>&1
    
    echo '# JAVA-8u51' >> /etc/profile
    echo 'JAVA_HOME=/app/zpy/java/jdk1.8.0_51' >> /etc/profile
    echo 'JAVA_BIN=/app/zpy/java/jdk1.8.0_51/bin' >> /etc/profile
    echo 'PATH=$PATH:$JAVA_BIN' >> /etc/profile
    echo 'CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' >> /etc/profile
    echo 'export JAVA_HOME JAVA_BIN PATH CLASSPATH' >> /etc/profile
    
    source  /etc/profile
    echo "java is already installed,please open another session to test it " 
    
    记住:一定要卸载系统本身所带的openjdk
    rpm -qa | grep java
    rpm -e --nodeps  x.x
    

    六、配置root用户的ssh免密登陆

    六台分别执行:
    ssh-keygen -t rsa
    cd ~
    chmod  -R 700 .ssh
    每台上分别执行六条:(记住每台设备与自己的ssh也要打通)
    ssh-copy-id -i ~/.ssh/id_rsa.pub test001.tpy.corp
    ssh-copy-id -i ~/.ssh/id_rsa.pub test002.tpy.corp
    ssh-copy-id -i ~/.ssh/id_rsa.pub test003.tpy.corp
    ssh-copy-id -i ~/.ssh/id_rsa.pub test004.tpy.corp
    ssh-copy-id -i ~/.ssh/id_rsa.pub test005.tpy.corp
    ssh-copy-id -i ~/.ssh/id_rsa.pub test006.tpy.corp
    

    七、配置NTP时间同步

    vim ntp.sh
    #!/bin/bash 
    ntpdate cn.pool.ntp.org >/dev/null 2>&1
    ntpdate cn.pool.ntp.org >/dev/null 2>&1
    [ $? -ne 0 ] && {
    ntpdate ntp1.aliyun.com >/dev/null 2>&1
    ntpdate ntp1.aliyun.com >/dev/null 2>&1
    之后添加到/etc/crontab
    */5 * * * *  root /usr/bin/sh /app/zpy/ntp/ntp.sh
    

    八、安装mysql服务端与客户端

    首先CentOS7 已经不支持mysql,因为收费了你懂得,所以内部集成了mariadb
    而安装mysql的话会和mariadb的文件冲突,所以需要先卸载掉mariadb。
    以下为卸载mariadb,安装mysql的步骤:
    1.列出所有被安装的 rpm package :
    rpm -qa | grep mariadb
    2.卸载
    rpm -e --nodeps mariadb-libs-5.5.37-1.el7_0.x86_64
    3.下载mysql的yum源

    cd /etc/yum.repos.d/      
    wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm      
    rpm -ivh mysql-community-release-el7-5.noarch.rpm     
    yum install -y mysql-server  #这个server端只需要在cm主节点上安装就好了,这个我们需要安装在06节点上   
    yum install -y mysql。#这个6台设备都要安装
    

    4.在test006.tpy.corp上面编辑他的mysql配置文件,配置文件模版:

    [mysqld]
    transaction-isolation = READ-COMMITTED
    # Disabling symbolic-links is recommended to prevent assorted security risks;
    # to do so, uncomment this line:
    # symbolic-links = 0
    
    key_buffer = 16M
    key_buffer_size = 32M
    max_allowed_packet = 32M
    thread_stack = 256K
    thread_cache_size = 64
    query_cache_limit = 8M
    query_cache_size = 64M
    query_cache_type = 1
    
    max_connections = 550
    #expire_logs_days = 10
    #max_binlog_size = 100M
    
    #log_bin should be on a disk with enough free space. Replace '/var/lib/mysql/mysql_binary_log' with an appropriate path for your system
    #and chown the specified folder to the mysql user.
    log_bin=/var/lib/mysql/mysql_binary_log
    
    # For MySQL version 5.1.8 or later. Comment out binlog_format for older versions.
    binlog_format = mixed
    
    read_buffer_size = 2M
    read_rnd_buffer_size = 16M
    sort_buffer_size = 8M
    join_buffer_size = 8M
    
    # InnoDB settings
    innodb_file_per_table = 1
    innodb_flush_log_at_trx_commit  = 2
    innodb_log_buffer_size = 64M
    innodb_buffer_pool_size = 4G
    innodb_thread_concurrency = 8
    innodb_flush_method = O_DIRECT
    innodb_log_file_size = 512M
    
    [mysqld_safe]
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid
    sql_mode=STRICT_ALL_TABLES
    

    5.在主节点上启动mysql服务端:
    service mysqld start

    6.设置初始密码及自启动

    mysqladmin -u root password '1qaz@WSX?'     
    chkconfig mysqld on
    

    八、下载主程序

    下载Cloudera Manager
    The recommended tool for installing Cloudera
    
    我们先去CDH官网查看下依赖关系:
    https://www.cloudera.com/
    进入downloads,选择Cloudera Manager,版本选择5.11.0 
    进入之后,会选择注册等步骤,这个我们暂时略过
    进入下载页面后,会有
    Supported Opetating Systems 
    Supported JDK Versions 
    Supported DATAbases 
    
    然后我们进入CDH源 网址,下载clouderaManager
    http://archive-primary.cloudera.com/cm5/cm/5/
    
    下载主程序:
    wget http://archive.cloudera.com/cm5/cm/5/cloudera-manager-centos7-cm5.11.0_x86_64.tar.gz     
    tar zxvf cloudera-manager-centos7-cm5.11.0_x86_64.tar.gz  
    解压完成后发现有两个文件夹:    
    [root@test006 zpy]# ll
    drwxr-xr-x 4 1106 4001 36 Apr 13 05:15 cloudera
    drwxr-xr-x 9 1106 4001 88 Apr 13 05:15 cm-5.11.0
    
    

    九、创建并配置CM数据库

    安装MySQL JDBC驱动

    下载JDBC连接mysql的库:mysql-connector-java-5.1.38-bin.jar
    下载地址:https://dev.mysql.com/downloads/file/?id=412737    
    最新版   https://dev.mysql.com/downloads/file/?id=470332    
    
    下载下来是一个tar.gz 的包,解压后文件夹内有一个.jar的包
    cp mysql-connector-java-5.1.44-bin.jar /app/zpy/cm-5.11.0/share/cmf/lib/
    

    创建数据库

    /app/zpy/cm-5.11.0/share/cmf/schema/scm_prepare_database.sh  mysql cm -hlocalhost -uroot -p1qaz@WSX? --scm-host localhost scm scm scm
    
    之后我们检查数据库:
    mysql> show databases ;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | cm                 |
    | mysql              |
    | performance_schema |
    +--------------------+
    4 rows in set (0.00 sec)
    
    发现多了一个cm库
    
    登录数据库执行
    Use cm;
    Flush tables;
    mysql为了提高其性能,部分数据时缓存在内存中,因此要刷新表(清除缓存),就需要使用
    
    

    配置cm代理:

    vim /app/zpy/cm-5.11.0/etc/cloudera-scm-agent/config.ini 
    修改:
    server_host=hadoop1.zipeiyi.com(这里一定写域名)
    可以看到它的server_port是7180
    
    vim /app/zpy/cm-5.11.0/etc/cloudera-scm-agent/config.ini 
    修改:
    parcel_dir=/app/zpy/cloudera/parcels
    

    十、配置parcel 源

    我们选择的parcel源服务器就是test006.tpy.corp
    yum install httpd
    mkdir -p /var/www/html/cdh5/parcels/latest
    cd /var/www/html/cdh5/parcels/latest
    
    wget http://archive.cloudera.com/cdh5/parcels/5.11.0/CDH-5.11.0-1.cdh5.11.0.p0.34-el7.parcel
    wget http://archive.cloudera.com/cdh5/parcels/5.11.0/CDH-5.11.0-1.cdh5.11.0.p0.34-el7.parcel.sha1
    wget http://archive.cloudera.com/cdh5/parcels/5.11.0/manifest.json
    
    mv CDH-5.11.0-1.cdh5.11.0.p0.34-el7.parcel.sha1 CDH-5.11.0-1.cdh5.11.0.p0.34-el7.parcel.sha
    
    service httpd start
    验证:http://192.169.20.206/cdh5/parcels/latest/
    

    十一、分发程序

    把test006主机上的cm-5.11.0,拷贝到其他所有机器上
    scp -r cm-5.11.0/ root@test001.tpy.corp:/app/zpy
    scp -r cm-5.11.0/ root@test002.tpy.corp:/app/zpy
    scp -r cm-5.11.0/ root@test003.tpy.corp:/app/zpy
    scp -r cm-5.11.0/ root@test004.tpy.corp:/app/zpy
    scp -r cm-5.11.0/ root@test005.tpy.corp:/app/zpy
    

    十二、创建用户

    每台设备上都添加用户:
    useradd --system  --home=/app/zpy/cm-5.11.0/run/cloudera-scm-server  --no-create-home  --shell=/bin/false  --comment "Cloudera SCM User"  cloudera-scm
    
    添加用户说明:
    -d, --home HOME_DIR
               The new user will be created using HOME_DIR as the value for the user′s login directory. The default is to append the LOGIN name to BASE_DIR and use that as the login
               directory name. The directory HOME_DIR does not have to exist but will not be created if it is missing.
    
    -c comment
               新 帐 号 password 档 的 说 明 栏 。
    

    十三、创建目录并修改权限

    mkdir -p /app/zpy/cloudera/parcels
    chown  cloudera-scm:cloudera-scm  /app/zpy/cloudera/parcels
    chown -R  cloudera-scm:cloudera-scm  /app/zpy/cloudera
    mkdir -p /var/lib/cloudera-scm-server
    chmod  777 /var/lib/cloudera-scm-server
    

    十四、在test006.tpy.corp 上面启动cloudera-server

    1)启动命令:
          /app/zpy/cm-5.11.0/etc/init.d/cloudera-scm-server start
    2)启动之后注意观察日志,日志目录:
          /app/zpy/cm-5.11.0/log/cloudera-scm-server
    
    3)检查错误日志:
    sed -n "/ERROR/p" cloudera-scm-server.log
    
    发现错误日志:
        2017-10-22 18:12:30,501 ERROR main:org.hibernate.engine.jdbc.spi.SqlExceptionHelper: Table 'cm.CM_VERSION' doesn't exist(表不存在)
    
    
    解决方法:
    这是因为没有cm库没有被识别的原因
    A.关闭cm-server
          /app/zpy/cm-5.11.0/etc/init.d/cloudera-scm-server stop
    B. 登陆数据库
        检查表是否存在,之后执行 flush tables;
    C.重启cloudera-server
        /app/zpy/cm-5.11.0/etc/init.d/cloudera-scm-server start
    
    再次检查日志,发现没有继续报错
    
    
    以下是你有可能遇到的其他报错:
    报错二:
    /var/lib/cloudera-scm-server 没有权限,进入后发现没有这个目录,所以临时创建
    [root@hadoop1 ~]# mkdir -p /var/lib/cloudera-scm-server
    [root@hadoop1 ~]# chmod 777 /var/lib/cloudera-scm-server
    
    报错三:
    对于没有innodb的情况
    >show databases;查看
    删除/var/lib/mysql/下ib*,重启服务即可
    
    

    十五、在所有主机上启动cm-agent

    /app/zpy/cm-5.11.0/etc/init.d/cloudera-scm-agent start 
    然后去看下日志:
    /app/zpy/cm-5.11.0/log/cloudera-scm-agent 
    
    
    发现报错:
    [22/Oct/2017 21:07:24 +0000] 2353 MainThread agent        ERROR    Caught unexpected exception in main loop.
    Traceback (most recent call last):
      File "/app/zpy/cm-5.11.0/lib64/cmf/agent/build/env/lib/python2.7/site-packages/cmf-5.11.0-py2.7.egg/cmf/agent.py", line 710, in __issue_heartbeat
        self._init_after_first_heartbeat_response(resp_data)
      File "/app/zpy/cm-5.11.0/lib64/cmf/agent/build/env/lib/python2.7/site-packages/cmf-5.11.0-py2.7.egg/cmf/agent.py", line 948, in _init_after_first_heartbeat_response
        self.client_configs.load()
      File "/app/zpy/cm-5.11.0/lib64/cmf/agent/build/env/lib/python2.7/site-packages/cmf-5.11.0-py2.7.egg/cmf/client_configs.py", line 713, in load
        new_deployed.update(self._lookup_alternatives(fname))
      File "/app/zpy/cm-5.11.0/lib64/cmf/agent/build/env/lib/python2.7/site-packages/cmf-5.11.0-py2.7.egg/cmf/client_configs.py", line 434, in _lookup_alternatives
        return self._parse_alternatives(alt_name, out)
      File "/app/zpy/cm-5.11.0/lib64/cmf/agent/build/env/lib/python2.7/site-packages/cmf-5.11.0-py2.7.egg/cmf/client_configs.py", line 446, in _parse_alternatives
        path, _, _, priority_str = line.rstrip().split(" ")
    ValueError: too many values to unpack
    
    
    
    
    解决方案是修改 /app/zpy/cm-5.11.0/lib64/cmf/agent/build/env/lib/python2.7/site-packages/cmf-5.11.0-py2.7.egg/cmf/client_configs.py 这个脚本的第444行。
    
        for line in output.splitlines():
          if line.startswith("/"):
            if len(line.rstrip().split(" "))<=4:
              path, _, _, priority_str = line.rstrip().split(" ")
    
              # Ignore the alternative if it's not managed by CM.
              if CM_MAGIC_PREFIX not in os.path.basename(path):
                continue
    
              try:
                priority = int(priority_str)
              except ValueError:
                THROTTLED_LOG.info("Failed to parse %s: %s", name, line)
    
              key = ClientConfigKey(name, path)
              value = ClientConfigValue(priority, self._read_generation(path))
              ret[key] = value
    
            else:
              pass
        return ret
    添加 if len(line.rstrip().split(" "))<=4:  和  else:  pass;
    
    

    十六 安装cm 控制台

    图片.png 图片.png 图片.png 图片.png 图片.png 图片.png 图片.png 图片.png
    sysctl vm.swappiness=10 && echo “vm.swappiness=10” >>/etc/sysctl.conf
    echo never > /sys/kernel/mm/transparent_hugepage/defrag  &&  echo never > /sys/kernel/mm/transparent_hugepage/enabled
    
    vim /etc/rc.local
    添加:
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    
    图片.png 图片.png 图片.png

    页面下方有一个了解更多帮助:

    
    创建数据库时,输入的作为数据库主机名称的值必须与为主机输入的值(若有的话)匹配(请参阅 Installing and Configuring an External Database)。
    例如,如您为 Activity Monitor 数据库输入了以下值 
    grant all on activity_monitor.* TO 'amon_user'@'localhost' IDENTIFIED BY 'amon_password';
    ,则在此处为数据库主机名称输入的值必须为 localhost。
    另一方面,当您创建数据库时输入了以下值 
    grant all on activity_monitor.* TO 'amon_user'@'myhost-1.myco.com' IDENTIFIED BY 'amon_password';
    ,则在此处为数据库主机名称输入的值必须为 myhost-1.myco.com。
    如您未指定主机或使用了通配符以从任意主机访问,则可在此处输入完全限定域名 (FQDN) 或 localhost。例如,如您输入了 
    grant all on activity_monitor.* TO 'amon_user'@'%' IDENTIFIED BY 'amon_password';
    ,则在此处为数据库主机名称输入的值可以为 FQDN 或 localhost。
    同样,如您输入了 
    grant all on activity_monitor.* TO 'amon_user' IDENTIFIED BY 'amon_password';
    ,则在此处为数据库主机名称输入的值可以为 FQDN 或 localhost。
    
    
    按照提示需要修改权限:
    mysql> grant all on *.* to root@'test028.tf.corp' identified by '1qaz@WSX?';
    Query OK, 0 rows affected (0.01 sec)
    
    图片.png 图片.png 图片.png 图片.png 图片.png

    十七、安装hive

    解决方案:
    for hive hive安装前cp(--hive-master节点才需要这个mysql连接库--)
    cd /app/zpy/cm-5.11.0/share/cmf/lib/
    cp mysql-connector-java-5.1.25-bin.jar /app/zpy/cloudera/parcels/CDH-5.11.0-1.cdh5.11.0.p0.34/lib/hive/lib/
    
    图片.png 图片.png 图片.png 图片.png
    之后登陆mysql
    create database hive ;
    
    grant all on hive.* to 'hive'@'test028.tf.corp' identified by '1qaz@WSX?';
    
    图片.png 图片.png
    spark 关于 JAVA_HOME报错相关:
    echo "export JAVA_HOME=/app/zpy/java/jdk1.8.0_51" >> /app/zpy/cloudera/parcels/CDH-5.11.0-1.cdh5.11.0.p0.34/meta/cdh_env.sh
    
    HIVE mysql 驱动
    解决方案:
    for hive hive安装前cp(--hive-master节点才需要这个mysql连接库--)
    cd /app/zpy/cm-5.11.0/share/cmf/lib/
    cp mysql-connector-java-5.1.25-bin.jar /app/zpy/cloudera/parcels/CDH-5.11.0-1.cdh5.11.0.p0.34/lib/hive/lib/
    删除整个hive服务,重新安装
    

    十八、安装hbase

    首先安装hbase 需要首先按装zookeeper,安装过程略

    图片.png

    十九 安装spark

    spark 有两种模式
    spark on yarn
    spark standalone
    我们一般选择 spark on yarn

    相关文章

      网友评论

          本文标题:21.CDH搭建攻略

          本文链接:https://www.haomeiwen.com/subject/trnljxtx.html