1. 硬件准备
使用了五台机器,其中两台8c16g,三台4c8g。一台4c8g用于搭建cmServer和NFS服务端,另外4台作为cloudera-manager agent部署CDH集群。
ip | 主要服务/角色 | hostname(hosts配置与此一致) | 机器规格 |
---|---|---|---|
10.2.223.237 | cmServer NFS server | v-xstest-849-171208-cdh-1.hx | 4c8g200g |
10.2.223.239 | Namenode,resouceManager,Hbase Master等 | v-xstest-855-171208-cdh2-1.novalocal | 8c16g200g |
10.2.223.242 | SecondaryNamenode,hive,hue等 | v-xstest-856-171208-cdh2-2.novalocal | 8c16g200g |
10.2.223.224 | Datanode,regionServer,nodeManager等 | v-xstest-850-171208-cdh-2.novalocal | 4c8g200g |
10.2.223.197 | Datanode,regionServer,nodeManager等 | v-xstest-851-171208-cdh-3.novalocal | 4c8g200g |
2. NFS搭建
2.1 NFS简介
NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的。 它最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 (share files)。所以,你也可以简单的将他看做是一个文件服务器 (file server) 呢!这个 NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样 (partition)!使用上面相当的便利!
2.2 安装NFS
- 查看系统是否已经安装NFS
rpm -qa | grep nfs
rpm -qa | grep rpcbind
- yum安装NFS
yum -y install nfs-utils rpcbind
2.3 NFS服务端配置
- 在NFS服务端上创建共享目录/opt/share并设置权限
mkdir -p /opt/share
chmod 666 /opt/share
- 编辑/etc/exports文件
vim /etc/exports
/opt/share *(rw,no_root_squash,no_all_squash,sync)
配置生效命令:
exportfs -r
- 参数说明:
参数值 内容说明
rw ro 该目录分享的权限是可擦写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。
sync async sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘!
no_root_squash root_squash 客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行!
all_squash 不论登入 NFS 的使用者身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) 啦!
anonuid anongid anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于你的 /etc/passwd 当中! anonuid 指的是 UID 而 anongid 则是群组的 GID 啰。
- 启动服务
service rpcbind start
service nfs start
2.4 NFS客户端配置
- 安装以及启动同上
- 客户端设置
mkdir -p /opt/share
showmount -e 10.2.223.237
mount -t nfs 10.2.223.237:/opt/share /opt/share -o proto=tcp -o nolock
3. SSH免密登录
3.1 实现方法
要实现多台机器相互之间免密登录,只需要将每台机器ssh-keygen生成的公钥(id_rsa.pub)写到一个文件authorized_keys,然后将这个文件复制到每台机器的~/.ssh/authorized_keys,这样就可以互通了。
3.2 具体步骤
hosts文件编辑,注意一定要保持与每台机器hostname一致,将hosts文件写到/opt/share/ssh,便于同步
每台机器执行 ssh-keygen -t rsa -f ~/.ssh/id_rsa,连续回车两次
将每台机器的id\_rsa.pub写到/opt/share/ssh/authorized\_keys
每台机器执行/opt/share/ssh/sync\_config.sh,保持hosts,authorized\_keys一致
sync\_config.sh:
#!/bin/bash
rm -f /etc/hosts
cp /opt/share/ssh/hosts /etc/hosts
rm -f /root/.ssh/authorized_keys
cp /opt/share/ssh/authorized_keys /root/.ssh/authorized_keys
4. 安装Cloudera Manager Server和Agent
使用cm5.4.1 el6版本,el5会有python版本问题,el6内置的python2.6.
4.1 资源下载
cm安装包:http://archive.cloudera.com/cm5/cm/5/cloudera-manager-el6-cm5.4.1_x86_64.tar.gz
cm资源包(parcel):http://archive.cloudera.com/cdh5/parcels/5.4.1/CDH-5.4.1-1.cdh5.4.1.p0.6-el6.parcel
其他:http://archive.cloudera.com/cdh5/parcels/5.4.1/CDH-5.4.1-1.cdh5.4.1.p0.6-el6.parcel.sha1
http://archive.cloudera.com/cdh5/parcels/5.4.1/manifest.json
另外需要准备mysql-jdbc jar包,这个从maven仓库找一个就行,我用的是:mysql-connector-java-5.1.34.jar
将上面下载资源上传到NFS目录/opt/share/cdh,mysql-connector-java-5.1.34.jar放到/opt/share
4.2 安装
- 解压:所有机器
mkdir -p /opt/cloudera-manager
tar xvzf share/cloudera-manager*.tar.gz -C /opt/cloudera-manager
- 添加用户:所有机器
useradd --system --home=/opt/cloudera-manager/cm-5.4.1/run/cloudera-scm-server/ --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
- 修改cloudera-scm-agent config.ini:所有机器
vim /opt/cloudera-manager/cm-5.4.1/etc/cloudera-scm-agent/config.ini
修改server.host=10.2.223.237 #即cloudera manager Server地址
- 数据库初始化:仅需要 cloudera manager server 执行
cp /opt/share/mysql-connector-java-5.1.34.jar /opt/cloudera-manager/cm-5.4.1/share/cmf/lib
/opt/cloudera-manager/cm-5.4.1/share/cmf/schema/scm_prepare_database.sh mysql cm_new -h 10.2.222.25 -ubigdata -p'bigdata123' --scm-host 10.2.223.237 bigdata bigdata123 --force
注释:cm_new 数据库名称,自己填写 -h -u -p连接数据库配置,如果没有mysql需要自己搭建 ,--scm-host 后面bigdata bigdata123这两个是需要连接的数据库配置,而不是网上的scm scm scm
注2:这个命令执行主要是创建数据库,并且在/opt/cloudera-manager/cm-5.4.1/etc/cloudera-scm-server/db.properties生成数据库配置,如果配置成功就OK了,可以忽略其他报错
- 创建parcel-repo文件夹:cloudera manager server,注意文件夹名字不要写错,这个与后面CM配置页面里面设置对应,也可以修改,建议默认值保持一致
mkdir -p /opt/cloudera/parcel-repo
cp /opt/share/cdh/CDH-5.4.1-1.cdh5.4.1.p0.6-el6.parcel.sha1 /opt/cloudera/parcel-repo/CDH-5.4.1-1.cdh5.4.1.p0.6-el6.parcel.sha #注意修改名称sha1 sha
cp /opt/share/cdh/manifest.json /opt/cloudera/parcel-repo
chown cloudera-scm:cloudera-scm -R /opt/cloudera/parcel-repo/
- 创建parcels文件夹:cloudera manager agent
mkdir -p /opt/cloudera/parcels
chown cloudera-scm:cloudera-scm /opt/cloudera/parcels
4.3 启动服务
- Manager Server:/opt/cloudera-manager/cm-5.4.1/etc/init.d/cloudera-scm-server start
- Agent : /opt/cloudera-manager/cm-5.4.1/etc/init.d/cloudera-scm-agent start
5. CDH配置安装
登录配置页面10.2.223.237:7180 默认账号秘密: admin admin
由于本人安装时候没有一个个页面截图,具体大家第一次进入之后就可以看到,傻瓜式操作。
5.1 导航安装
- 登录进入以后,选择免费版,进入为CDH集群指定安装主机页面后,如果配置安装正确,所有agent机器都会出现在当前管理的主机,如果没有,则启动错误或者config.ini配置错误。检查启动日志,修改错误后,删除4.2中创建的数据库并且重新执行数据库初始化,重启服务
- 进入群集安装页面,会让你选择CDH版本,勾选使用parcel建议 以及CDH-5.4.1-1.cdh5.4.1.p0.6
- 进入群集设置,选择需要安装的服务,建议自定义服务,安装你需要的相关服务即可
- 接下来是集群分配各节点角色:这块最好不要按照默认配置的来,相关的服务最好可以合理分配一下,比如我的两台8c16g就用来安装Namenode ,resourceManger,hbase master,sendcondary namenode,hive以及hue等。同时,自己手动分配的时候,也会对集群相关服务更了解,后面安装出错的时候更容易找到日志定位问题
- 配置hive/oozie/active monitor数据库:需要提前创建好
- 安装服务:各个服务按顺序安装,中间出错的时候请在对应的机器上找到相关的日志,服务的日志都是在/opt/cloudera-manager/cm-5.4.1/run/cloudera-scm-agent/process/,在里面找该服务相关的文件夹,进入之后就可以找到日志文件了。修复问题后,点击重试,会从最近失败的服务开始重新安装,直到所以安装完成就行了。
- 如果没有安装结束就退出,没有关系,http://10.2.223.237:7180/cmf/hardware/hosts 这个是主机管理页面,可以看每台机器上还有哪些机器没有启动服务,手动启动也可以的
5.2 服务配置修改
- 修改集群显示名称:默认Cluster 1,直接修改初始化数据库脚本的数据库名.clusters表,修改display_name
- 其他服务配置:比如hdfs,hbase等,直接在群集选项中选择该服务,进入以后点击配置就可以了
6. 相关错误以及心得
6.1 常见错误
- scm_prepare_database.sh执行报错
之前我也是参考网上的执行命令,但是没人解释最后三个scm scm scm是什么意思,具体在4.2中我已经强调了,只要后面数据库创建成功并且对应的db.properties文件配置没错就行了
- 配置hive/oozie数据库出错
要提前创建数据库,并且安装服务的机器上在/opt/cloudera-manager/cm-5.4.1/share/cmf/lib有mysql-connector jar包
- 仅完成1个步骤。首个失败:主机bigdata-cdh-client(id=2)上的客户端配置(id=1)已使用1退出,而预期值为0
在安装服务界面,执行失败时,点击查看详细信息,会给出这样类似的错误信息。查看/opt/cloudera-manager/cm-5.4.1/run/cloudera-scm-agent/process目录下相关日志。
发现上面这个错误信息是由于JAVA_HOME问题,启动脚本中,JAVA_HOME并不是根据环境变量来获取,而是在它列举的几个目录下寻找,所以只要把你的java路径ln -s过去就行,比如我的 ln -s /opt/jdk/jdk1.7-7u80/ /usr/java/jdk1.7
- hive metastore server启动失败 Caused by: org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFoundException: The specified datastore driver ("com.mysql.jdbc.Driver") was not found in the CLASSPATH
将mysql-connectorxxx.jar拷贝到/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hive/lib下,只需要拷贝hive metastore server这台就行了
- urlopen error [Errno -2] Name or service not known> - agent197
我之前为了识别方便,修改了hosts和机器的hostname,但是在我们的DNS服务器中仍无法修改,可以通过nslookup ip 查看比如nslookup 10.2.223.237,发现这个里面的name仍然是修改hostname之前的。
所以建议不要轻易修改hostname,在配置的hosts中也要保持与hostname一致
- 安装向导页面创建hive metastore数据库表出错:org.apache.hive.beeline.HiveSchemaHelper.getConnectionToMetastore(HiveSchemaHelper.java:79
cp /opt/share/mysql-connector-java-5.1.34.jar /opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib)
- oozie创建数据库表失败,没有com.mysql.jdbc.driver
cp /opt/share/mysql-connector-java-5.1.34.jar /opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/oozie/libtools
- oozie服务启动失败:stdout.log中也是没有com.mysql.jdbc.driver
首先,删除oozie数据库并重新创建
然后cp /opt/share/mysql-connector-java-5.1.34.jar /opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib
6.2 建议&心得
- 请一定先搭建好NFS,而不是通过大量的scp节省人力。
- cm是一个帮助你安装hadoop生态的管理工具,类似ambari,但是需要了解并修改每个服务的基本配置
- 在安装服务过程中一定要找日志,只有日志才会告诉你具体的问题