CDH集群搭建全量文档
很快公司申请下来了一批非常牛逼的机器作为新的生产环境,老的节点机器考虑后续回收。。。
接下来就要展示本次CDH的开发环境的全部制作情况,如果有任何的疑问,请留言告知我改正,基本上遇到的坑也都在本文档中有所处理,接下来,就是所有文档。
同学给的文档
https://blog.csdn.net/dongyunlon/article/details/79755791
离线的
https://www.cnblogs.com/CaptainLin/p/7089766.html
cdh完美卸载文档
https://blog.csdn.net/weixin_35852328/article/details/81774627
秘钥:
https://blog.csdn.net/u010003835/article/details/85006786
https://blog.csdn.net/u010003835/article/details/85007946
useradd --system --home=/opt/cm-5.8.0/run/cloudera-scm-server --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
这篇文章比较吊!!!
https://www.jianshu.com/p/d2c524ec0d1b
可行的。。。
这个也很吊。。。
http://www.aboutyun.com/thread-9075-1-1.html
照样给的好像也不错
https://www.cnblogs.com/CaptainLin/p/7089766.html
文档记录:
1.Starting cloudera-scm-server: [失败]
service --status -all
cloudera-scm-server 已死,但 pid 文件仍存
以下为全部安装3变都成功的自己爬坑的文档了。
1.jdk安装与配置
yum -y install java-1.8.0-openjdk-devel.x86_64
修改/etc/profile并且source /etc/profile
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export JRE_HOME
export PATH
export CLASSPATH
2.用一下阿里的yum源
yum install -y lrzsz
https://opsx.alibaba.com/mirror
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
172.16.1.117 node1
172.16.1.118 node2
172.16.1.119 node3
3.关闭防火墙
注意: 需要在所有的节点上执行,因为涉及到的端口太多了,临时关闭防火墙是为了安装起来更方便,安装完毕后可以根据需要设置防火墙策略,保证集群安全。
关闭防火墙:
service iptables stop (临时关闭)
chkconfig iptables off (重启后生效)
关闭SELINUX(实际安装过程中发现没有关闭也是可以的,不知道会不会有问题,还需进一步进行验证):
setenforce 0 (临时生效)
修改 /etc/selinux/config 下的 SELINUX=disabled (重启后永久生效)
CentOS 7.0
一、配置防火墙,开启80端口、3306端口
默认使用的是firewall作为防火墙,这里改为iptables防火墙。
1、关闭firewall:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
4.所有节点配置NTP服务
集群中所有主机必须保持时间同步,如果时间相差较大会引起各种问题。 具体思路如下:
master节点作为ntp服务器与外界对时中心同步时间,随后对所有datanode节点提供时间同步服务。
所有datanode节点以master节点为基础同步时间。
所有节点安装相关组件:yum install ntp。完成后,配置开机启动:chkconfig ntpd on,检查是否设置成功:chkconfig --list ntpd其中2-5为on状态就代表成功。
centos 7 systemctl enable ntpd systemctl is-enabled ntpd
主节点配置
位置/etc/ntp.conf
在配置之前,先使用ntpdate手动同步一下时间,免得本机与对时中心时间差距太大,使得ntpd不能正常同步。这里选用202.112.10.36作为对时中心,ntpdate -u 202.112.10.36。
最好是是用清华大学的
ntpdate -u 210.72.145.44
ntp服务只有一个配置文件,配置好了就OK。 这里只给出有用的配置,不需要的配置都用#注掉,这里就不在给出:
driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict -6 ::1
restrict default nomodify notrap
server cn.ntp.org.cn prefer
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
配置文件完成,保存退出,启动服务,执行如下命令:1 service ntpd start
2 centos7 systemctl start ntpd ntpstat
检查是否成功,用ntpstat命令查看同步状态,出现以下状态代表启动成功:
synchronised to NTP server () at stratum 2
time correct to within 74 ms
polling server every 128 s
如果出现异常请等待几分钟,一般等待5-10分钟才能同步。
配置ntp客户端(所有datanode节点)
driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict -6 ::1
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
#这里是主节点的主机名或者ip
server n1
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
ok保存退出,请求服务器前,请先使用ntpdate手动同步一下时间:ntpdate -u n1 (主节点ntp服务器)
这里可能出现同步失败的情况,请不要着急,一般是本地的ntp服务器还没有正常启动,一般需要等待5-10分钟才可以正常同步。启动服务:service ntpd start
因为是连接内网,这次启动等待的时间会比master节点快一些,但是也需要耐心等待一会儿。
所有机器改成北京时间的方法:
在国外主机上将Linux系统时间修改为北京时间的方法
[root@centos ~]#date
Sun Aug 14 23:18:41 EDT 2011
[root@centos ~]# rm -rf /etc/localtime
[root@centos ~]# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@centos ~]# date
Mon Aug 15 11:20:00 CST 2011
5.centos 7 mysql
参考:
https://www.cnblogs.com/ianduin/p/7679239.html
root / MyNewPass4!
cd /opt
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
yum localinstall mysql57-community-release-el7-8.noarch.rpm
检查mysql源是否安装成功
shell> yum repolist enabled | grep "mysql.*-community.*"
yum install mysql-community-server
systemctl start mysqld
systemctl status mysqld
开机启动:
systemctl enable mysqld
systemctl daemon-reload
mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码。通过下面的方式找到root默认密码,然后登录mysql进行修改:
shell> grep 'temporary password' /var/log/mysqld.log
shell> mysql -u root -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database report_manager DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database ozzie DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database hue DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database cm_server DEFAULT CHARACTER SET utf8;
grant all on *.* TO 'root'@'%' IDENTIFIED BY 'MyNewPass4!';
flush privileges;
systemctl restart mysqld
6.下载yum源
参考:
https://archive.cloudera.com/cm5/redhat/7/x86_64/cm/cloudera-manager.repo
放到每个节点的
/etc/yum.repos.d/
7.然后配置cdh数据库
下载(时间很久耐心等待):
sudo yum install cloudera-manager-daemons cloudera-manager-server -y
配置mysql连接的bin.jar
可以去这里下载:
http://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.21
我用的是 mysql-connector-java-5.1.34-bin.jar
将mysql-connector-java-5.1.34-bin.jar放到 如下目录
/usr/share/cmf/lib/
格式:/usr/share/cmf/schema/scm_prepare_database.sh database-type [options] database-name username password
执行:
/usr/share/cmf/schema/scm_prepare_database.sh mysql cm_server root MyNewPass4!
应该会看到成功。
[ main] DbCommandExecutor INFO Successfully connected to database.
All done, your SCM database is configured correctly!
8.每台服务器安装 agent
下载(时间很久耐心等待):
sudo yum install cloudera-manager-agent cloudera-manager-daemons -y
vim /etc/cloudera-scm-agent/config.ini
hostname写成主服务器
执行:
sudo service cloudera-scm-agent start # 所有服务器
sudo service cloudera-scm-server start # Cloudera Manager Server服务器
稍后几分钟,等待Cloudera Manager Server启动成功。在Cloudera Manager Server服务器上。可以查看/var/log/cloudera-scm-server/cloudera-scm-server.log日志,观察启动的过程。如果出错,请参考Troubleshooting Installation and Upgrade Problems。
解决问题的地方:
https://www.cloudera.com/documentation/enterprise/latest/topics/cm_ig_troubleshooting.html
请一定注意两点,
1.一定要等几分钟,看到日志里面已经启动了7180端口才行
2.一定确定每个节点的主机名已经更改,我是更改了之后,重启机器才行,不然主机名称不对!切记!
9.配置
http://172.16.1.242:7180/cmf/login
默认的用户名和密码均为admin:
一路选择到了一个地方报错。
安装失败。 无法接收 Agent 发出的检测信号。
参考文档: https://www.oschina.net/question/3964891_2287725
cat /etc/hosts
cat /etc/hostname
cat /etc/sysconfig/network
10.遇到问题卡在了44%
自己上传
将CHD5相关的Parcel包放到主节点的/opt/cloudera/parcel-repo/目录中(parcel-repo需要手动创建)。
相关的文件如下:
*-el6.parcel
*-el6.parcel.sha1
manifest.json
最后将CDH-5.1.3-1.cdh5.1.3.p0.12-el6.parcel.sha1,重命名为CDH-5.1.3-1.cdh5.1.3.p0.12-el6.parcel.sha,这点必须注意,否则,系统会重新下载CDH-5.1.3-1.cdh5.1.3.p0.12-el6.parcel文件。
相关启动脚本
sudo service cloudera-scm-agent restart # 所有服务器
sudo service cloudera-scm-server restart # Cloudera Manager Server服务器
我们启动的其实是个service脚本,需要停止服务将以上的start参数改为stop就可以了,重启是restart。
然后在集群管理页面有一个,选择移除资源,选英文的那个选项里,然后重新搜索机器,想要出线页面就得等到management 重启即可。。。。
报错:
Exhausted available authentication methods
重新尝试安装失败的主机即可
11.安装配置过程中需要创建很多mysql数据库配置
create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database report_manager DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database oozie DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database hue DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
grant all privileges on *.* to 'root'@'node1' identified by 'MyNewPass4!' with grant option;
flush privileges;
配置报错邮件服务
public static final String MAIL_TO ="[email protected]";
public static final String MAIL_FROM ="[email protected]";
public static final String MAIL_PASSWORD ="BDserver110*";
public static final String MAIL_SMTPHOST ="smtphm.qiye.163.com";
注意hive创建源数据可能会报错,因为
终于到安装各个服务的地方了,注意,这里安装Hive的时候可能会报错,因为我们使用了MySql作为hive的元数据存储,hive默认没有带mysql的驱动,通过以下命令拷贝一个就行了:
cd /opt/cloudera/parcels/CDH-5.1.3-1.cdh5.1.3.p0.12/lib/hive/lib/
上传一下就行了
可能oozie也需要上传一下,
cd /opt/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/oozie/lib
除此以外还要
对于在oozie里放置Mysql驱动包的总结
根据网上的参考以及我个人经验安装的使用
(1)放一份到/opt/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/oozie/libext下 (是 mysql-connector-java-5.1.21.jar)(这里放到bigdatamaster节点)
(2)放一份到$OOZIE_HOME/lib下 (是 mysql-connector-java-5.1.21.jar)(这里放到bigdatamaster节点)
(3)放一份到/usr/share/java/下(一定要重命名,mv mysql-connector-java-5.1.21-bin.jar mysql-connector-java.jar)(这里放到bigdatamaster节点)
(4)放一份到 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/jre/lib/ext (这里放到bigdatamaster节点、bigdataslave1节点和bigdataslave2节点)
(5)放一份到$OOZIE_HOME/oozie-server/lib下 (是 mysql-connector-java-5.1.21.jar)(这里放到bigdatamaster节点)
oozie用不用都无所谓后面我们可以使用azkaban
12 hue
用户名和密码,,,设置一下 admin 、 admin
13 spark是否会有问题,开始搞起来。。。
配置比较简单,搞定之后可能需要重启一下。
14 集群组件测试用例运行
hive、hue直接用即可
hadoop的话:
sudo -u hdfs hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar pi 10 100
spark的话:
集群上面直接输入spark-shell
15. centos7 swap 扩容
需要停止机器
但是报错:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 716177408, 0) failed; error='Cannot allocate memory' (errno=12)
查看内容使用情况:
命令行输入:top
1.添加swap分区
dd if=/dev/zero of=/var/swapfile bs=1024 count=8096k
2.执行完毕,对交换文件格式化并转换为swap分区:
mkswap /var/swapfile
3.挂载并激活分区:
swapon /var/swapfile
4 赋权限
chmod -R 0600 /var/swapfile
5.设置开机自动挂载该分区:
vi /etc/fstab
在fstab文件末尾追加如下内容后:wq!保存即可:
/var/swapfile swap swap defaults 0 0
重启一下机器吧。
16. 一些常见的配置信息
注意:一些常见的cdh解决问题,可以参考这篇文章。
https://blog.csdn.net/zzq900503/article/details/53393721
(1)
问题:
hdfs
副本不足的块监控阈值
原因:
原因是设置的副本备份数与DataNode的个数不匹配。
我们在之前理论篇中已经说明了dfs. replication属性默认是3,也就是说副本数---块的备份数默认为3份。
hadoop基础----hadoop理论(三)-----hadoop分布式文件系统HDFS详解
但是我们这里集群只有两个DataNode。
所以导致了达不到目标---副本备份不足。
解决办法:
解决方法
这种情况下的修复有2个步骤,1是设置目标备份数为2,2是通过命令更改当前备份数。
副本不足和副本过多都可以用这2个步骤解决,主要是跟DataNode的个数对应。
设置目标备份数为2
点击集群-HDFS-配置
搜索dfs. replication,设置为2后保存更改。
dfs.replication这个参数其实只在文件被写入dfs时起作用,虽然更改了配置文件,但是不会改变之前写入的文件的备份数。
所以我们还需要步骤2
在cm0中通过命令更改备份数:
su - hdfs
hadoop fs -setrep -R 2 /
这里的-R 2的数字2就对应我们的DataNode个数。
好了,HDFS也绿了。
(2)
问题,启动spark-shell
报错:Required executor memory (1024+384 MB) is above the max threshold (1024 MB) of this cluster!
程序运行需要请求(1024+384 MB) 但是我们最大阈值为1024,需要调大内存才可以
解决方法:
修改yarn.scheduler.maximum-allocation-mb 和 yarn.nodemanager.resource.memory-mb的默认值为2G
然后重启集群
(3)
使用spark-shell报错:
Error initializing SparkContext. org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x
root没有用spark的权限呢,要复权一下的。。。
(4)
hive报错
Hive Metastore canary创建数据库失败
cm修改hive配置
Hive Metastore 数据库密码
javax.jdo.option.ConnectionPassword
将该配置改成mysql的密码就行了。然后重启就行
在这两个地方放入bin.jar
/opt/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/hive/lib
/opt/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/hadoop
/usr/share/java/mysql-connector-java.jar(注意改名字)
问题定位:读取hive数据时报找不到mysql驱动
问题解决:
最终找到解决办法:
1.
原来是昨天通过CM页面修改hive的配置文件时,hive的
Hive Metastore 数据库密码
javax.jdo.option.ConnectionPassword
被修改成CM管理员账户的密码了,改成mysql数据的密码,问题解决ok
重启一下hive即可了
2.看日志说hdfs这个权限不够
/user/hue/.cloudera_manager_hive_metastore_canary
hdfs dfs -chmod 777 /user/hue/.cloudera_manager_hive_metastore_canary
(5)spark运行程序
运行example
cd /opt/cloudera/parcels/CDH/lib/spark/bin
./run-example SparkPi 10
可以运行的,但是引申出来如下巨大的坑问题。
(6)重启 hadoop yarn启动不了。
报错日志:
对角色 JobHistory Server (node1) 执行命令 启动此 JobHistory Server
Failed to start role.
那么来学习一下如何重启吧。
https://blog.csdn.net/u012071918/article/details/80599928
然后我们再来继续解决这个问题。
查看详细日志报错:
Service org.apache.hadoop.mapreduce.v2.hs.JobHistory failed in state INITED; cause: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Failed to intialize existing directories
可以看到报错日志有一部分是说:
Caused by: org.apache.hadoop.security.AccessControlException: Permission denied: user=mapred, access=READ_EXECUTE, inode="/user/history/done":root:hdfs:drwxrwx---
我们要去改一下目录权限才可以
看了日志,这个hdfs权限我是一路改到了底啊。。。
/user/history/done/2019/05/09/000000/job_1557458491086_0001_conf.xml
(7)zookeeper或者hdfs节点数不够
报警告原因:
Service zookeeper has 1 Server. Cloudera suggests at least 3 Server for ZooKeeper.
选择添加实例,然后多选择几个节点,重启即可。
17.spark2自定义安装
参考这篇文章
https://blog.csdn.net/Gavin_chun/article/details/78554277
一、下载
下载:
https://www.cloudera.com/documentation/spark2/latest/topics/spark2_packaging.html#packaging
http://archive.cloudera.com/spark2/parcels/2.2.0.cloudera1/
下载对应的包:
SPARK2_ON_YARN-2.2.0.cloudera1.jar
SPARK2-2.2.0.cloudera1-1.cdh5.12.0.p0.142354-el6.parcel
SPARK2-2.2.0.cloudera1-1.cdh5.12.0.p0.142354-el6.parcel.sha
manifest.json
二、准备
1、将SPARK2_ON_YARN-2.2.0.cloudera1.jar上传至/opt/cloudera/csd目录
注:要保证集群的本地描述符存储库路径是/opt/cloudera/csd
查看方式:CM主界面管理–>设置–>类别(本地描述符存储库路径)
2、将
SPARK2-2.2.0.cloudera1-1.cdh5.12.0.p0.142354-el6.parcel
SPARK2-2.2.0.cloudera1-1.cdh5.12.0.p0.142354-el6.parcel.sha
manifest.json
上传之后注意改下名字
上传至/var/www/html/spark2目录下,且保证http能够访问。
三、重启cloudera-scm-server 服务
service cloudera-scm-server restart
还要等一会儿才能进入这个页面哦
成功后进入CM界面,在添加服务里面会看到spark2的按钮。
四、可能需要激活
报错 客户端配置生成需要激活以下其他 Parcel:[spark2]。
但是当我们激活时,发现。
错误
SPARK2 (2.2.0.cloudera1-1.cdh5.12.0.p0.142354) 所需的 CDH (低于 5.14) Parcel 不可用。
看来需要下载更加高的版本了
五、换成2.4成功!需要添加服务
SPARK2 2.4.0.cloudera1-1.cdh5.13.3.p0.1007356
已分配, 已激活
您可以在此处自定义新服务的角色分配,但请注意,如果分配不正确(例如,分配到某个主机上的角色太多),性能受到影响。
1、点击集群按钮旁的添加服务
2、选择spark2 –>继续
3、选择依赖
4、角色分配(Gateway所有主机都要安装)
5、启动
将 Spark 2 服务添加到 Cluster 1
恭喜您!
您的新服务已安装在群集中并已配置。
注意:您可能仍必须启动新服务。建议您在执行此操作之前,先重启所有配置过时的依赖关系服务。可以通过单击下面的完成在主页面上执行这些操作。
然后我们su - hdfs
pyspark2就可以进入python的命令了
六、开发与demo
用yarn来跑用例
spark2-submit --class WordCount --master yarn --deploy-mode cluster --driver-memory 500m --executor-memory 500m --executor-cores 1 --queue default hzmt-demo.jar
准备执行:
spark2-submit --class voucher.VouchDev --master yarn --deploy-mode cluster --driver-memory 500m --executor-memory 500m --executor-cores 1 --queue default /root/spark/voucher.jar
我们来看一下demo
重点:
(1)
但是提交我们以前写的项目报错了
Exception in thread "main" org.apache.spark.SparkException: Application application_1557731445525_0005 finished with failed status
at org.apache.spark.deploy.yarn.Client.run(Client.scala:1171)
at org.apache.spark.deploy.yarn.YarnClusterApplication.start(Client.scala:1608)
查一下什么原因
spark2-submit --class voucher.VouchDev --master yarn --deploy-mode cluster --driver-memory 1g --executor-memory 1g --queue default /var/lib/hadoop-hdfs/spark/voucher.jar
(2)
我们参考控制台报错找到我们刚才用的节点node2的问题,来看下:
Final app status: FAILED, exitCode: 13, (reason: User class threw exception: java.lang.Illega
往后看
FAILED, exitCode: 13, (reason: User class threw exception: java.lang.IllegalArgumentException: System memory 466092032 must be at least 471859200. Please increase heap size using the --driver-memory
让我们增加内存。
(3)
增加完了内存可以了,但是抱一个新的错误了。我们来解决一下。
Exception in thread "main" org.apache.spark.SparkException: Application application_1557731445525_0013 finished with failed status
at org.apache.spark.deploy.yarn.Client.run(Client.scala:1171)
http://node1:8088/proxy/application_1557731445525_0013/
让我们打开这个看一下,报错。
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
应该是mysql的bin的jar没有打进去,我们idea的时候,用build点击+ 来增加jar的方式,将maven包打进去就可以了
(4)mail邮件服务问题
报错:
ERROR yarn.ApplicationMaster: User class threw exception: java.lang.NoClassDefFoundError: javax/mail/Address
java.lang.NoClassDefFoundError: javax/mail/Address
打包之后也还是这样。
这个暂时还是解决不了的。。。应该是和我的邮箱有关系吧。。。
(5)spark
写出来之后,汉字全部变成了问号?
解决办法:
jdbc:mysql://172.16.1.117:3306/database?useUnicode=true&characterEncoding=utf8
(6)设置参数尽量使用1g,用少了,或者用多了都会报错的。