IT技术互动交流平台

通过ClouderaManager安装CDH5.6

来源:IT165收集  发布日期:2016-04-05 22:55:01

CDH的简单介绍

大家经常说CDH,其全称是:Cloudera’s Distribution Including Apache Hadoop,简单的说是Cloudera公司的Hadoop平台,是在Apache原生的Hadoop组件基础上进行了封装和加强。CDH里面有些什么东西呢?如下图:
cloudera-enterprise-detailed.png
那么这个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就可以了。
这里写图片描述 选择加入集群的主机
这里会自动显示出启动了CM Agent进程的服务器,如果没有显示,请检查/opt/cm-5.6.0/etc/cloudera-scm-agent/config.ini文件中server_host是否配置为CM Server的地址
这里写图片描述 选择需要安装的parcel版本
如果这里没有正确显示你下载的parcel版本,那么请检查”parcel安装包的准备”小节。
这里写图片描述 选择JAVA安装
这一步由于之前我们已经手动安装过了JAVA SDK,所以这一步不要选择复选框,直接继续
这里写图片描述 输入主机root的登录密码
这里写图片描述 实施安装
这里写图片描述 主机检测
这里写图片描述
随后会对各主机的环境进行检查,一般会报以下几个错误:
时间不同步
参见“遇到的问题”小节会有解决办法,这里可以先不管。但最好还是将每台机器的时间设置一致,可以不用安装NTP服务。 swappiness的问题
按照提示执行如下命令:

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

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

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

遇到的问题

mysql的启动问题
Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist
执行如下命令解决:
mysql_install_db --user=mysql 

各主机时间不同步的问题
在主机->配置页面,搜索栏中输入时钟,将警告和严重都设置为“从不”。如下图所示:
这里写图片描述

主机缺少用户错误
查看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是一个特殊的字符,应该是 这类的,是一个换行,从而导致/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目录里面

 

Tag标签: 通过ClouderaManager安装CDH5   6  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规