*0.前言*
CDH搭建方式是使用Cloudera Manager进行一键式搭建hadoop集群,Cloudera Manager里面集成了hadoop组件的管理功能,并且提供了hadoop组件的静态资源parcel,可以实现一键安装、配置,统一管理。非常节省时间。
不推荐初学者学习CDH方式搭建,初学者建议以apache传统方式搭建,方便学习hadoop组件的工作原理。
*1.前置操作*
准备了四台虚拟机。root密码自己设置,我图方便都用root了
*修改hosts文件*
在四台节点上修改hosts文件,并且最好更改自己的hostname。
映射命名如下。
vim /etc/hosts
10.3.69.80 cdh00
10.3.69.81 cdh01
10.3.69.82 cdh02
10.3.69.83 cdh03
hostnamectl set-hostname cdh00
hostnamectl set-hostname cdh01
hostnamectl set-hostname cdh02
hostnamectl set-hostname cdh03
*配置清华的yum源*
*其他应用安装*
ifconfig不能用?
yum install net-tools -y
vi没颜色不好看,弄个vim。
yum install vim -y
节点之间要保证时间同步。
yum install ntp -y
ntpdate ntp6.aliyun.com
节点之间要经常通信,输密码很烦,先生成一对密钥
ssh-keygen
三个回车,不需要内容直接回车就行。
然后把密钥发送给其他节点
ssh-copy-id cdh00
关闭selinux
修改配置文件(重启生效)
vim /etc/selinux/config
将SELINUX=enforcing 改为SELINUX=disabled
下载其他第三方依赖
yum -y install chkconfig python bind-utils psmisc libxslt zlib sqlite cyrus-sasl-plain cyrus-sasl-gssapi fuse fuse-libs redhat-lsb httpd mod_ssl
*2.安装mysql*
虚拟机里默认有了jdk1.8,接下来安装mysql,理论上来讲只需要server节点安装,所以只在cdh00节点中安装mysql即可,其余例如hive之类的组件都依赖于cdh00的MySQL。
rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpmyum repolist enabled | grep "mysql.*-community.*"
yum -y install mysql-community-server
systemctl enable mysqld
systemctl start mysqld
默认没有root密码,直接mysql -uroot登录登录进去以后修改mysql密码。
update mysql.user set password=PASSword('root') where user='root';
最后设置一下mysql的远程连接
mysqladmin -u root -proot登录后 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
检查一下user表中是否有空项,根据表内容不同,给空值填入密码。
set password for root@localhost = password('root');
quit;
退出以后,重启mysql服务,登录。
systemctl restart mysqld
mysql -uroot -proot
在****cdh00****中创建CM所需要的数据库。
(1)集群监控数据库
create database amon DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
(2)hive数据库
create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
(3)oozie数据库
create database oozie DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
(4)hue数据库
create database hue DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
最后别忘了给所有节点导入一下mysql的驱动jar,不管哪个版本都要统一名称。
/usr/share/java/mysql-connector-java.jar
*3.安装jdk*
java -version
先查看一下jdk的版本。
自带的openjdk没有jps,很难受,卸载掉安装自己的jdk。
yum -y remove java-1.8.0-open*
rz上传jdk1.8的安装包,安装包去oracle官网下载,或者直接wget也可。
tar -xzvf解压,mv jdk1.8.0_151 /usr/jdk1.8.0_151
因为需要所有用户都能访问,所以不能图省事放在/root里了。
vim /etc/profile
在最后一行添加:wq保存退出
export JAVA_HOME=/usr/jdk1.8.0_151
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/sbin
路径根据自己的jdk解压名配置,然后a重新载入环境变量。
source /etc/profile
测试一下配置。
java -version
CDH5默认的jdk路径是/usr/java/default,要么你把路径迁过去再修改环境变量,也可以做一个软连接。
mkdir -p /usr/java/default
ln -s /usr/jdk1.8.0_151/* /usr/java/default/
*4.CM安装5.14.0*
结果官网提供了个龟速链接,8kb/s速度2G的内容。注意下载的时候需要版本对应,el567分别对应centos5,centos6,centos7。版本不对必定安装失败。
*解压*
rz上传安装包至CDH00。tar -xzvf cloudera-manager-el6-cm5.14.0_x86_64.tar.gz解压。
把文件夹移动到/opt下,方便其他用户使用mv cm-5.14.0/ /opt/cloudera-manager/
*配置CMAgent*
vim /opt/cloudera-manager/etc/cloudera-scm-agent/config.ini
修改以下两条内容,将CM服务器设置为cdh00,端口号7182。
[General]server_host=cdh00server_port=7182
*配置CM数据库*
进入cd /usr/share/java目录下,rz导入mysql的驱动包,我这里使用的是5.1.40版本。
驱动包改名为
mv /usr/share/java/mysql-connector-java-5.1.40-bin.jar /usr/share/java/mysql-connector-java.jar
在mysql中创建CM库。
/opt/cloudera-manager/share/cmf/schema/scm_prepare_database.sh mysql cm -hlocalhost -uroot -proot --scm-hostcdh00 scm scm scm
这里使用localhost是因为scm只有localhost的连接权限,使用cdh00需要重新配置权限比较麻烦。
分发安装包
scp -r /opt/cloudera-manager/ cdh01:/opt/
scp -r /opt/cloudera-manager/ cdh02:/opt/
scp -r /opt/cloudera-manager/ cdh03:/opt/
*所有节点创建用户*
useradd --system --home=/opt/cloudera-manager/run/cloudera-scm-server --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
*在Server节点下配置Parcel-repo 目录*
mkdir /opt/cloudera/
mkdir /opt/cloudera/parcel-repo
给创建的cloudera-scm用户权限
chown cloudera-scm:cloudera-scm /opt/cloudera/parcel-repo
*导入静态资源包*
cd /opt/cloudera/parcel-repo/
rz命令导入静态资源,懒得导入也可以
wget https://archive.cloudera.com/cdh5/parcels/5.14.0/CDH-5.14.0-1.cdh5.14.0.p0.24-el7.parcel &后台慢慢下载。
*注意资源名称最后的el7是兼容的centos版本,我是centos7.6,所以需要el7版本的。*
manifest.json
CDH-5.12.1-1.cdh5.14.0.p0.24-el7.parcel
CDH-5.12.1-1.cdh5.14.0.p0.24-el7.parcel.sha1
并将改名为
mv CDH-5.14.0-1.cdh5.14.0.p0.24-el7.parcel.sha1 CDH-5.14.0-1.cdh5.14.0.p0.24-el7.parcel.sha
在所有agent节点上创建文件夹并授予权限
mkdir -p /opt/cloudera/parcels
chown cloudera-scm:cloudera-scm /opt/cloudera/parcels
*启动CM服务*
*直接启动*
在Server节点(cdh00)上
/opt/cloudera-manager/etc/init.d/cloudera-scm-server start
在工作节点上(所有节点)
/opt/cloudera-manager/etc/init.d/cloudera-scm-agent start
显示启动失败,查看一下日志文件
/opt/cloudera-manager/log/cloudera-scm-agent/
提示/usr/bin/env: python2.6: No such file or directory
Python -V查看一下python的版本,发现默认安装了2.7.5。
可以选择2.6和2.7两个版本共存,也可以直接卸载2.7.5(不推荐)
*出大问题*
若想卸载现有的版本
rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps
然后清除依赖
whereis python |xargs rm -frv
验证一下,如果无结果说明卸载干净
whereis python
在卸载前没有注意环境没有gcc编译,下载了python包以后不能编译,然后没有python又不能进行yum安装gcc,陷入了死循环。
解决方法:
卸载全部python和yum,下载rpm安装包重新安装。
mkdir /opt/site_package
mkdir /opt/site_package/python3
cd /opt/site_package/python3
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/libxml2-python-2.9.1-6.el7_2.3.x86_64.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/python-libs-2.7.5-68.el7.x86_64.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/python-ipaddress-1.0.16-2.el7.noarch.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/python-backports-1.0-8.el7.x86_64.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/python-2.7.5-68.el7.x86_64.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/python-iniparse-0.4-9.el7.noarch.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/python-pycurl-7.19.0-19.el7.x86_64.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/python-urlgrabber-3.10-8.el7.noarch.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/python-setuptools-0.9.8-7.el7.noarch.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/python-kitchen-1.1.1-5.el7.noarch.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/python-chardet-2.2.1-1.el7_1.noarch.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/rpm-python-4.11.3-32.el7.x86_64.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/yum-utils-1.1.31-45.el7.noarch.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/yum-3.4.3-158.el7.centos.noarch.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/yum-plugin-aliases-1.1.31-45.el7.noarch.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/yum-plugin-protectbase-1.1.31-45.el7.noarch.rpm
wget http://vault.centos.org/7.5.1804/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-45.el7.noarch.rpm
rpm -Uvh --replacepkgs python*.rpm
rpm -aq|grep yum|xargs rpm -e --nodeps
rpm -Uvh --replacepkgs rpm-python*.rpm yum*.rpm --force --nodeps
然后进行更新yum源
yum makecache yum update
然后进行yum安装的时候有可能会报错
GPG key retrieval failed: [Errno 14] curl#37 -
"Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-7"
缺少key装一个就可以了
rpm --import /etc/pki/rpm-gpg/RPM*
然后我们开始编译python
先安装相关的依赖包
yum groupinstall "Development tools" -y
yum install zlib-devel -y
yum install bzip2-devel -y
yum install openssl-devel -y
yum install ncurses-devel -y
yum install sqlite-devel-y
yum install gcc -y
从官网下载pyhton2.6.8的包,官网比较慢需要等。
wget https://www.python.org/ftp/python/2.6.8/Python-2.6.8.tgz //下载
tar -xzvf Python-2.6.8.tgz //解压
cd Python-2.6.8 //进入目录
./configure //配置源码
make //编译
make altinstall //安装
默认安装在/usr/local/bin/python2.6
最后配置一下python的链接
ln -sf /usr/local/bin/python2.6 /usr/bin/python
python -V查看一下版本
如果需要python2.7则可以python2.7 -V
*再次启动*
发现还是faild,再次查看日志文件。
嗯,这个问题是下载错了包,没看清下载了cloudera-manager-el6-cm5.14.0_x86_64.tar.gz是centos6的版本,重新下载CentOS版本就好了(╯‵□′)╯︵┻━┻,还是要从官网龟速下载,一切重来。
集群启动成功。
*配置集群*
访问cdh00:7180进入管理web,账号/密码:admin/admin
登录后选择免费模式,并进行集群加载。注意这里如果是再次安装的时候需要先把主机从其他集群中删除,点击logo->主机->从集群中删除
*安装节点*
*配置静态资源*
选择已经下载好的parcel包,并且要求版本兼容。
在集群安装过程中,有可能会出现某个节点主机运行不良,这种情况先停止掉该主机的agent服务,再进入CM的安装文件目录,删除/opt/cloudera-manager/lib/cloudera-scm-agent/cm-guid,再重新启动agent
别问,问就是全都要。
*集群的进程分配*
主要思路就是负载均衡,cdh00要支持CM还要负责mysql数据存储,所以尽量不分配主进程。
进程 | cdh00 | cdh01 | cdh02 | cdh03 |
Hbase | Regionserver | Regionserver | Regionserver | Regionserver |
HMaster | ||||
HDFS | Datanode | Datanode | Datanode | Datanode |
Namenode | Balancer | Secondarynamenode | ||
Hive | Gateway | Gateway | Gateway | Gateway |
Hiveserver2 | Hivemetastoreserver | |||
Hue | Hueserver | Loadbalancer | ||
Impala | Catalogserver | Statestore | ||
Daemon | Daemon | Daemon | Daemon | |
KVStoreindexer | LilyIndexer | |||
CMServer | Monitor | Publisher | ||
Oozie | OozieServer | |||
Solr | SolrServer | |||
Spark | historyServer | |||
Gateway | Gateway | Gateway | Gateway | |
Yarn | Resourcemanager | JobHistoryServer | ||
NodeManager | NodeManager | NodeManager | NodeManager | |
Zookeeper | Server | Server | Server | Server |
*进程WEB访问表*
CM | cdh00:7180 |
HDFS | cdh01:50070 |
Yarn | cdh00:8088 |
Hbase | cdh02:60010 |
Oozie | cdh03:11000 |
Hue | cdh01:8888 |
*数据库配置*
在之前安装mysql的时候我们就已经创建好了,按照配置好的名称写入,注意mysql只在cdh00中安装过。
如果提示jdbc问题就是jar包未找到,确认一下是否导入jar包或者名字是否正确。其他错误具体问题具体分析。
集群配置没什么需要修改的,统一默认情况就可以。
*等待集群启动*
这里注意yarn默认只给1G配置内存,spark要求至少2G,所以需要修改配置
Yarn->配置->搜索->
yarn.scheduler.maximum-allocation-mb->5G
yarn.app.mapreduce.am.resource.mb->5G
yarn.nodemanager.resource.memory-mb->5G
理论上大于2吉字节即可,根据集群性能自行调配。修改配置之后需要重启yarn集群。
*测试集群*
*本地测试*
集群启动成功,运行spark程序测试,apache的sparkexample不能用的,需要使用CDH版的sparkexample。
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local \
/opt/cloudera/parcels/CDH-5.14.0-1.cdh5.14.0.p0.24/lib/spark/examples/lib/spark-examples-1.6.0-cdh5.14.0-hadoop2.6.0-cdh5.14.0.jar
这里的目录是CDHspark的安装目录,一般都在pacels目录里。
有可能会出现这种错误
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
这个说明spark自动生成的配置文件有问题,需要自己配置。修改前记得备份,万一改错了还能还原。
cd /opt/cloudera/parcels/CDH-5.14.0-1.cdh5.14.0.p0.24/lib/spark/conf
cp spark-env.sh spark-env.sh.ex
vim /opt/cloudera/parcels/CDH-5.14.0-1.cdh5.14.0.p0.24/lib/spark/conf/spark-env.sh
//以下是自动生成的默认配置,检查目录是否错误
//以下是自动生成的默认配置,检查目录是否错误
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:$SPARK_LIBRARY_PATH/spark-assembly.jar"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/hadoop/lib/*"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/hadoop/*"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/hadoop-hdfs/lib/*"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/hadoop-hdfs/*"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/hadoop-mapreduce/lib/*"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/hadoop-mapreduce/*"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/hadoop-yarn/lib/*"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/hadoop-yarn/*"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/hive/lib/*"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/flume-ng/lib/*"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/parquet/lib/*"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/avro/*"
主要检查这个命令行,发现这些目录都不是hadoop组件的安装目录,实际安装目录在/opt/cloudera/parcels/CDH-5.14.0-1.cdh5.14.0.p0.24/lib/下,改成实际安装目录即可。
*Yarn测试*
再换用yarn模式启动一下。
spark-submit \--class org.apache.spark.examples.SparkPi \--master yarn \/opt/cloudera/parcels/CDH-5.14.0-1.cdh5.14.0.p0.24/lib/spark/examples/lib/spark-examples-1.6.0-cdh5.14.0-hadoop2.6.0-cdh5.14.0.jar
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x
他报了个文件权限的问题,/user目录root用户无权限访问,果断给个hadoop fs -chmod 777 /user
结果说我root用户无权更改?????
没事,先登录cdh01:50070查看一下哪个用户敢拒绝我root的访问。
是这个叫hdfs的东西,那就su hdfs切换用户,再hadoop fs -chmod 777 /user,完美。
如果报yarn.scheduler.maximum-allocation-mb之类的错误就是前面提到的内存分配太小,更改配置以后重启yarn。
集群正常运行,在web端会报异常,程序员都知道异常等于正常,我这里hue的Load balancer报错了,负载均衡的进程罢了,问题不大不影响使用。如果觉得异常不好看可以选择抑制。
这样就不再监测这个问题,抑制几个不重要的异常无所谓,重要异常不可以忽略。
*5.安装kafka*
*下载静态parcel包*
Parcel中默认是没有kafka的,需要安装集群后手动安装。
CDH提供的kafka链接很慢,建议自行下载安装。CDH自带的下载链接:
*CDH提供的链接*
点击主机->parcel->KAFKA->下载
*自行下载安装*
yum install httpd -y //安装httpd服务
systemctl start httpd
systemctl enable httpd
移动到httpd的资源目录下
cd /var/www/html
mkdir kafka_parcel
cd kafka_parcel
在目录下进行kafka的下载,也可以提前下载好rz导入。
wget http://archive.cloudera.com/kafka/parcels/4.1.0/KAFKA-4.1.0-1.4.1.0.p0.4-el7.parcel &wget http://archive.cloudera.com/kafka/parcels/4.1.0/KAFKA-4.1.0-1.4.1.0.p0.4-el7.parcel.sha1 &wget http://archive.cloudera.com/kafka/parcels/4.1.0/manifest.json &
别忘了把sha1改成sha
*配置本地链接库*
访问http://cdh00:80/kafka_parcel/查看资源目录
点击主机->Parcel->配置->添加url,把httpd的资源目录粘贴进去。
然后再资源列表中就可以看到kafka,点击下载->分配->激活
*安装分配*
点击主logo->添加服务
分配4个broker即可
在zookeeper中添加kafka的数据节点,其余默认。
Kafka安装有可能报错deploy client configuration fail,这有可能是JAVA_HOME的问题,重新配置一下,或者也有可能是软连接没设置好,CDH去默认路径找jdk没找到,重新设置一下jdk软连接。
Kafka启动失败Service has only 0 Kafka Broker roles running instead of minimum required 1解决不了,mdzz,我选择手动安装。
最新发现解决方案,有可能是配置的JVM虚拟内存不够,配置搜索memory,修改java heap size of broker为1G。
点击logo返回主页->kafka->配置->搜索memory,确实默认分配的太小,改为1G。点击实例->全选->启动。
*6.总结*
啊这,没想到我被JVM内存难倒了一整天。
然后其他的组件就根据自己需要自行安装了,大部分的大数据组件在parcel静态资源下都有,CDH相对比apache方式安装省事了很多,除了下载速度慢以外,其他都是一键配置,不需要繁琐的授权、修改配置文件之类的复杂、机械化操作,节省了很多时间。Apache模式安装的问题主要出在配置上,手工配置容易出错,使用CDH安装主要问题出在版本匹配上,务必注意系统和CDH的版本是否匹配,版本兼容问题解决以后,其他问题基本都迎刃而解。