一、实验背景
我们是四台电脑一起搭建Hadoop集群
A,B,C,D四个人个有一台电脑,分别在各自的电脑上安装虚拟机,虚拟机装centOS7。(我们建议主机namenode内存大一点8g,硬盘最好100g以上,其余节点2g,50g即可,下文会阐述原因)
系统:VMware下的centOS7
jdk:1.8.0_171 jdk-8u171-linux-x64.tar.gz(Oracle)
MySQL: mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar以及mysql-connector-java-5.1.42-bin.jar(老师云盘给的)
CDH: CDH-5.11.1-1.cdh5.11.1.p0.4-el7.parcel.sha1;
CDH-5.11.1-1.cdh5.11.1.p0.4-el7.parcel;
manifest.json;(手动新建的文件)
ClouderaManger:cloudera-manager-centos7-cm5.11.1_x86_64.tar.gz
所需要的资源下载地址:
parcels:http://archive.cloudera.com/cdh5/parcels
cloudera manager: https://archive.cloudera.com/cm5/cm/5/
java jdk: Java SE - Downloads | Oracle Technology Network | Oracle
二、实验步骤
泳道图
由于网上的教程众多,所以在这里总结了一下详细步骤
A.三台主机的虚拟机建立连接(ip设置)
最终达到效果
IP地址主机名说明
172.20.10.10node1主节点
172.20.10.2node2节点
172.20.10.12node3节点
172.20.10.14node4节点
并且最后 互相的虚拟机能够互相ping通
在最开始的时候我们尝试了使用了,来达到静态ip的目的,这样会使得后期维护集群,物理上的主机ip的改变并不会使得虚拟机需要重新配置。
但是在尝试的过程中,发现我们的ip地址虽然改变成了理想的静态ip,并且 能够上网,但是每台虚拟机之间却不能互相ping通,由于长期在这个问题拖慢了进度,而且没有找到问题,所以我们采用了桥接模式。
在使用桥接模式的时候,开始的时候也遇到了一些问题,不过所幸都解决了。
基本步骤:
每台电脑设置上网模式更改为桥接模式;
重启网络;
systemctl restart network;
遇到的问题:
①虚拟机无法上网
解决方法:更改网络的配置文件。
解决思路:发现无法上网之后,我们互相ping了一下,发现能够ping通,但是却ping不通百度,所以有可能是dns的问题,修改之后果然能够上网了。同时要注意的一个坑是,之前静态ip的时候吧下图的BOOTPROTO设置为static,现在记得改回来dhcp,并且重启网络restart,ifconfig检查一下网络,如果和自己主机是一个网段下面就说明是正确的。
B、安装jdk
1.卸载本身自带的jdk
[root@localhost ~]# rpm -qa | grep java
[root@localhost ~]# rpm -qa | grep java
tzdata-java-2014i-1.el7.noarch
java-1.7.0-openjdk-headless-1.7.0.71 -2.5.3.1 .el7_0.x86_64
java-1.7.0-openjdk-1.7.0.71 -2.5.3.1 .el7_0.x86_64
java-1.8.0-openjdk-headless-1.7.0.71 -2.5.3.1 .el7_0.x86_64
java-1.8.0-openjdk-1.7.0.71 -2.5.3.1 .el7_0.x86_64
删除上面的java包
rpm -e --nodeps $PACKGENAME
2.去官网下载jdk,然后放到对应/usr/java/,解压,最后修改配置文件即可。
配置文件:
vim /etc/profile
JAVA_HOME=/usr/java/jdk1.8.0_171
JRE_HOME=/usr/java/jdk1.8.0_171/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH
#source /etc/profile生效
#java –version
遇到的问题:到运行到CM安装界面的过程时候,发现了问题,他提示java版本不同。
需要值得注意的是,大家都按下java –version,现实的版本号一致,但是却被认为不同,这是由于,在官网下载的时候要么都下载为.rpm,要么都下载为.tar.gz格式,否则就会报这种错误,解决方法:删掉这个jdk,之后重新安装正确的版本。
C、修改主机节点名称,以及修改hosts文件
hostnamectl set-hostname node1
修改hosts
各个节点ifconfig,把对应的ip输入到下方的节点文件中
vim /etc/hosts
192.168.43.43 node1
192.168.43.29 node2
192.168.43.136 node3
192.168.43.39 node4
注意要添加一行:
127.0.0.1 localhost.node1(只需要node1设置这个)
否则在建立数据库的时候发现报错:
D、selinux关闭,防火墙关闭
[root@hadoop1~]# vim /etc/sysconfig/selinux
SELINUX=disabled
重启才能生效
重启后检查
[root@hadoop1~]#sestatus -v
SELinux status: disabled
表示已经关闭了
[root@hadoop1~]# systemctl stop firewalld
[root@hadoop1~]# systemctl disable firewalld
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
rm '/etc/systemd/system/basic.target.wants/firewalld.service'
[root@hadoop1~]# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled)
Active: inactive (dead)
E、NTP服务器设置(用于不同节点间实现时间同步)
这个在操作这个ntp服务,我们先把时区都选为上海时区,来达到时间同一的目的
NTP服务的安装和配置
[root@hadoop1~]#yum -y install ntp
更改master的节点
[root@hadoop1~]## vi /etc/ntp.conf
注释掉所有server ..*的指向,新添加一条可连接的ntp服务器(百度一下ntp服务器,我选的是上海交大的)
server ntp.sjtu.edu.cn iburst
在其他节点上把ntp指向master服务器地址即可(/etc/ntp.conf下)
server 192.168.160.130 iburst
所有节点
F、SSH无密码登录配置
每个节点执行ssh-keygen -t rsa;
出现的选项就一路按回车就好
然后每个节点执行
ssh-copy-id node1; 然后输入密码
ssh-copy-id node2; 然后输入密码
ssh-copy-id node3;
ssh-copy-id node4;
验证:输入ssh node1或者其他节点,如果不要输密码的话,就说明成功了。
G、安装mysql(主节点)
centos7自带的是mariadb,需要先卸载掉
[root@hadoop1]# rpm -qa | grep mariadb
mariadb-libs-5.5.41-2.el7_0.x86_64
[root@hadoop1 huxin]# rpm -e --nodeps mariadb-libs-5.5.41-2.el7_0.x86_64
将下载好的mysql rpm包拷贝到服务器上然后解压
cp mysql-mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar /usr/mysql/
解压后依次安装这四个包:
有Mysql相应的rpm文件, 只需要依次安装一下几个rpm即可。
mysql-community-common-5.7.18-1.el7.x86_64.rpm
mysql-community-libs-5.7.18-1.el7.x86_64.rpm
mysql-community-client-5.7.18-1.el7.x86_64.rpm
mysql-community-server-5.7.18-1.el7.x86_64.rpm
命令格式 如rpm –ivh mysql-community-common-5.7.18-1.el7.x86_64.rpm
安装完毕后启用mysql服务。
systemctl start mysqld
systemctl status mysqld
这种方式完成安装MySQL后,会自动随机生成一个原始密码。登录并修改密码,否则报密码过期错误。
cat /var/log/mysqld.log | grep password
2017-05-13T05:39:44.497086Z 1 [Note] A temporary password is generated for root@linuxvnode0: sjsO:Pin<5c_
使用上述密码登录MySQL
mysql -uroot -p
Enter password:
登录成功后:
mysql> SET PASSWORD = PASSWORD('Buct0000!');
Query OK, 0 rows affected, 1 warning (0.00 sec)
设置root授权访问以上所有的数据库,因为CM安装时会创建数据库,这里设置后安装CM时可以设置数据库的host为node1
mysql>grant all privileges on . to 'root'@'node1' identified by 'Buct0000!' with grant option;
mysql>flush privileges;
由于集群需要安装hive做为数据仓库,同时使用了Mysql作为Hive的存储方式,所以这里单独为hive建立一个库。
为hive建库hive
mysql>create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
此处须新建一个库与CM安装时建立的库分开,否则启动Hive时可能会报角色无法启动的错误。
设置开机后自动启用mysql服务。
systemctl enable mysqld
H、安装cloudera manger
三、安装Cloudera Manager
1.解压相应的文件cloudera-manager-centos7-cm5.11.1_x86_64.tar.gz 到/opt/目录下。
tar -zxvf cloudera-manager-centos7-cm5.11.1_x86_64.tar.gz -C /opt/
2.将mysql-connector-java-5.1.42-bin.jar放到/opt/cm-5.11.1/share/cmf/lib下并初始化数据库
cp mysql-connector-java-5.1.42-bin.jar /opt/cm-5.11.1/share/cmf/lib
/opt/cm-5.11.1/share/cmf/schema/scm_prepare_database.sh [-数据库类型] [-创建的数据库名] [-h主机名] [-u用户名] [-p密码]
/opt/cm-5.11.1/share/cmf/schema/scm_prepare_database.sh mysql cm5111 -hnode1 -uroot -pBuct0000! --scm-host node1 root Buct0000! scm
- 配置agent:
修改/opt/cm-5.11.1/etc/cloudera-scm-agent/config.ini文件修改server_host为主节点主机名。
- 每台服务器上执行命令创建scm用户
useradd --system --home=/opt/cm-5.11.1/run/cloudera-scm-server/ --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
- 将Agent同步到其他节点(这一步由于scp过慢,所以采用了每个节点都下载cm,然后解压到/opt/下的方法,这样的话就不用执行scp了)
scp -r /opt/cm-5.11.1 node2:/opt
scp -r /opt/cm-5.11.1 node3:/opt
scp -r /opt/cm-5.11.1 node4:/opt
scp -r /opt/cm-5.11.1 node5:/opt
- 将parcels安装包,sha,manifest.json放置到主节点/opt/cloudera/parcel-repo目录下。
- 执行相应的脚本,启动服务。
主节点启动 :
/opt/cm-5.11.1/etc/init.d/cloudera-scm-server start
所有节点启动 :
/opt/cm-5.11.1/etc/init.d/cloudera-scm-agent start
需要注意的是:server启动之后,主节点会变得十分十分卡,这是正常现象,请耐心等待,之后再打开CM安装页面
- 启动成功后输入node1:7180即可进入Cloudera Manager运维平台界面,初始密码为admin/admin.
(可能CM启动较久,需要一点时间才能进入,大概3—5mins,多等待一会) 进入后按照提示即可安装集群以及相应组件。
如若安装hive组件且使用Mysql类型的数据仓库,那么需要为hive增加MySQL connector
cp mysql-connector-java-5.1.42-bin.jar /opt/cloudera/parcels/CDH/lib/hive/lib/mysql-connector-java-5.1.42-bin.jar
四、CM界面配置集群
1.浏览器输入node1:7180/之后进入到集群配置页面。
2.选择部署的版本
3.继续下一步,选择安装的CM的版本
4.选择需要部署的主机
5.选择需要安装的CM(跟自己下载的percel文件对应,我下载的是5.11.1p0.4)
6.percel文件分发激活
7.检查器检查集群中主机环境
8.选择安装的CDH 5服务,这个根据需求选择,但是一些基本的服务必须选择,也可以自定义安装,这里选择含HBase的内核。
9.集群角色分配
(这里一般情况下默认即可,但是如果集群中某台电脑的配置严重不行的时候,建议少分配点任务)
10.数据库设置,这个要与前面的mysql中建立hive,oozie,hue相对应,如果之前没有建立的话,会报错,至于用户名,密码都可以填写。[if !vml]
通常hue会报这个错:
解决方法: CM要求MySQL安装对旧版本的库文件的支持,回到之前的mysql安装包解压后的文件夹,发现包含compat的两个.rpm包未安装。
安装两个包之后成功解决问题
11.审核更改(这一页默认即可,有需要的自己更改就行)
12.首次运行集群页面
需要注意的是,其实这一步骤会遇到很多错误,最好的解决方法---我建议---先简单阅读日志,后百度,实在不行详细阅读日志+google。我把自己遇到的问题以及解决方法贴出来,希望能够有绵薄帮助。
错误经历:
①在第一次安装的时候,卡在了第二步——正在部署客户端配置,一直在转圈。浏览器卡死
问题:node1,也就是主节点配置太差
解决方法:主节点尝试把虚拟机内存提升到4G(第一次装虚拟机的时候,默认配置导致1G内存,20G硬盘)
②第二次安装发现HBase启动失败,也就是HBase的第二步start失败。
解决方法:安装失败,重启虚拟机,删库重新安装。主要是重启虚拟机,这个HBase启动失败,retry(点击下方的重试键)是不能解决问题的
③第三次重新安装,发现第二步——zookeeper等等启动超时,这个很好解决,点击重试按钮即可
④然后发现HDFS格式化失败。
这个问题网上有很多说法,试了两个都失败了,自己看了看日志,结合网上的,去linux的根目录下,ls 发现存在dfs文件夹,删除即可,rm –rf dfs。之后点击下方的重试按钮,发现已经ok了。
⑤不幸的是,第6步——hive失败了。
解决这个问题真的是醉了。
刚开始读日志发现是JDBC的问题,而本次安装采用的JDBC,其实在mysql-connector-java.5.1.42.bin.jar里面。这意味这要把它放到某个地方。正确的做法很简单,命令行进入这个jar的目录下,cp 一份到/opt/cloudera/parcels/CDH/lib/hive/lib/
执行
cp mysql-connector-java-5.1.42-bin.jar /opt/cloudera/parcels/CDH/lib/hive/lib/mysql-connector-java-5.1.42-bin.jar
解决方法如此简单,为什么我还要说很难受呢,,这是因为尝试了无数次这样的操作都发现依然失败,最后发现我linux目录里的这个jar包居然是画着叉号的,也就是权限不够,无法打开,所以尝试chmod 777 文件 ,发现还是打着的,意识到不对劲,想起自己的这个jar包是上一次由于重装linux为了避免浪费时间下载各种包,使用VMtools先备份到windows下,之后又从windows拷回来的。然后又去官网下载了这个jar包,发现果然一切ok,真的是醉了。不想说话。VMtools在备份percel,cm等等包的时候不会出错,但是jar包会导致权限出错,请小心。而且使用VMtools,我不建议直接吧win下面的文件拖到linux下面,你会发现拖过去以后大小发生了很大的变化,建议在win下面右键复制,然后linux下面右键粘贴。VMtools安装也花费了一些时间,有需要的话,具体的安装请参考下文。
⑥然后发现oozie又出现了问题。
第一次oozie报的错误是关于JDBC的,发现它有一个步骤是,Copying JDBC jar
from /usr/share/java/mysql-connector-java.jar to /var/lib/oozie 。这个很好解决,把之前的那个mysql-connector-java-4.1.42.bin.jar
copy 一份到/usr/share/java/即可,命令就不给出了(注意没有叉号的)。
⑦当我们解决了oozie的JDBC的问题之后,又发现oozie又报错,真的是醉了。好吧,查看日志,发现他提示:
Check DBschema does not exist
大概意思就是oozie在刚刚失败了,但是它的初始化表 完成了,所以我们只需要
mysql –uroot –p 进入mysql
mysql>DROP DATABASE oozie; 删除oozie即可;
如果这条命令执行失败,那么试一下这个:
mysql>DROP schema oozie;
删除完之后必须还有重新建立一个,这样相当于把他清空,使得 初始化这个步骤 能够成功。
mysql> create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql>quit;
再次重试,发现完完全全的好了,能够初始化了。
⑧但是,不幸的是,oozie又双叒出错了。就是下面这个。这次的错误是
upload sharelib timeout
oozie上载共享库超时。这个的解决方法,百度上好像都没有,FQ去外面查,大概的解决方法有挺多种的,都试了一下,发现不能解决问题,于是继续读日志:
发现了两个值得关注的地方
Can't open /opt/cm-5.11.1/run/cloudera-scm-agent/process/42-oozie-OOZIE-SERVER-upload-sharelib/config.zip: 权限不够.
Can't open /opt/cm-5.11.1/run/cloudera-scm-agent/process/42-oozie-OOZIE-SERVER-upload-sharelib/proc.json: 权限不够.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-5.11.1-1.cdh5.11.1.p0.4/jars/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-5.11.1-1.cdh5.11.1.p0.4/jars/slf4j-simple-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Seehttp://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
然后开始的时候一直在纠结这个权限的事情,他确实会上锁(画着叉号,无法打开),但事实上,问题不在于这个,关键的问题在于下面的两个包冲突,他们包含了相同的类,发生了冲突,解决方法很简单,删除掉一个即可。这也给我带来了启示,读日志先读最后的可能会好一点,这可能是问题最大的地方。
我发现再删除完上面的一步中的文件后,还是报错,这主要是由于,我们三台虚拟机都连接的是手机的热点(要是路由器的话,我觉得速度会很快), 所以导致传输速度很慢,尝试着把oozie上传共享库的超时时间设置的长一点就ok了,他默认660s。改成1000,也在角色日志中发现,他确实是在不断上传,但是还是网络太慢,low upload,所以有设置的大了点,改成1500,最后终于成功。 其实解决oozie的超时问题可能需要多个方法一起来操作,可能也需要提升一下Namenode的性能(下方的namenode的java堆栈大小)所以具体的操作请参照下面的图片。
新打开一个浏览器窗口,输入如图的地址:node1:7180/cmf/home
第九步:
cd /opt/cloudera/parcels/CDH-5.11.1-1.cdh5.11.1.p0.4/jars/
rm slf4j-simple-1.7.5.jar!
13.安装完成
14.失败重装。
在安装的过程中,可能会遇到失败当你进入到CM安装的界面,也就是浏览器的node1:7180的时候,如果中途安装失败(有哪一步一直错误,最后重启电脑,或者关掉浏览器,都叫做 这一次安装失败),此时就需要删除数据库,重新安装,不然你会直接进入CM的管理界面。
1.停止所有cloudera-scm-agent服务 和cloudera-scm-server服务
/opt/cm-5.11.1/etc/init.d/cloudera-scm-agent stop
/opt/cm-5.11.1/etc/init.d/cloudera-scm-server stop
- 删除cmf 数据库,然后重新建立cmf数据库
mysql –uroot –p
mysql>drop cm5112; (自己建立的数据库)
mysql>drop hive;
mysql>drop hue;
mysql>drop oozie;
mysql>create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql>create database hue DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql>create database oozie DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql>quit
- 每台服务器上删除数据:
rm -rf /opt/cm-5.11.1/lib/cloudera-scm-agent/*
(每台服务器上都执行)
如果删除不了执行以下命令再删除:
sudo umount /opt/cm-5.13.0/run/cloudera-scm-agent/process
- 执行数据库初始化
/opt/cm-5.11.1/share/cmf/schema/scm_prepare_database.sh mysql cm5111 -node1 -uroot -pBuct0000! --scm-host node1 root Buct0000! scm
(node1机器上执行)
[if !supportLineBreakNewLine]
[endif]
- 重启服务
/opt/cm-5.11.1/etc/init.d/cloudera-scm-server start
/opt/cm-5.11.1/etc/init.d/cloudera-scm-agent start
- 开始安装
五、实验验证结果 word count试跑
CDH搭建好之后,其实它自带wordcount的jar包,我们要做的其实只是把我们写好的words.txt传到hadoop系统上即可。
步骤:
1、首先为当前用户在HDFS 创建一个工作目录,并赋予相应的权限。
1.1由于我安装的时候是用的root用户,因此也就需要在hdfs中为root用户创建工作目录,并授予权限。
(1)首先在HDFS中,在用户目录/user/下创建一个root用户文件夹,作为root用户的工作目录。执行如下代码:
sudo -u hdfs hadoop fs –mkdir /user/root
(2)授予/user/root目录相应的权限
1)先将该目录的所有权赋给root用户:
sudo -u hdfs hadoop fs –chown root /user/root
2)再将该目录的组的权限赋给root用户自己管理:
sudo -u hdfs hadoop fs –chgrp root /user/root
3)最后设置该目录的权限:
sudo -u hdfs Hadoop fs –chmod 777 /user/root
(该权限是拥有者:可读可写可执行;组用户:可读可写可执行;其他用户:可读可写可执行)
1.2、给普通用户创建HDFS工作目录,并授予权限。普通用户与root方法类似,只不过这个过程是需要在root用户下执行的。
2、本地任意地方创建words文件,并把该文件上传到hadoop中。
#vim words
#hadoop fs –put words /user/root/input
3、测试WordCount例子。
执行测试用例
通过CDH自身的jar来测试,该jar是在/opt/cloudera/parcels/CDH/jars/hadoop-examples.jar包。然后通过在界面执行如下命令:
hadoop jar /opt/cloudera/parcels/CDH/jars/Hadoop-examples.jar wordcount /user/root/input /user/root/output
4、查看结果
hadoop fs –cat /user/root/output/part-r-00000
hadoop fs –cat /user/root/output/part-r-00001
以上代码需要注意的是/user/root/output必须是未存在的。mapreduce运行完之后,会自动创建。
[if !vml]
[endif]
运行程序
hadoop jar /opt/cloudera/parcels/CDH/jars/Hadoop-examples.jar wordcount /user/root/input /user/root/output
这个输入文件夹output不能提前存在,否则会报错
结果正确: