CentOS7下安装CDH,clouderamanager,hadoop

一、实验背景

我们是四台电脑一起搭建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

  1. 配置agent:

修改/opt/cm-5.11.1/etc/cloudera-scm-agent/config.ini文件修改server_host为主节点主机名。

  1. 每台服务器上执行命令创建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

  1. 将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

  1. 将parcels安装包,sha,manifest.json放置到主节点/opt/cloudera/parcel-repo目录下。
  2. 执行相应的脚本,启动服务。

主节点启动 :

/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安装页面

  1. 启动成功后输入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

  1. 删除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

  1. 每台服务器上删除数据:

rm -rf /opt/cm-5.11.1/lib/cloudera-scm-agent/*

(每台服务器上都执行)

如果删除不了执行以下命令再删除:

sudo umount /opt/cm-5.13.0/run/cloudera-scm-agent/process

  1. 执行数据库初始化

/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]

  1. 重启服务

/opt/cm-5.11.1/etc/init.d/cloudera-scm-server start

/opt/cm-5.11.1/etc/init.d/cloudera-scm-agent start

  1. 开始安装

http://node1:7810/

五、实验验证结果 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不能提前存在,否则会报错

结果正确:

上一篇:码栈PRO助力阿里健康,全面提升电商运营效率


下一篇:linux安装python