CDH的简介
大家常常说CDH。其全称是:Cloudera’s Distribution Including Apache Hadoop。简单的说是Cloudera公司的Hadoop平台,是在Apache原生的Hadoop组件基础上进行了封装和加强。
CDH里面有些什么东西呢?例如以下图:
那么这个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中,介绍了几种安装方法: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 rsacat ~/.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 = 0key_buffer = 16Mkey_buffer_size = 32Mmax_allowed_packet = 32Mthread_stack = 256Kthread_cache_size = 64query_cache_limit = 8Mquery_cache_size = 64Mquery_cache_type = 1max_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 = mixedread_buffer_size = 2Mread_rnd_buffer_size = 16Msort_buffer_size = 8Mjoin_buffer_size = 8M# InnoDB settingsinnodb_file_per_table = 1innodb_flush_log_at_trx_commit = 2innodb_log_buffer_size = 64Minnodb_buffer_pool_size = 4Ginnodb_thread_concurrency = 8innodb_flush_method = O_DIRECTinnodb_log_file_size = 512M[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pidsql_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,下载,并安装:
tar zxvf mysql-connector-java-5.1.38.tar.gzcp 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文件夹,下载页面是()假设是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-servermkdir /var/log/cloudera-scm-serverchown 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主机上运行:
- 创建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 startcp /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安装包的准备 到这里,一共包含三个文件(对于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的主机: ,默认登录username。密码是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的登陆password
- 实施安装
- 主机检測 随后会对各主机的环境进行检查,通常会报下面几个错误:
- 时间不同步 參见“遇到的问题”小节会有解决的方法。这里能够先无论。但不妨将每台机器的时间设置一致,能够不用安装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是否支持此选项。#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文件夹里面