通过Cloudera Manager安装CDH 5.6

CDH的简单介绍

大家经常说CDH,其全称是:Cloudera’s Distribution Including Apache Hadoop,简单的说是Cloudera公司的Hadoop平台,是在Apache原生的Hadoop组件基础上进行了封装和加强。CDH里面有些什么东西呢?如下图:
通过Cloudera Manager安装CDH 5.6_第1张图片
那么这个CDH软件如何安装呢?Cloudera公司提供了一套安装CDH,管理、维护CDH各组件的一个软件,叫做Cloudera Manager(以下简称为CM)。CM本身是一种主从结构,由CM Server和CM agent构成,所以,在后面可以看到,在安装CM时,是要先在一台主机上安装CM Server,然后在各个主机上安装CM agent。
我们接下来要讲的就是利用CM 5.6 来安装CDH 5.6。
在Cloudera的官网上CM安装CDH的文档中,介绍了几种安装方法:A、B、C。对于生产环境,可以选用B和C。B是先手工安装好CM,然后通过CM自动来安装其他组件。而C是CM和其他所有组件都是通过tarball的方式进行手工安装。我们采用的是CM用tarball来安装,其他组件都用CM来安装。

以下没有特殊说明,都采用root用户操作

环境准备

  • 关闭所有主机的防火墙,对于SuseLinux是:
SuSEfirewall2 stop
  • 修改所有主机的/etc/hosts文件,把所有主机的主机名和IP地址写入此文件
  • 将所有的主机都配置成SSH免密码登录,包括本机登录本机。
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

然后将每台机器中的~/.ssh/authorized_keys文件中的内容追加到其他机器~/.ssh/authorized_keys文件的末尾。

  • 安装oracle JDK 1.7,设置好环境变量JAVA_HOME、PATH。
    在.profile或者.bash_profile中设置
export JAVA_HOME=JAVA安装地址
export PATH=.:$JAVA_HOME/bin:$PATH

使其生效

source .bash_profile
  • 确保python已经安装,且版本是2.6或者2.7

Mysql安装

  • 下载一个mysql的rpm包,我们这里用的是:MySQL-server-5.5.28-1.linux2.6.x86_64.rpm,版本最好是5.5或者5.6
    如果系统已经存在低级别的版本,先执行下面的命令卸载:
rpm -e mysql --nodeps

然后再安装:

rpm -ivh MySQL-server-5.5.28-1.linux2.6.x86_64.rpm
  • 配置my.cnf
    如果/etc/my.cnf文件不存在,可以执行如下命令生成一个
touch /etc/my.cnf

里面的内容可以使用文档中推荐的配置值:

[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
  • 设置mysql的自启动
chkconfig --add mysql
  • 启动mysql
service mysql start

如果启动失败了,参看后面“遇到的问题”一节

  • 安全配置
/usr/bin/mysql_secure_installation

$ sudo /usr/bin/mysql_secure_installation
[…]
Enter current password for root (enter for none):
OK, successfully used password, moving on…
[…]
Set root password? [Y/n] y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] Y
[…]
Disallow root login remotely? [Y/n] N
[…]
Remove test database and access to it [Y/n] Y
[…]
Reload privilege tables now? [Y/n] Y
All done!

  • 安装JDBC驱动
    对于suselinux,下载mysql-connector-java-5.1.38.tar.gz,并安装:
tar zxvf mysql-connector-java-5.1.38.tar.gz
cp mysql-connector-java-5.1.38/mysql-connector-java-5.1.38-bin.jar /usr/share/java/mysql-connector-java.jar
  • 为其他组件创建数据库实例
    我们只要创建hive和activity
    以创建hive为例,用mysql root用户登录mysql后执行:
create database hive DEFAULT CHARACTER SET utf8;
grant all on hive.* TO 'root'@'%' IDENTIFIED BY 'root';
flush privileges;
use hive;
  • 如果你还需要其他组件,可以参考文档下面三小节:
    • Creating Databases for Activity Monitor, Reports Manager, Hive Metastore Server, Sentry Server, Cloudera Navigator Audit Server, and Cloudera Navigator Metadata Server
    • Configuring the Hue Server to Store Data in MySQL
    • Configuring MySQL for Oozie

Cloudera Manager的安装

