CentOS7.2离线安装CDH集群

一、概述

Cloudera 版本(Cloudera’s Distribution Including Apache Hadoop,简称“CDH”),基于 Web 的用户界面,支持大多数 Hadoop 组件,包括 HDFS、MapReduce、Hive、Pig、 Hbase、Zookeeper、Sqoop,简化了大数据平台的安装、使用难度。

二、安装部署

1. 机器规划

机器 hostname 备注
10.58.10.108 cdh108.aaf cm-server
10.58.10.107 cdh107.aaf hadoop-1
10.58.10.106 cdh106.aaf hadoop-2

2. 软件包下载

# 下载MYSQL
wget -c https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.46.zip

3. 基础环境部署

3.1 关闭防火墙,修改 hostname,修改 hosts

关闭防火墙

# Centos7
systemctl stop firewalld
systemctl disable firewalld

# Centos6
service iptables stop
service iptables off restart

修改hostname

  • CentOS7 如下修改:
# 在108的机器上
hostnamectl --static set-hostname  cdh108.aaf   #更改个主机名

# 在107的机器上
hostnamectl --static set-hostname  cdh107.aaf   #更改个主机名

# 在106的机器上
hostnamectl --static set-hostname  cdh106.aaf   #更改个主机名
  • CentOS6 如下修改(这里只写 108 机器的修改,其他机器也需要这样修改):
vim /etc/sysconfig/network

内容如下:

NETWORKING=yes
HOSTNAME=cdh108.aaf

保存内容后执行:

source /etc/sysconfig/network

通过service network restart重启网络服务生效。

修改 hosts(CHD机器配置,在3台机器上都需要配置)

sudo vim /etc/hosts

>

10.58.10.108 cdh108.aaf
10.58.10.107 cdh107.aaf
10.58.10.106 cdh106.aaf

关闭 selinux( 3 台机器均要执行)

sed -i 's/SELINUX=enforcing/SELINUX=disable/g' /etc/selinux/config
setenforce 0

或者打开/etc/selinux/config文件修改SELINUX=disabled:

# cd /etc/selinux/
# vim config

具体如下:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

linux 系统 swappiness 参数在内存与交换分区之间优化

swappiness 的值的大小对如何使用 swap 分区是有着很大的联系的。swappiness=0 的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用 swap 分区,并且把内存上的数据及时的搬运到 swap 空间里面。linux 的基本默认设置为 60,从/proc/sys/vm/swappiness中可以看出。也就是说,你的内存在使用到 100-60=40% 的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统 io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。

# 临时调整的方法,重启后会回到默认设置
sysctl -w vm.swappiness=10
# 永久调整
echo "vm.swappiness=10" >>/etc/sysctl.conf
# 激活设置,动态加载/etc/sysctl.conf
sysctl -p

禁用大内存页面

echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo never > /sys/kernel/mm/transparent_hugepage/enabled

如果遇到要用sudo修改,需要这样操作才可:

sudo sh -c "echo never > /sys/kernel/mm/transparent_hugepage/defrag
"
sudo sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled"

虽然这样设置了,但貌似个别节点还是会有警告,干脆全部设置,编辑/etc/rc.local,末尾添加如下命令:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

同步到各个节点机器scp /etc/rc.local cdh106:/etc/,然后重启 reboot 生效。
这个操作需要先 ssh 免密互通,然后还需要 root 权限。

3.2 节点SSH免密互通

在 CM-SERVER 机器中生成 ssh-key,公钥下放到其他 Node。

# 先生成ssh,一路不输入任何字符,直到创建完成。
ssh-keygen -t rsa -C "cm-server@aaf.net"

# 将生成的公钥下发到其他节点。
ssh-copy-id -i ~/.ssh/id_rsa.pub cdh106.aaf
ssh-copy-id -i ~/.ssh/id_rsa.pub cdh107.aaf

3.3 yum源更新

使用阿里云 yum 源,速度更快一点。如果公司内部有 yum 仓库,可以使用内部仓库。

# 现将原来的yum源备份

sudo cp -r /etc/yum.repos.d/ /etc/yum.repos.d.bak
cd /etc/yum.repos.d/

# 清空yum.repos.d目录中的文件
sudo rm -fr *
  • 更新yum源方式一:
sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  • 更新yum源方式二:
# 新建CentOS-Base.repo文件
sudo vi CentOS-Base.repo

以下为/etc/yum.repos.d/CentOS-Base.repo的内容:

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-releasever - Base - 10.57.17.7
failovermethod=priority
baseurl=http://10.57.17.7/centos/releasever/os/basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=releasever&arch=basearch&repo=os
gpgcheck=1
gpgkey=http://10.57.17.7/centos/RPM-GPG-KEY-CentOS-releasever

#released updates
[updates]
name=CentOS-releasever - Updates - 10.57.17.7
failovermethod=priority
baseurl=http://10.57.17.7/centos/releasever/updates/basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=releasever&arch=basearch&repo=updates
gpgcheck=1
gpgkey=http://10.57.17.7/centos/RPM-GPG-KEY-CentOS-releasever

#additional packages that may be useful
[extras]
name=CentOS-releasever - Extras - 10.57.17.7
failovermethod=priority
baseurl=http://10.57.17.7/centos/releasever/extras/basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=releasever&arch=basearch&repo=extras
gpgcheck=1
gpgkey=http://10.57.17.7/centos/RPM-GPG-KEY-CentOS-releasever

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-releasever - Plus - 10.57.17.7
failovermethod=priority
baseurl=http://10.57.17.7/centos/releasever/centosplus/basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=releasever&arch=basearch&repo=centosplus
gpgcheck=1
enabled=0
gpgkey=http://10.57.17.7/centos/RPM-GPG-KEY-CentOS-releasever

#contrib - packages by Centos Users
[contrib]
name=CentOS-releasever - Contrib - 10.57.17.7
failovermethod=priority
baseurl=http://10.57.17.7/centos/releasever/contrib/basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=releasever&arch=basearch&repo=contrib
gpgcheck=1
enabled=0
gpgkey=http://10.57.17.7/centos/RPM-GPG-KEY-CentOS-releasever

更新完 yum 源后,执行下边命令更新 yum 配置,使操作立即生效:

sudo yum makecache

如果出现 yum 的问题,可以参考:《安装Mariadb10.0时yum镜像报错 HTTP Error 404 – Not Found

3.4 基础依赖包安装

# 如果出现这个错误:pstree: command not found,需要安装psmisc
yum install psmisc -y
yum install krb5-devel cyrus-sasl-gssapi cyrus-sasl-deve libxml2-devel libxslt-devel openldap-devel python-devel python-simplejson sqlite-devel

3.5 NTP时间同步

4. 安装JAVA环境

一般新安装的系统都会自带 OpenJDK 版本,使用rpm-qa|grep java,如果有则使用命令yum -y remove xxxx进行删除,我们需要使用 oracle 的 jdk,此处使用 jdk-7u80-linux-x64.rpm,在各节点均配置 Java 环境:

注意:如果是公司内部已经安装了 ORACLE JDK1.8,需要将路径映射到/usr/java/下面,这个很重要:

sudo mkdir -p /usr/java/jdk1.8
sudo ln -s -r /usr/install/java /usr/java/jdk1.8

5. 安装MariaDB

我们这里用离线方式安装,主要是想把 Mariadb 安装包以及依赖包全部下载下来,方便后面 POC 环境使用。

# 通过yum下载mariadb在`~/cdh/mariadb`目录
sudo yum install --downloadonly --downloaddir=~/cdh/mariadb mariadb*

下载完 Mariadb 的依赖包之后,如果在本机安装,可以使用下面的命令安装。下载的文件不要删除,因为我们在 POC 环境要使用。否则可以直接使用yum install mariadb*安装便可以了。

