1.准备工作
- 准备三台虚拟机,内存和硬盘空间尽量给足,配置host映射。(我的是三台节点配置相同:6G内存,50G硬盘,名称分别是cdh1、cdh2、cdh3)
- 下载安装包
Cloudera Manager:下载地址 http://archive.cloudera.com/cm5/cm/5/ 选择 cloudera-manager-centos7-cm5.12.1_x86_64.tar.gz (708M )
Cloudera’s Distribution Hadoop :下载地址 http://archive.cloudera.com/cdh5/parcels/5.12.1/选择 CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel 、CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel.sha1,manifest.json 和cdh在同一个页面 ,下载地址 http://archive.cloudera.com/cdh5/parcels/5.12.1/manifest.json
MySQL驱动:https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-5.1.44.tar.gz - 安装JDK、配置JAVA_HOME环境变量(使用Oracle JDK,CDH不支持OpenJDK)
- 关闭防火墙
- 配置NTP服务,集群中的各节点时间要保持同步,否则会出现各种问题(比如HBase的版本顺序和预期的不一样)
安装NTP
yum install ntp
在一个节点上启动NTP
service ntpd start
同步其他节点的时间
ntpdate cdh1
- 各节点之间配置SSH免密登录
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub cdh2
2.开始安装
- 创建cloudera-scm用户(每个节点都要创建)
useradd --system --home-dir /opt/cm-5.12.1/run/cloudera-scm-server/ --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
- 安装Cloudera Manager Server
首先需要安装Python,CentOS7默认安装了Python2.7
主节点解压安装cloudera-manager-centos7-cm5.12.1_x86_64.tar.gz到/opt文件夹
tar -xvf cloudera-manager-centos7-cm5.12.1_x86_64.tar.gz -C /opt
将MySQL驱动复制到/opt/cm-5.12.1/share/cmf/lib中
配置MySQL的远程访问权限
grant all privileges on *.* to 'root'@'%' identified by 'root';
flush privileges;
初始化CM的元数据库
/opt/cm-5.12.1/share/cmf/schema/scm_prepare_database.sh mysql cm -uroot -proot -h127.0.0.1(或者远程数据库的地址) --scm-host cdh1 scm scm scm
mysql指定数据库类型,cm为元数据库名,-u为数据库用户名,-p为数据库密码,-h为数据库地址,–scm-host 为cm主节点地址,最后三个scm不用理会,是从官网直接上copy过来的
执行完毕后如果报Access denied,检查一下是否启用了global id,如果启用了,禁用即可。原因在于上述脚本执行语句时在建表过程中会执行select命令,而启用了global id的情况下不允许这种操作。
建库成功后会发现MySQL的用户表里多出一个名为scm的用户,host为CM主节点的host,执行
use mysql;
update user set host='%' where User='scm';
grant all privileges on *.* to 'scm'@'%';
flush privileges;
- 安装Cloudera Manager Agent
修改/opt/cm-5.12.1/etc/cloudera-scm-agent/config.ini中的server_host为主节点的主机名。
将主节点的/opt/cm-5.12.1同步到其它节点
scp /opt/cm-5.12.1 root@cdh2:/opt
将Parcel包放到主节点的/opt/cloudera/parcel-repo/目录中(如没有parcel-repo,需要手动创建)
cp CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel /opt/cloudera/parcel-repo/
cp CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel.sha1 /opt/cloudera/parcel-repo/CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel.sha
cp manifest.json /opt/cloudera/parcel-repo/
- 启动Cloudera Manager Server
创建以下三个文件夹
mkdir -p /var/lib/cloudera-scm-server
mkdir -p /var/lib/cloudera-scm-agent
mkdir -p /var/lib/cloudera-scm-server-db/data
/opt/cm-5.12.1/etc/init.d/cloudera-scm-server start #启动成功后等5分钟左右查看进程会出现7180端口
- 启动Cloudera Manager Agent
所有节点通过/opt/cm-5.12.1/etc/init.d/cloudera-scm-agent start
启动Agent服务。 (所有节点都要启动Agent服务,包括主节点)
查看进程出现9000等端口代表启动成功
3.启动CM
在浏览器访问192.168.1.211:7180输入账号密码(初始均为admin)出现如下界面:
点继续,然后根据自己的需要来配置相关项,启动成功后的界面:
4.遇到的问题
使用HBase Client API在自己的机器上来编写代码访问HBase操作表时长时间没反应
这是因为CDH集群中hbase-site.xml文件中配置的zookeeper-quorum属性为:
<property>
<name>hbase.zookeeper.quorum</name>
<value>cdh1,cdh2,cdh3</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
导致HBase集群在Zookeeper中注册的节点名称为cdh*,所以在通信时HBase Client API得到的地址也是cdh开头的,但是本机上并没有进行host映射,所以会出现连接不上的情况。至于为什么能够创建HBase的Connection,是因为创建连接的过程只是和Zookeeper进行通信,并不涉及到HBase,而一旦对表进行操作,API会到Zookeeper中查询-root-表所在的region地址,此时返回的是cdh开头的host[zk: localhost:2181(CONNECTED) 13] get /hbase/meta-region-server �regionserver:60020�9UF cdh1��Љ���+ cZxid = 0x400000035 ctime = Tue Oct 24 20:53:46 PDT 2017 mZxid = 0x400000035 mtime = Tue Oct 24 20:53:46 PDT 2017 pZxid = 0x400000035 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 58 numChildren = 0
可以看到ZNode中存储的值为cdh1,在本机hosts文件中配置host映射即可解决这个问题
启动Spark时报Permission denied错误
是因为HDFS默认开启了权限检查,只有hdfs用户名能进行操作,测试时可以选择关闭检查HDFS权限,方法如下:
在CM的首页左侧选择HDFS集群,然后点击配置选项卡
取消检查HDFS权限选项的勾选即可启动Spark时报内存不足错误
java.lang.IllegalArgumentException: Required executor memory (1024+384 MB) is above the max threshold (1024 MB) of this cluster! Please check the values of 'yarn.scheduler.maximum-allocation-mb' and/or 'yarn.nodemanager.resource.memory-mb'.
at org.apache.spark.deploy.yarn.Client.verifyClusterResources(Client.scala:281)
at org.apache.spark.deploy.yarn.Client.submitApplication(Client.scala:140)
at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:57)
at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:151)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:538)
at org.apache.spark.repl.SparkILoop.createSparkContext(SparkILoop.scala:1022)
at $line3.$read$$iwC$$iwC.<init>(<console>:15)
at $line3.$read$$iwC.<init>(<console>:25)
at $line3.$read.<init>(<console>:27)
at $line3.$read$.<init>(<console>:31)
at $line3.$read$.<clinit>(<console>)
at $line3.$eval$.<init>(<console>:7)
at $line3.$eval$.<clinit>(<console>)
将异常中要求的两个属性设置为Required executor memory (1024+384 MB)
比括号中的值大即可,在YARN集群中设置,设置完之后要重启集群