由于采用tarball安装CM,可以参考文档

  • 解压安装文件
    将下载到的CM文件放到CM Server的/opt目录,下载页面是(http://www.cloudera.com/documentation/enterprise/latest/topics/cm_vd.html#concept_mb3_sfz_3q_unique_1)如果是SuseLinux,下载zypper/YaST SLES。
tar -xzf cloudera-manager*.tar.gz
  • 在CM Server上创建用户
useradd --system --home=/opt/cm-5.6.0/run/cloudera-scm-server --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
  • 创建CM Server的本地存储目录
mkdir /var/lib/cloudera-scm-server
mkdir /var/log/cloudera-scm-server
chown cloudera-scm:cloudera-scm /var/log/cloudera-scm-server
  • 配置CM agent
    在CM Server上修改/opt/cm-5.6.0/etc/cloudera-scm-agent/config.ini文件,只需要将server_host修改为CM Server的主机名

  • 将解压后的整个文件夹scp到其他各个主机

scp -r /opt/cm-5.6.0 各主机的/opt目录
  • 创建parcel目录
    什么是parcel?可以理解为就是一个CDH的安装文件,由CM在安装CDH的时候读取。
    • 先在CM Server主机上执行:

      mkdir -p /opt/cloudera/parcel-repo
      chown cloudera-scm:cloudera-scm /opt/cloudera/parcel-repo
    • 然后在各CM Agent主机上执行:

      mkdir -p /opt/cloudera/parcels
      chown cloudera-scm:cloudera-scm /opt/cloudera/parcels
  • 创建CM Server的数据库
    执行如下命令,命令的具体含义可以参考安装文档
/opt/cm-5.6.0/share/cmf/schema/scm_prepare_database.sh mysql scm  -hlocalhost -uroot -proot  --scm-host localhost scm scm scm
  • 启动CM Server,并设置自启动
/opt/cm-5.6.0/etc/init.d/cloudera-scm-server start 
cp /opt/cm-5.6.0/etc/init.d/cloudera-scm-server /etc/init.d/cloudera-scm-server 
chkconfig cloudera-scm-server  on

修改/etc/init.d/cloudera-scm-server文件的内容,将CMF_DEFAULTS 的值由 ${CMF_DEFAULTS:-/etc/default} 改为/opt/cm-5.6.0/etc/default

  • 启动CM Agent,并设置自启动
/opt/cm-5.6.0/etc/init.d/cloudera-scm-agent start
cp /opt/cm-5.6.0/etc/init.d/cloudera-scm-agent /etc/init.d/cloudera-scm-agent 
chkconfig cloudera-scm-agent on

修改/etc/init.d/cloudera-scm-agent文件的内容,将CMF_DEFAULTS 的值由 ${CMF_DEFAULTS:-/etc/default} 改为/opt/cm-5.6.0/etc/default

注意:如果CM Server主机上也要启动CM Agent,则也要执行上述命令

CDH的安装

如果CM Server和CM Agent都成功启动后,我们就可以安装CDH了。

  • parcel安装包的准备
    到这里下载parcel包,一共包括三个文件(对于SuseLinux来说):
    CDH-5.6.0-1.cdh5.6.0.p0.45-sles11.parcel
    CDH-5.6.0-1.cdh5.6.0.p0.45-sles11.parcel.sha1
    manifest.json
    下载完后,将三个文件放到CM Server主机的/opt/cloudera/parcel-repo目录下,并且执行如下命令:
mv CDH-5.6.0-1.cdh5.6.0.p0.45-sles11.parcel.sha1  CDH-5.6.0-1.cdh5.6.0.p0.45-sles11.parcel.sha
  • 首先利用浏览器登录CM Server的主机: http://CM-Server-host:7180,默认登录用户名,密码是admin,admin
  • 如果是第一次安装,会选择CM的版本,我们选择Cloudera Express就可以了。
    通过Cloudera Manager安装CDH 5.6_第2张图片
  • 选择加入集群的主机
    这里会自动显示出启动了CM Agent进程的服务器,如果没有显示,请检查/opt/cm-5.6.0/etc/cloudera-scm-agent/config.ini文件中server_host是否配置为CM Server的地址
    通过Cloudera Manager安装CDH 5.6_第3张图片
  • 选择需要安装的parcel版本
    如果这里没有正确显示你下载的parcel版本,那么请检查”parcel安装包的准备”小节。
  • 选择JAVA安装
    这一步由于之前我们已经手动安装过了JAVA SDK,所以这一步不要选择复选框,直接继续
  • 输入主机root的登录密码
    通过Cloudera Manager安装CDH 5.6_第4张图片
  • 实施安装
    通过Cloudera Manager安装CDH 5.6_第5张图片
  • 主机检测

    随后会对各主机的环境进行检查,一般会报以下几个错误:
    • 时间不同步
      参见“遇到的问题”小节会有解决办法,这里可以先不管。但最好还是将每台机器的时间设置一致,可以不用安装NTP服务。
    • swappiness的问题
      按照提示执行如下命令:

      sysctl vm.swappiness=0
    • 主机缺少用户错误
      参见“遇到的问题”小节的解决办法。

解决这些问题后,可以选择重新运行再做检查。

  • 选择安装的组件
    这里我们选择所有服务
  • 自定义角色分配
    这里主要是选择如何在各主机之间分布各个组件
    通过Cloudera Manager安装CDH 5.6_第6张图片
  • 为各个组件设置数据库
    这里涉及到的是Hive和Oozie,
    通过Cloudera Manager安装CDH 5.6_第7张图片
  • 设置hadoop的目录
    通过Cloudera Manager安装CDH 5.6_第8张图片
  • 执行安装
    这里也许会遇到一些问题。需要随机应变解决咯…
    通过Cloudera Manager安装CDH 5.6_第9张图片

遇到的问题

  • mysql的启动问题
    Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist
    执行如下命令解决:
mysql_install_db --user=mysql 
  • 各主机时间不同步的问题
    在主机->配置页面,搜索栏中输入时钟,将警告和严重都设置为“从不”。如下图所示:
    通过Cloudera Manager安装CDH 5.6_第10张图片

  • 主机缺少用户错误
    查看agent的日志,发现agent创建用户的时候失败了,通过搜索代码,发现如下文件中在创建用户:
    /opt/cm-5.6.0/lib64/cmf/agent/src/cmf/parcel.py
    它里面有这样一个代码,发现在使用useradd命令时,它使用了一个-U选项,这个选项在SuseLinux操作系统的useradd命令中是没有的,不知道其他OS的useradd是否支持此选项。
    解决办法很简单,我们把499行这一段代码注释掉就可以了:

    
    #umask_arg, umask_param,
    
487     for user, data in users.items():
488       try:
489         if self.is_suse:
490           umask_arg = '-U'
491           umask_param = '022'
492         else:
493           umask_arg = '-K'
494           umask_param = 'UMASK=022'
495 
496         useradd_args = [ "/usr/sbin/useradd",
497                          "-r", "-m",
498                          "-g", user,
499                          umask_arg, umask_param,
500                          "--home", data['home'],
501                          "--comment", data['longname'],
502                          "--shell", data['shell'] ]
  • Yarn启动失败的错误
    错误信息类似于:

Traceback (most recent call last):
File “/opt/cm-5.6.0/lib64/cmf/agent/src/cmf/util.py”, line 370, in source
return dict((line.split(“=”, 1) for line in data.splitlines()))
ValueError: dictionary update sequence element #103 has length 1; 2 is required

网上有人贴出了如下解决方法:

这个错误是CM的一个bug,解决方法为修改/opt/cm-5.3.0/lib64/cmf/agent/src/cmf/util.py文件。将其中的代码:
pipe = subprocess.Popen([‘/bin/bash’, ‘-c’, “. %s; %s; env” % (path, command)],
stdout=subprocess.PIPE, env=caller_env)
修改为:
pipe = subprocess.Popen([‘/bin/bash’, ‘-c’, “. %s; %s; env | grep -v { | grep -v }” % (path, command)],
stdout=subprocess.PIPE, env=caller_env)

这个方法是过滤掉env的输出,但是对于我的环境是没有用的,其实代码就是把env的输出保存到一个字典中,每一行是一个key=value的形式,但是如果env的输出中存在只有key,没有=等号的情况,那么插入字典时就会失败。我在agnet的日志中看到了打印的env的输出,果然有一行是这样的:

CLASSPATH=/usr/java/java^M/lib

这个^M是一个特殊的字符,应该是\r\n这类的,是一个换行,从而导致/lib后面没有等号,所以解决办法应该是:
修改格式不对的环境变量的值

CM重要文件的位置

  • CM Agent的功能文件位置:/opt/cm-5.6.0/lib64/cmf/agent/src/cmf/agent.py
  • CM Server和CM Agent的日志位置: /opt/cm-5.6.0/log/
  • CM Agent启动各组件的脚本位置:/opt/cm-5.6.0/lib64/cmf/service/
  • 安装完后各组件的安装位置:/opt/cloudera/parcels/CDH-5.6.0-1.cdh5.6.0.p0.45/lib/xxx,其中xxx为组件的名字,例如spark的位置就是/opt/cloudera/parcels/CDH-5.6.0-1.cdh5.6.0.p0.45/lib/spark目录
  • 安装完后各组件的配置文件的位置:/etc/xxx/conf,其中xxx为组件的名字,例如spark的配置文件就是/etc/spark/conf,conf是一个软链接,实际指向到/etc/alternatives/spark-conf
  • 各组件的运行时日志的位置:/var/log/xxx,其中xxx为组件的名字,例如oozie的日志就在/var/log/oozie目录里面

参考文档

  1. Cloudera Manager 和 CDH 4 终极安装
  2. CDH使用之CDH 5.3.x安装
  3. Cloudera Installation and Upgrade

你可能感兴趣的:(hadoop,CDH安装)