# 使用rpm命令安装,-i :安装的意思,-v :可视化-h :显示安装进度
rmp -ivh ./*.rpm

mysql -uroot命令登录到 MariaDB,此时 root 账户的密码为空。使用mysql_secure_installation命令进行配置。回车设置 root 账户的密码,输入两次密码。

查看/etc/my.cnf文件内容,其中包含一句!includedir /etc/my.cnf.d说明在该配置文件中引入/etc/my.cnf.d目录下的配置文件。

1)使用vi server.cnf命令编辑server.cnf文件,在[mysqld]标签下添加:

init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

如果/etc/my.cnf.d目录下无 server.cnf 文件,则直接在 /etc/my.cnf 文件的[mysqld] 标签下添加以上内容。

2)用vi client.cnf命令编辑/etc/my.cnf.d/client.cnf文件,在 [client]标签下添加:

default-character-set=utf8

3)用vi mysql-clients.cnf命令编辑/etc/my.cnf.d/mysql-clients.cnf文件,在 [mysql] 标签下添加

default-character-set=utf8

配置完成后systemctl restart mysql重启服务(需要根据情况看,有可能是systemctl restart mariadb)。

进入到数据库查看字符设置。

show variables like "%character%";
show variables like "%collation%";

4) 添加用户,设置权限

  • 创建用户命令:
create user 'root'@'%' identified by 'TD@123';
  • 授予外网登陆权限:
grant all privileges on *.* to root@'%' identified by 'TD@123';

如果初始化密码失败了如何解决:从/etc/my.cnf.d/server.cnf配置文件中找到[mysqld]项,在后面加入skip-grant-table后正常登陆。

systemctl restart mysql
mysql -u root

在mysql客户端窗口执行:

MariaDB [mysql]> 
MariaDB [mysql]>  flush privileges;
Query OK, 0 rows affected (0.002 sec)

MariaDB [mysql]> ALTER user 'root'@'localhost' identified by 'ABC@123';
Query OK, 0 rows affected (0.026 sec)

MariaDB [mysql]> exit

主要注意:不支持update修改root密码,执行alter之前一定要先flush privileges;

6. 创建CM所需数据库

--hive数据库 

create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci ;

--集群监控数据库

create database amon DEFAULT CHARSET utf8 COLLATE utf8_general_ci ;

--hue数据库

create database hue DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

-- oozie数据库

create database oozie DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

三、安装CM5

1. 各节点所需安装包准备

在各个节点均创建用户cloudera-scm,home指向/opt/cm-5.14.3/run/cloudera-scm-server/且不创建 home,禁用该用户的 shell 功能。

sudo useradd --system --home=/opt/cm-5.14.3/run/cloudera-scm-server/ --no-create-home --shell=/bin/false --comment 'Cloudera SCM User' cloudera-scm

配置 cloudera-scm-agent,将 server_host 指向 cloudera-scm-server 的主机地址(注意,需要每个 agent 节点都需要配置或者直接将该节点的配置文件通过 scp 复制到其他节点):

vim /opt/cm-5.14.3/etc/cloudera-scm-agent/config.ini 将其中的server_host=cdh108.aaf     #指向cm-server主机

解压安装包和依赖库,并将其移到 /opt/ 目录:

# 解压MYSQL Java驱动 lib
unzip mysql-connector-java-5.1.46.zip
# 解压CM5
sudo tar zxvf cloudera-manager-centos7-cm5.14.3_x86_64.tar.gz -C /opt/

#将jar包复制到cm的lib目录下
sudo cp mysql-connector-java-5.1.46/mysql-connector-java-5.1.46.jar /opt/cm-5.14.3/share/cmf/lib/   

将下载好的 CDH 镜像库 Parcels 以及 manifest.json 等文件移到/opt/cloudera/parcel-repo/该目录下,该操作每个节点都需要执行。

mv CDH-5.14.2-1.cdh5.14.2.p0.3-el7.parcel* /opt/cloudera/parcel-repo/
mv manifest.json /opt/cloudera/parcel-repo/

CDH-5.14.2-1.cdh5.14.2.p0.3-el7.sha1,重命名为CDH-5.14.2-1.cdh5.14.2.p0.3-el7.sha,去掉末尾的 1,否则系统会重新下载CDH-5.14.2-1.cdh5.14.2.p0.3-el7.parcel文件,也就不是纯离线安装了。

同时,需要把/opt/cm-5.14.3的目录连带文件分发到其他节点。

# 将配置好的 /opt/cm-5.14.3 通过scp发送到cdh106.aaf、cdh107.aaf节点,注意没有写用户是因为用户名和当前主机用户名一致
scp -r /opt/cm-5.14.3 cdh106.aaf:/opt/
scp -r /opt/cm-5.14.3 cdh107.aaf:/opt/

2. 初始化 CM5 数据库

在 scm-server 节点(也就是cdh108.aaf)上执行下面命令,初始化 scm 所用的表:

sudo /opt/cm-5.14.1/share/cmf/schema/scm_prepare_database.sh mysql cmdb -h"cdha108.aaf" -uroot -pTD@123 --scm-host cdha108.aaf scm scm scm

说明:这个脚本就是用来创建和配置CMS需要的数据库的脚本。各参数是指:

  • mysql:数据库用的是mysql,如果安装过程中用的oracle,那么该参数就应该改为oracle。
  • -h"cdha108.aaf":数据库建立在cdha108.aaf主机上面。也就是主节点上面。注意主机前面有个“h”
  • -uroot:root身份运行mysql。
  • -pTD@123:mysql的root密码是ABC@123。
  • --scm-host cdha108.aaf:CMS的主机,一般是和mysql安装的主机是在同一个主机上。
  • 最后三个参数是:数据库名,数据库用户名,数据库密码。

执行初始化数据库的命令后,我们看到如下信息表示初始成功了:

sudo /opt/cm-5.14.3/share/cmf/schema/scm_prepare_database.sh mysql cm_server -h"cdh108.aaf" -uroot -pTD@123 --scm-host cdh108.aaf scm scm scm
JAVA_HOME=/usr/java/jre1.8
Verifying that we can write to /opt/soft/cm-5.14.3/etc/cloudera-scm-server
Creating SCM configuration file in /opt/soft/cm-5.14.3/etc/cloudera-scm-server
Executing:  /usr/java/jre1.8/bin/java -cp /usr/share/java/mysql-connector-java.jar:/usr/share/java/oracle-connector-java.jar:/opt/soft/cm-5.14.3/share/cmf/schema/../lib/* com.cloudera.enterprise.dbutil.DbCommandExecutor /opt/soft/cm-5.14.3/etc/cloudera-scm-server/db.properties com.cloudera.cmf.db.
2020-04-22 16:17:07,773 [main] INFO  com.cloudera.enterprise.dbutil.DbCommandExecutor  - Successfully connected to database.
All done, your SCM database is configured correctly!

3. 启动 CM5

在主节点(cdh108.aaf)启动 cloudera scm server:

sudo /opt/cm-5.14.3/etc/init.d/cloudera-scm-server start

在所有节点启动 cloudera scm agent:

sudo /opt/cm-5.14.3/etc/init.d/cloudera-scm-agent start

另外,如果需要重启可以用 restart,如果要停止可以用 stop 命令。

sudo /opt/cm-5.14.3/etc/init.d/cloudera-scm-agent stop
sudo /opt/cm-5.14.3/etc/init.d/cloudera-scm-server stop

安装过程不可避免的出现错误,注意查看日志文件。

tail -n 500 -f /opt/cm-5.14.3/log/cloudera-scm-server/cloudera-scm-server.log
tail -n 500 -f /opt/cm-5.14.3/log/cloudera-scm-agent/cloudera-scm-agent.log

安装过程中,请将所用到的目录全部授予和运行 scm server 用户相同的权限,比如是root用户启动的服务,请将/opt/cloudera,/opt/cm-5.14.3全部更改为root:

sudo chown -R root:root /opt/cloudera
sudo chown -R root:root /opt/cm-5.14.3

当 cloudera scm server 启动之后,我们打开浏览器则可以访问CM服务了,端口默认是7180。

netstat -apn|grep 7180

查询端口被占用后,就可以用浏览器打开 http://cdh108.aaf:7180/ 进行访问了,登录用户名与密码分别为admin。

四、安装CDH

用户许可条款,不用管他说的啥,直接勾选是后继续:

我们选择免费版本后继续:

展示了将要安装的软件包,继续则可:

各个Agent节点正常启动后,可以在当前管理的主机列表中看到对应的节点。选择要安装的节点,这里我选择全部节点,继续。由于截图是我早期截图的,主机只显示两台,而且主机名也和我现在的不对应,忽略这写不一致的问题。

我们是三台机器:cdh108.aaf,cdh107.aaf,cdh106.aaf,三台全部勾选。

出现以下版本的包,说明本地Parcel包配置无误,直接点继续。如果没有出现,说明parcel包不在/opt/cloudera/parcel-repo目录下,或者该目录下为空。

如果配置本地Parcel包无误,那么已下载是瞬间就完成的,因为不需要下载,然后耐心等待分配过程就行了,速度由内网网速决定。完成后点击继续。

JDK选项,因为我们自己安装了JDK,因此不用勾选,直接继续:

这个页面展示的就是所选择的节点安装CDH的过程。依然忽略选择的机器,我这里是后续给集群增加机器的时候的截图,但和正常安装是一样的。

接下来是服务器检查,如果前面严格按照步骤一步步做下来这里应该是不会出现任何问题的,全绿通过。点击完成。

接下来是选择安装服务,根据需要按需选择就好,点击继续:

服务配置,一般情况下保持默认就可以了,也可以自己手动根据节点情况进行分配,点击继续。下图是我网上找的,由于忘记截图了,所以就看到下图的样子就知道是怎么回事了。

接下来是数据库的设置,部分系统会通过测试,Hive 和 Oozie 安装可能会出问题:

开始安装各个服务,安装Hive的时候可能会报错,因为我们使用了MySql作为hive的元数据存储,hive默认并没有带mysql的驱动,拷贝一个就行了:

# 每台安装hive的节点均要执行,建议最好是所有节点均复制一遍
sudo cp ~/mysql-connector-java-5.1.46.jar /opt/cloudera/parcels/CDH-5.14.2-1.cdh5.14.2.p0.3/lib/hive/lib/

这时hive通过了oozie会出现错误,错误原理与hive雷同,但是 Oozie 的需要拷贝到两个地方:

sudo cp ~/mysql-connector-java-5.1.46.jar /opt/cloudera/parcels/CDH-5.14.2-1.cdh5.14.2.p0.3/lib/oozie/lib/
sudo cp ~/mysql-connector-java-5.1.46.jar /opt/cloudera/parcels/CDH-5.14.2-1.cdh5.14.2.p0.3/lib/oozie/libext/

再次点击测试连接,成功,点击继续:

下面是集群设置的审核页面,因为我们系统的磁盘不大,另外挂在了一个 1TB 的磁盘 /data01/,所以我们把hdf的几个路径优先修改为 /data01/dfs/dn/data01/dfs/nn/data01/dfs/snn

全部绿色通过,然后点击继续。

到此为止CDH集群就算部署完毕了!

五、Spark提交Demo走起

运行 Spark 之前首先保证集群健壮,在CM的管理页面做好相应的配置,比如 HDFS、hive、Yarn等一系列的配置,基本都是路径配置、内存大小、阈值临界点等。

spark-submit \
    --master yarn-client \
    --class org.apache.spark.examples.SparkPi \
    --driver-memory 512m \
    --executor-memory 512m \
    --executor-cores 2 \
    /opt/cloudera/parcels/CDH-5.9.0-1.cdh5.9.0.p0.23/lib/spark/examples/lib/spark-examples-1.6.0-cdh5.9.0-hadoop2.6.0-cdh5.9.0.jar

出现错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
        at org.apache.spark.deploy.SparkSubmitArguments.handleUnknown(SparkSubmitArguments.scala:457)
        at org.apache.spark.launcher.SparkSubmitOptionParser.parse(SparkSubmitOptionParser.java:178)
        at org.apache.spark.deploy.SparkSubmitArguments.<init>(SparkSubmitArguments.scala:103)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala:114)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.FSDataInputStream
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.LauncherAppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 5 more

从spark1.4以后,所有spark的编译都是没有将hadoop的classpath编译进去的,所以必须在spark-env.sh(文件路径:/opt/cloudera/parcels/CDH-5.14.2-1.cdh5.14.2.p0.3/etc/spark/conf.dist/spark-env.sh)中指定hadoop中的所有jar包。需要在spark-evn.sh中添加如下内容:

export SPARK_DIST_CLASSPATH=({HADOOP_HOME}/bin/hadoop classpath)

再次运行,出现错误:

原因很简单,我用了root用户运行了该命令,其实应该用 hdfs 用户运行才行,hdfs 用户在安装集群的时候自动创建的。

我们可以配置HADOOP_USER_NAME环境变量可以解决,也可以切换到 hdfs 用户解决:

sudo vim /etc/profile
export HADOOP_USER_NAME=hdfs

保存后运行该命令使其生效source /etc/profile

再次运行,运行很顺利,没有其他错误!

点击数:151

发表评论