1、搭建准备
(1)配置ip、hostname、主机映射、用户权限管理
(2)禁用ipv6、selinux 和关闭防火墙
(3)在所有机器上卸载OpenJDK,安装Oracle JDK
(4)配置SSH免密码登录
(5)集群系统的时间同步
(6)在所有服务器上设置用户能打开的文件最大数量、进程最大数据、能使用的内存量
(7)安装mysql数据库
2、CM 平台搭建
(1)在所有服务器上安装第三方依赖
yum -y install chkconfig python bind-utils psmisc libxslt zlib sqlite cyrus-sasl-plain cyrus-sasl-gssapi fuse portmap fuse-libs redhat-lsb
(2)下载安装包
Cloudera Manager下载地址:http://archive.cloudera.com/cm5/cm/5/
下载好压缩包cloudera-manager-el6-cm5.10.2_x86_64.tar.gz,上传到/opt/softwares文件夹下。
(3)解压安装包
在server主节点上创建一个CM的解压目录:# mkdir -p /opt/cloudera-manager
解压安装包:
# tar -zxf /opt/softwares/cloudera-manager-el6-cm5.10.2_x86_64.tar.gz -C /opt/cloudera-manager
在解压路径下出现两个子目录cloudera和cm-5.10.2,其中/opt/cloudera-manager/cm-5.10.2存放CM框架本身的配置、依赖库、启动脚本等文件。
(4)在server主节点上修改agent配置
# vi /opt/cloudera-manager/cm-5.10.2/etc/cloudera-scm-agent/config.ini
# Hostname of the CM server.
server_host=beifeng01.com //指定server主节点
# Port that the CM server is listening on.
server_port=7182 //指定通信端口
(5)拷贝CM文件夹给其他服务器
# scp -r /opt/cloudera-manager/ beifeng02.com:/opt/
# scp -r /opt/cloudera-manager/ beifeng03.com:/opt/
(6)在agnet所有服务器节点创建cloudera Manager用户 cloudera-scm
# useradd --system --home=/opt/cloudera-manager/cm-5.10.2/run/cloudera-scm-server --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
详解: useradd
--system 表示创建的是系统用户
--home=/opt/cloudera-manager/cm-5.10.2/run/cloudera-scm-server 指定用户主目录路径
--no-create-home 不创建用户主目录
--shell=/bin/false 不作为一个登陆用户
--comment "Cloudera SCM User"
cloudera-scm 用户名
验证:# cat /etc/passwd | grep cloudera-scm
(7)配置CM数据库的权限
登陆主节点msyql:# mysql -uroot -p123456
在主节点,也即mysql安装的机器添加一个temp用户并赋予相关权限
mysql> grant all privileges on *.* to 'temp'@'%' identified by 'temp' with grant option ;
mysql> grant all privileges on *.* to 'temp'@'beifeng01.com' identified by 'temp' with grant option;
mysql> flush privileges ;
验证:
mysql> use mysql ;
mysql> select host ,user from user ;
在主节点上:
# cd /opt/cloudera-manager/cm-5.10.2/share/cmf/schema
在schema目录下执行脚本文件scm_prepare_database.sh
# ./scm_prepare_database.sh mysql -h beifeng01.com -utemp -ptemp --scm-host beifeng01.com scm scm scm
出现异常:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
解决办法:在/usr/share/java目录放入 mysql的驱动jar包,并且要求将jar包名称改为“mysql-connector-java.jar”
cp /opt/softwares/mysql-connector-java.jar /usr/share/java
下面两个可以不执行了:
# cp mysql-connector-java-5.1.26-bin.jar /usr/share/java
# mv mysql-connector-java-5.1.26-bin.jar mysql-connector-java.jar
SCM数据库配置成功显示:
All done, your SCM database is configured correctly!
(8)将CDH源放到Cloudera Manager 主节点服务器上
CDH源:hadoop集群(hadoop、flume、hbase等等)的安装文件.
在server主节点上创建CDH源存放目录,注意:目录名称不能变:
# mkdir -p /opt/cloudera/parcel-repo
在agent主机节点上创建目录:
# mkdir -p /opt/cloudera/parcels
移动CDH源到parcel-repo目录下:
# mv CDH-5.10.2-1.cdh5.10.2.p0.5-el6.parcel* /opt/cloudera/parcel-repo/
移动CDH源,去掉校验码文件结尾的1:
# mv CDH-5.10.2-1.cdh5.10.2.p0.5-el6.parcel.sha1 CDH-5.10.2-1.cdh5.10.2.p0.5-el6.parcel.sha
更改parcel目录的所有人:
server节点:
# chown -R cloudera-scm:cloudera-scm /opt/cloudera/parcel-repo/
agent节点(所有agent节点):
# chown -R cloudera-scm:cloudera-scm /opt/cloudera/parcels
(9)启动CM进程
server进程:
进入CM的进程启动脚本目录:
# cd /opt/cloudera-manager/cm-5.10.2/etc/init.d
启动命令,注意:至少需要8G内存:
# ./cloudera-scm-server start
进入server主进程的log日志目录:
# cd /opt/cloudera-manager/cm-5.10.2/log/cloudera-scm-server
查看server主进程的log日志:
# tail -f cloudera-scm-server.log
启动agent从节点进程(在所有agent节点中启动):
# cd /opt/cloudera-manager/cm-5.10.2/etc/init.d/
# ./cloudera-scm-agent start
jps命令看不到agent进程,因为是agent进程是Python语言维护。
[root@bigdata02 ~]# jps
[root@bigdata02 ~]# ps -ef | grep agent
gdm 2013 1961 0 Feb24 ? 00:00:00 /usr/libexec/polkit-gnome-authentication-agent-1
root 19512 1 3 10:26 ? 00:00:05 /opt/cloudera-manager/cm-5.10.2/lib64/cmf/agent/build/env/bin/python /opt/cloudera-manager/cm-5.10.2/lib64/cmf/agent/src/cmf/agent.py --package_dir /opt/cloudera-manager/cm-5.10.2/lib64/cmf/service --agent_dir /opt/cloudera-manager/cm-5.10.2/run/cloudera-scm-agent --lib_dir /opt/cloudera-manager/cm-5.10.2/lib/cloudera-scm-agent --logfile /opt/cloudera-manager/cm-5.10.2/log/cloudera-scm-agent/cloudera-scm-agent.log
CM的jetty服务器操作界面的访问端口为7180,操作界面地址:http://beifeng01.com:7180,登陆用户名:admin,密码:admin。
查看端口占用情况:# netstat -tlnup
查看Windows系统配置:
C:\Windows\System32\drivers\etc
192.168.84.131 beifeng01.com
192.168.84.132 beifeng02.com
192.168.84.133 beifeng03.com
启动好后 ,netstat -tlnup | grep 7180
命令查看是否正常开启了7180页面访问端口。
通过浏览器访问:http://beifeng01.com:7180,
或者:http://beifeng01.com:7180/cmf/express-wizard/resume
登录用户名:admin,登录密码:admin。
报错:
useradd: cannot lock /etc/group; try again later.
useradd: cannot lock /etc/gshadow ; try again later.
解决方法:删除group.lock,删除gshadow.lock。
(10)检查主机的正确性
【报错异常】
Cloudera 建议将 /proc/sys/vm/swappiness 设置为最大值 10。当前设置为 60。
【解决方法】
当前设置查看:# more /proc/sys/vm/swappiness
三台agent主机都执行(不使用磁盘作为内存交换区):# echo 10 > /proc/sys/vm/swappiness
【报错异常】
已启用透明大页面压缩,可能会导致重大性能问题。请运行echo never > /sys/kernel/mm/transparent_hugepage/defrag
和echo never > /sys/kernel/mm/transparent_hugepage/enabled
以禁用此设置,然后将同一命令添加到 /etc/rc.local 等初始化脚本中,以便在系统重启时予以设置。以下主机将受到影响:…
【解决方法】
所有机器执行:
# echo never > /sys/kernel/mm/transparent_hugepage/defrag
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
编辑/etc/rc.local文件:
# vi /etc/rc.local
添加上面的echo命令。
3、在CM上搭建服务规划
机器 | NameNode | DataNode | ResourceManager | NodeManager | JobHistoryServer | NameNode HA热备 | ResourceManager HA热备 | JournalNode | Zookeeper | HiveServer2 | Master | RegionServer | Sqoop | Flume | Oozie | Hue | MySQL |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
beifeng01.com | ok | ok | ok | ok | ok | ok | ok | ok | ok | ok | ok | ||||||
beifeng02.com | ok | ok | ok | ok | ok | ok | ok | ok | ok | ok | ok | ||||||
beifeng03.com | ok | ok | ok | ok | ok | ok | ok |
4、在CM上部署服务
(1)HDFS
NameNode所在机器:beifeng01.com
DataNode所在机器:beifeng[01-03].com
数据库所在机器:beifeng01.com
数据库名称:scm
登录用户:temp
登录密码:temp
群集设置:采取默认,有个默认节点目录
每次修改配置后,会出现过期配置,重启就好了
内存调度阀值:默认是0.8,可以修改为1
Java 堆栈大小:修改为默认值1
(2)YARN (MR2 Included)
ResourceManager所在机器:beifeng01.com
NodeManager所在机器:beifeng[01-03].com
JobHistoryServer所在机器:beifeng02.com
测试:
1)创建目录:hdfs dfs -mkdir /input
mkdir: Permission denied: user=root, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x
解决办法:
- 修改配置:在hdfs的配置里有个权限检查的配置
hdfs -> 配置 -> 检查hdfs权限 -> 把√去掉 -> 重启服务 - 声明HADOOP_USER_NAME为hdfs
export HADOOP_USER_NAME=hdfs
2)写一个文件:vi input.txt 上传到/input
hdfs dfs -put input.txt /input
3)跑个wordcount程序:
yarn jar /opt/cloudera/parcels/CDH-5.10.2-1.cdh5.10.2.p0.5/jars/hadoop-mapreduce-examples-2.6.0-cdh5.10.2.jar wordcount /input /output
4)修改reduce的个数
在yarn的配置里面:搜索mapreduce.job.reduces,默认为40,重置为1
重新部署客户端配置:重启
(3)ZooKeeper
ZooKeeper所在机器:三台机器都搭建ZooKeeper服务
警告:Cloudera Management Service: Service Monitor 的最大非Java 内存
修改为默认值,然后重启服务
(4)NameNode和ResourceManager的HA配置
HA的集群名称:nameservice1
在hdfs右边有个操作 -> 启用HA -> nameservice1
NameNode HA热备所在机器:beifeng02.com
JournalNode所在机器:beifeng[01-03].com
给出JournalNode的存储路径:/dfs/jn
对当前 NameNode 的名称目录进行格式化。如果名称目录不为空,此操作将失败
测试:kill掉活动的NameNode
在yarn右边有个操作 -> 启用HA -> ResourceManager HA热备所在机器:beifeng02.com
(5)Hive
HiveServer2所在机器:beifeng01.com
创建create database hive; 用户名:root 密码:root
链接数据库:数据库hive
测试:show databases;
显示列名和库名:hive -> 配置 -> hive-site.xml 的 Hive 客户端高级配置代码段(安全阀)-> 加入下面的配置:
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
$ bin/hive --service hiveserver2 &
$ bin/beeline
beeline> help
beeline> !connect jdbc:hive2://beifeng01.com:10000 root 123456 --Linux用户名、密码
> show databases;
> use mydb;
> show tables;
> select * from emp;
> !quit
(6)HBase
Master所在机器:beifeng01.com
RegionServer所在机器:beifeng[01-03].com
重启集群,启动HBase。
(7)Sqoop
Sqoop所在机器:beifeng02.com
测试:root或者temp登录
#sqoop list-databases --connect jdbc:mysql://beifeng01.com:3306 --username root --password 123456
报错:
java.lang.RuntimeException: Could not load db driver class: com.mysql.jdbc.Driver
Access denied for user 'root'@'beifeng02.com' (using password: YES)
解决方法:
scp -r mysql-connector-java.jar beifeng02.com:/usr/share/java/
scp -r mysql-connector-java.jar beifeng03.com:/usr/share/java/
如果没有java目录,就创建该java目录。
在beifeng01.com上进行mysql授权:
grant all privileges on *.* to 'root'@'beifeng02.com' identified by 'root' with grant option;
grant all privileges on *.* to 'root'@'beifeng03.com' identified by 'root' with grant option;
(8)Flume
Flume所在机器:beifeng[01-03].com,选择依赖关系多的选项。
1)Flume Agent包括三个组件source、channel、sink,一般Flume在正式使用时需要自己编写好flume.conf文件。通常使用的组件搭配有:exec source、memory channel、hdfs sink
2)Flume配置安装
角色分配给三台机器beifeng[01-03].com,也即三台机器公用一个agent
3)flume.conf详细配置
在flume“配置”中的“Agent Default Group”,设置代理名称为 “a1”,配置文件用如下配置替换:
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /opt/cloudera-manager/cm-5.3.6/log/cloudera-scm-agent/supervisord.log
a1.sources.r1.channels = c1
# Describe the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://nameservice1/cmagent/logs/%Y-%m-%d
# default:FlumeData
a1.sinks.k1.hdfs.filePrefix = cmagent-
# useLocalTimeStamp set true
a1.sinks.k1.hdfs.useLocalTimeStamp = true
a1.sinks.k1.hdfs.rollInterval = 0
a1.sinks.k1.hdfs.rollCount = 0
# block 128 120 125
a1.sinks.k1.hdfs.rollSize = 10240
a1.sinks.k1.hdfs.fileType = DataStream
#a1.sinks.k1.hdfs.round = true
#a1.sinks.k1.hdfs.roundValue = 10
#a1.sinks.k1.hdfs.roundUnit = minute
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
4)启动flume,查看其中一台的日志信息
5)flume 会以flume用户访问hdfs,报错如下:
org.apache.hadoop.security.AccessControlException: Permission denied: user=flume, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x
解决办法:
在hdfs上手动将cmagent/logs创建出来,更改该目录的所属者为flume:
~]# hdfs dfs -mkdir /cmagent
~]# export HADOOP_USER_NAME=hdfs
~]# hdfs dfs -chown -R flume /cmagent
6)一个集群中可以添加配置多个flume服务,收集不同数据源
(9)Oozie
Oozie所在机器:beifeng03.com,选择依赖关系多的选项
1)在Oozie Server进程所在的服务器上:
# scp ext-2.2.zip beifeng03.com:/var/lib/oozie
# cd /var/lib/oozie
解压zip包到Oozie Server进程所在的服务器上的/var/lib/oozie:
# unzip ext-2.2.zip
如果解压失败没有unzip,则yum源安装unzip:yum -y install unzip
修改oozie-site.xml的配置文件,设置时区:
# cd /opt/cloudera/parcels/CDH-5.3.6-1.cdh5.3.6.p0.11/etc/oozie/conf.dist
把下面配置加入oozie-site.xml或者在CM中找到Oozie的配置高级,将下面配置贴进去:
<property>
<name>oozie.processing.timezone</name>
<value>GMT+0800</value>
</property>
cd /opt/cloudera/parcels/CDH/lib/oozie/webapps/oozie
,修改Oozie的Web端代码:
vi oozie-console.js
177行:
function getTimeZone() {
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
return Ext.state.Manager.get("TimezoneId","GMT+0800");
}
2635行:var currentTimezone = Ext.state.Manager.get("TimezoneId","GMT+0800");
(10)Hue
Hue所在机器:beifeng02.com, 选择依赖关系多的选项。