截至到2016年5月30日,在网上都没有找到离线安装CDH5.6的文章,最新的就是5.6,经过各种试验,总算装好了,记录如下。
一、基础环境
1.操作系统:Centos6.5 Minimal版本
2.CDH 5.7/5.8
3.Cloudra Manager版本5.7/5.8
4.JDK版本:5.7用的JDK7,5.8用的JDK8
5.使用VirtualBox 5搭建3个虚拟机
6.硬件:笔记本 i5第6代,16G内存,256G固态硬盘
7.所有操作都是用root用户,且各个虚拟机root用户密码都设置成一样的
二、主机基础配置
各种基础配置在网上已经到处都是了,没有什么特殊的。
主要环节如下:
1、每台机器配置hosts
2、关闭防火墙和selinux
3、ssh无密码登录
注意,master机器也要免登录自己,否则,安装过程中,启动Yarn服务这一步会失败,而且在日志中还找不到任何错误。
4、安装JDK
1)卸载自带java
rpm -qa |grep java
yum remove java*(删除自带的java)
2)安装jdk(每个节点rpm安装)
rpm -ivh jdk1.7.0_67.rpm
!!!重点!!!
JAVA安装后,CDH需要一个/usr/java/default的软链接,否则安装CM的过程中,会出现找不到JAVA_HOME的错误。
进入/usr/java目录:ln -s /opt/java/jdk1.7.0_67 default。
之后,修改/etc/profile:
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
启动:source /etc/profile
5、ntp时间同步
1)安装NTP(每个节点): yum install ntp
2)配置NTP
master配置:
vi /etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 10
restrict 192.168.56.0 255.255.255.0 nomodify notrap
chkconfig ntpd on
service ntpd start
slave配置:
vi /etc/ntp.conf
server master
service ntpd start
chkconfig ntpd on
3)查看同步效果 命令:ntpstat
每台机器上都看看,应该看到类似下面的提示:
synchronised to NTP server (192.168.56.105) at stratum 12
三、Cloudera Manager安装
下载地址:
http://archive.cloudera.com/cm5/redhat/6/x86_64/cm/5.7/RPMS/x86_64/
1、master节点安装
将下载好的rpm包放到一个文件夹中(比如:cm5),进入到这个文件夹手动安装:
yum localinstall --nogpgcheck *.rpm
在使用mysql作为数据库时,则不需要下载和安装 cloudera-manager-server-db-xxx.rpm,此包为postgresql数据库的安装包.
2、slave节点安装
只需安装cloudera-manager-agent.rpm和cloudera-manager-daemons.rpm
(使用yum localinstall安装)
3、正式安装cloduera manager
使用http://archive.cloudera.com/cm5/installer/latest/cloudera-manager-installer.bin,进行安装。
chmod u+x cloudera-manager-installer.bin
./cloudera-manager-installer.bin
然后一直下一步,accept等,直到执行完成。
注意:有可能需要先把/etc/cloudera-scm-server/db.properties文件删除掉。否则安装程序会报告不兼容。
安装过程的日志,默认记录到:/var/log/cloudera-manager-installer/。
如果出现问题,首先到这个目录下查看出现问题的环节对应的日志文件。
(0.check-selinux.log 1.install-repo-pkg.log 2.install-oracle-j2sdk1.7.log 3.remove-cloudera-manager-repository.log)
实际上,这个文件是用于在线安装的,因为我们提前下载并安装了CM的RPM包,所以这个脚本可以迅速完成安装过程。
注意:在安装5.8这个版本时,运行.bin后,一直停在安装jdk7的环节,看“2.install-oracle-j2sdk1.7.log”,发现是连接下载JDK时超时,而且下载的是cloudera网上的jdk7。没办法,只好这么做:
1、安装httpd:yum -y install httpd
2、编辑hosts文件,把cm安装用的“archive.cloudera.com”解析成本机地址(为了骗他,免得真去cloudera上去下载jdk)
3、创建目录:/var/www/html/cm5/redhat/6/x86_64/cm/5/RPMS/x86_64/
4、把提前下载的oracle-j2sdk1.7-1.7.0-update67-1.x86_64.rpm放进去(记得把1.7.0-update67改为1.7.0+update67)
5、cd /var/www/html/cm5/redhat/6/x86_64/cm
6、wget http://archive.cloudera.com/cm5/redhat/6/x86_64/cm/RPM-GPG-KEY-cloudera (先把hosts文件恢复了再执行)
7、启动httpd:apachectl start
再开始安装,这时候cm会从本机下载jdk并安装。但是你仍然可以使用之前已经安装的jdk8。
8、安装结束后,记得把hosts文件恢复回去,否则下面装CDH的时候会跑到本机去下载相关包。
安装结束后,登录:http://192.168.56.105:7180/cmf
四、安装CDH 5.7或5.8
1、下载CDH软件包:
http://archive.cloudera.com/cdh5/parcels/5.7/
下载el6的两个parcel文件(6就是centos6),和manifest.json
把parcel.sha1更名为 parcel.sha,否则安装时又会下载一遍
注意:http://archive.cloudera.com/cdh5/cdh,这个目录是CDH中所有用到的组件的变更日志及源码(Hive、Hbase等等)
刚刚master节点上安装完成了CM,会在/opt目录下生成cloudera文件夹,将刚才下载的三个文件移动到/opt/cloudera/parcel-repo目录下面。
登录:http://192.168.56.105:7180/cmf
一路NEXT,完成CDH的安装。
注意点:
1. 在搜索集群主机画面,输入ip范围进行搜索:192.168.56.[105-107]。master也要选上。如果不选master,那么这个机器仅仅是CM的主机而不属于hadoop集群了,诸如NameNode、Hbase的HMaster等主控服务都会被安装到slave1上。
2. 提前把 /opt/cloudera 目录下的目录和文件修改权限:chown -R cloudera-scm.cloudera-scm *(因为CDH5.8需要这个用户进行安装)。
3. “提供ssh登录凭据”页面,选择root,并且接受相同的密码。
指定主机的 SSH 登录方式
一种通过root用户,密码需要一致,刚开始安装建议使用root。
也可以使用非root用户,但是需要保证sudo无密码访问。
实现方法如下:
(给hdfs用户设置无密码sudo权限)
chmod u+w /etc/sudoers
hdfs ALL=(root)NOPASSWD:ALL
chmod u-w /etc/sudoers
测试:sudo ifconfig
期间,可能会出现错误,有的错误是因为虚拟机内存不够导致的,可以多重试几次就过了。
另一个错误:
安装完毕后集群HDFS报警:
群集中有 9 个 副本不足的块 块。群集中共有 11 个块。百分比 副本不足的块: 81.82%。 临界阈值:40.00%
产生的原因是因为集群中DataNode节点只有2个,而安装过程中采用的都是默认配置,dfs.replication 设置的为3,所以导致次报警。解决办法:配置dfs.replication值为2并执行以下命令:
su hdfs
hadoop fs -setrep 2 /
如果出现“正在获取安装锁”卡住不动了,删掉锁文件:
rm -rf /tmp/.scm_prepare_node.lock
启动服务:service cloudera-scm-server restart
启动Agent:service cloudera-scm-agent restart
服务出了问题,记得首先去看相应的日志:/var/log/cloudera*,这些目录里面记录着各种日志。
CDH安装后的各种配置文件、目录位置等信息:
1、相关目录
/var/log/cloudera-scm-installer : 安装日志目录。
/var/log/* : 相关日志文件(相关服务的及CM的)。
/usr/share/cmf/ : 程序安装目录。
/usr/lib64/cmf/ : Agent程序代码。
/var/lib/cloudera-scm-server-db/data : 内嵌数据库目录。
/usr/bin/postgres : 内嵌数据库程序。
/etc/cloudera-scm-agent/ : agent的配置目录。
/etc/cloudera-scm-server/ : server的配置目录。
/opt/cloudera/parcels/ : Hadoop相关服务安装目录。
/opt/cloudera/parcel-repo/ : 下载的服务软件包数据,数据格式为parcels。
/opt/cloudera/parcel-cache/ : 下载的服务软件包缓存数据。
/etc/hadoop/* : 客户端配置文件目录。
2、配置文件
配置文件放置于/var/run/cloudera-scm-agent/process/目录下。
如:/var/run/cloudera-scm-agent/process/193-hdfs-NAMENODE/core-site.xml。这些配置文件是通过Cloudera Manager启动相应服务(如HDFS)时生成的,内容从数据库中获得(即通过界面配置的参数)。
在CM界面上更改配置是不会立即反映到配置文件中,这些信息会存储于数据库中,等下次重启服务时才会生成配置文件。且每次启动时都会产生新的配置文件。
五、安装后验证
1、验证MR程序
# 添加用户和组
groupadd cdh-dev
useradd -g cdh-dev cdh-dev
lid cdh-dev
# hadoop创建相应的用户
sudo -u hdfs hdfs dfs -mkdir /user/cdh-dev
sudo -u hdfs hdfs dfs -chown cdh-dev:cdh-dev /user/cdh-dev
# 运行wordcount程序
su - cdh-dev
echo "Hello world Bye world" > file0
echo "Hello hadoop Goodbye hadoop" > file1
hdfs dfs -mkdir -p /user/cdh-dev/wordcount/input
hdfs dfs -put file* /user/cdh-dev/wordcount/input
hadoop jar /opt/cloudera/parcels/CDH/jars/hadoop-examples.jar wordcount wordcount/input wordcount/output
hdfs dfs -getmerge wordcount/output output.txt
cat output.txt
2、验证Hive
su - cdh-dev
echo "Alex, Cloudera" > hive-data
echo "fd, jinz" >> hive-data
hdfs dfs -mkdir -p hive/table-data-files
hdfs dfs -put hive-data hive/table-data-files
vi hive-data.sql
------------------------------------------
create external table test(
name string,
company string
)
row format delimited
fields terminated by ','
stored as textfile
location '/user/cdh-dev/hive/table-data-files'
------------------------------------------
hive -f hive-data.sql
hive -e "select * from test"
hive -e "drop table test"
3、验证HBase
创建表
create 'record', {NAME => 'user'}
put 'record', 'Alex', 'user:company', 'Cloudera'
# 验证一下: get 'record', 'Alex'
# 用vi创建文件 hbase_on_hive.hql
create external table hbase_on_hive(
name string,
company string
)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties ( "hbase.columns.mapping" = ":key, user:company" )
tblproperties ( "hbase.table.name" = "record" );
hive -f hbase_on_hive.hql
hive -e "select * from hbase_on_hive" -- 无数据
hive -e "insert overwrite table hbase_on_hive select * from test"
hive -e "select * from hbase_on_hive" -- 可以看到数据已经进去了