大数据集群搭建及管理问题
提出问题
需要搭建1000台服务器的集群,其中集群包含Hive、Hbase、Flume、Kafka、Spark等集群,需要多长时间搭建好?
思考
搭建四台集群与搭建1000台集群的区别?比较相似
解决问题(以搭建HDFS为例)
集群环境规划
首先我们需要进行集群基础环境的规划:比如每台节点的网络ip规划,节点时间同步,每台节点的名称,每台节点安装jdk,节点之间配置免密等
其次需要进行Hadoop的集群规划:比如搭建HDFS的版本,搭建的HDFS模式,搭建单机模式?还是完全分布式模式?还是HA的完全分布式模式?搭建HDFS是否需要依赖?比如zookeeper
最后对节点进行规划:比如哪些节点搭建zookeeper?那些节点搭建Hadoop集群等
实际搭建步骤
- 基础环境准备,每台节点安装jdk,hosts配置,免密
- 规划集群节点 zookeeper,hadoop namenode datanode ...,选择各个技术的版本
- 配置并安装zookeeper
- 配置Hadoop 安装包
- 分发到1000台节点上,完成hadoop搭建
如果需要安装其它组件,也是同样的步骤,例如,继续安装Hive,选择Hive版本 -> 选择节点 -> 在一台节点配置 -> 分发到其他节点...
存在的问题
- 各个大数据技术包的下载。升级复杂
- 配置文件多节点之间分发。部署过程复杂
- 大数据技术各个版本的匹配兼容。开源版本有bug问题,版本对应混乱,兼容性差,集群升级不方便
- 集群监控麻烦;各服务状态、内存、磁盘、IO等。日志查看麻烦;去节点查看详细内容,安全性差
CDH介绍
CDH简介
目前Hadoop发行版非常多,除了原生的Apache Hadoop外,还有Cloudera发行版(CDH)、Hortonworks发行版(2018年与Cloudera公司已经合并),MapR的MapR产品、AWS(Amazon Web Services)的EMR(Elastic MapReduce)等。目前市场份额占比最高的是前三家。所有这些发行版都是基于Apache Hadoop衍生出来的,之所以有这么多版本,是由于Apache Hadoop的开源协议决定的:任何人可以对其进行修改,并作为开源或者商业产品发布或者销售
Apache Hadoop 版本: 最原始的版本,所有的发行版都是基于这个版本改进,也称为社区版Hadoop
Cloudera版本:Cloudera’s Distribution Including Apache Hadoop ,简称CDH
Hortonworks版本:Hortonworks Data Platform ,简称HDP
对于国内的用户来说,CDH版本使用最多。CDH基于Web的用户界面,支持大多数Hadoop的组件,包括:HDFS、MapReduce、Hive、Hbase、Zookeeper等组件,并且简化了大数据平台的安装和使用,使集群方便管理
Cloudera 的CDH和Apache原生的Hadoop的区别如下:
-
CDH对版本的划分非常清晰,CDH共有6个版本,前四个版本已经不再更新,目前更新的两个版本为CDH5和CDH6,CDH4基于Hadoop2.0,CDH5基于Hadoop2.2-2.6,CDH6基于Hadoop3.0,而原生的Apache Hadoop版本比较多,CDH相比原生Apache Hadoop做到版本统一管理
-
CDH相比原生Hadoop 在兼容性、安全性、稳定性上有较大改善,对Hadoop一些bug进行了修复,支持Kerberos安全认证,更新速度快且CDH文档完善清晰
-
CDH支持yum包,rpm包,tar包,Cloudera Manager几种方式安装,原生的Apache Hadoop只支持tar包安装
-
提供了部署、安装、配置工具,大大提高了集群部署的效率,可以在短时间内部署好集群
-
运维简单,提供了管理、监控、诊断、配置修改工具,管理配置方便,定位问题快速,准确,使运维工作简单高效
CDH集成组件
CDH集成了数据整合、存储、计算、搜索、分析等大数据相关技术组件,如下图
CDH中文官网: cn.cloudera.com/
CDH英文官网: www.cloudera.com
CDH官方文档: docs.cloudera.com/documentati…
CDH界面
CDH架构
Server: Cloudera Manager 的核心是Cloudera Manager Server, Server 管理控制台服务和托管应用程序逻辑,负责软件的安装、配置、服务的启动与关闭及管理集群
Agent: 安装在每台主机上。Agent负责进程的启动和停止,解压配置,触发安装及监控主机
Management Service: 由一组角色组成的服务,这些角色执行各种监视,警报和报告功能
DataBase: 存储配置及监控信息
ClouderaRepository: Cloudera Manager 分发软件的存储库
Clients: 与Server交互的接口,有两部分,Admin Console: 管理员web界面版。Api: 用于开发者创建Cloudera Manager程序
Cloudera Manager安装
准备
docs.cloudera.com/documentati… 可以在这里查看环境要求
Cloudera Enterprise 6.3. x 支持的操作系统
Operating System | Version (bold=new) |
---|---|
RHEL-compatible | |
RHEL/CentOS/OL with RHCK kernel | 7.9, 7.8, 7.7, 7.6, 7.5, 7.4, 7.3, 7.26.10, 6.9 |
Oracle Linux (OL) | 7.6, 7.4, 7.3, 7.2 (UEK default)6.10 (UEK default) |
SUSE Linux Enterprise Server | |
SLES | 12 SP5, 12 SP4*, 12 SP3 |
Ubuntu | |
Ubuntu | 18.04 LTS (Bionic)16.04 LTS (Xenial) |
支持的JDK
Cloudera Enterprise Version | Supported Oracle JDK | Supported OpenJDK |
---|---|---|
5.3 -5.15 | 1.7, 1.8 | none |
5.16 and higher 5.x releases | 1.7, 1.8 | 1.8 |
6.0 | 1.8 | none |
6.1 | 1.8 | 1.8 |
6.2 | 1.8 | 1.8 |
6.3 | 1.8 | 1.8, 11.0.3 or higher |
经过测试和推荐的Oracle JDK 8版本
Oracle JDK Version | Notes |
---|---|
1.8u181 | Recommended / Latest version tested |
1.8u162 | Recommended |
1.8u141 | Recommended |
1.8u131 | Recommended |
1.8u121 | Recommended |
1.8u111 | Recommended |
1.8u102 | Recommended |
1.8u91 | Recommended |
1.8u74 | Recommended |
1.8u31 | Minimum required |
经过测试和推荐的OpenJDK 8版本
OpenJDK Version | Notes |
---|---|
1.8u212 | Recommended / Latest version tested |
1.8u181 | Minimum required |
节点规划
ip | CPU | 内存 | 硬盘 | 角色 | 主机名 |
---|---|---|---|---|---|
192.168.91.21 | 2C | 6G | 200GB | Server,Agent | cm1 |
192.168.91.22 | 2C | 2G | 200GB | Agent | cm2 |
192.168.91.23 | 2C | 2G | 200GB | Agent | cm3 |
# 所有节点
# hosts 配置
cat >> /etc/hosts << "EOF"
192.168.91.41 cm1
192.168.91.42 cm2
192.168.91.43 cm3
EOF
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 关闭selinux,SELinux就是Security-Enhanced Linux的简称,安全加强的linux。传统的linux权限是对文件和目录的owner, group和other的rwx进行控制,而SELinux采用的是委任式访问控制,也就是控制一个进程对具体文件系统上面的文件和目录的访问,SELinux规定了很多的规则,来决定哪个进程可以访问哪些文件和目录。虽然SELinux很好用,但是在多数情况我们还是将其关闭,因为在不了解其机制的情况下使用SELinux会导致软件安装或者应用部署失败
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
# 时间同步配置,最小化安装系统需要安装ntpdate软件
yum -y install ntpdate
echo "0 */1 * * * ntpdate time1.aliyun.com" >> /var/spool/cron/root
# 启动ntpdate,并设置开机自启
systemctl enable ntpdate && systemctl start ntpdate
# 查看现有时区
ll /etc/localtime
lrwxrwxrwx. 1 root root 35 Sep 13 2023 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
# 时区如果不是Shanghai,需要指向上海
# 删除现有时区
rm -f /etc/localtime
# 修改为上海时区
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
jdk安装
www.oracle.com/pe/java/tec… 这个页面可以找到Oracle JDK 8的相关版本下载,这里下载的是jdk-8u181-linux-x64.rpm,需要现在Oracle官网上注册才可以下载
# 所有节点
rpm -ivh jdk-8u181-linux-x64.rpm
安装第三方依赖包
# 在每台节点上安装ClouderManager需要的第三方依赖包,每台节点执行如下命令
yum install -y chkconfig bind-utils psmisc cyrus-sasl-plain cyrus-sasl-gssapi portmap /lib/lsb/init-functions httpd mod_ssl openssl-devel python python-psycopg2 MySQL-python libxslt zlib sqlite fuse fuse-libs redhat-lsb
以上可以在一个节点配置好,然后克隆出另外两个节点
免密配置
在CDH中需要任意两个节点之间都可以免秘钥登录。节点两两免秘钥的根本原理如下:假设A节点需要免秘钥登录B节点,只要B节点上有A节点的公钥,那么A节点就可以免密登录当前B节点。
首先需要在每台节点上安装ssh客户端(yum -y install openssh-clients
),否则不能使用ssh命令(最小化安装Liunx,默认没有安装ssh客户端),这里在Centos7系统中默认已经安装,此步骤可以省略
# 配置所有节点相互免密,在所有节点上执行如下命令,给当前节点创建公钥和私钥
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 将cm1、cm2、cm3的公钥copy到cm1上,这样这三台节点都可以免密登录到cm1
# 在所有节点上执行
ssh-copy-id cm1
# 现在所有节点都可以免密登录cm1了,再将cm1节点上~/.ssh/authorized_keys文件拷贝到cm2、cm3各节点的~/.ssh/目录下,即可实现所有节点之间相互免密
# cm1节点执行
scp ~/.ssh/authorized_keys cm2:~/.ssh/
scp ~/.ssh/authorized_keys cm3:~/.ssh/
# cm2、cm3,远程cm2和cm3还需要再输入一次yes
ssh cm2
ssh cm3
mysql安装
# cm1
# mysql5.7安装
# 下载离线包并解压
wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar
tar xf mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar
# 使用rpm安装mysql,rpm包有依赖关系,安装的顺序如下(--force:强制安装 --nodeps:不检查环境依赖)
rpm -ivh mysql-community-common-5.7.44-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-libs-5.7.44-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-client-5.7.44-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-server-5.7.44-1.el7.x86_64.rpm --force --nodeps
# 删除rpm包
rm -f mysql-community*.rpm
# 默认mysqlL服务是关闭,需要启动mysql服务并设置开机自启
systemctl start mysqld && systemctl enable mysqld
# 登录mysql,修改密码,创建用户
grep 'temporary password' /var/log/mysqld.log
2024-04-29T06:13:58.383548Z 1 [Note] A temporary password is generated for root@localhost: SdhvRkY(u2Rs
mysql -uroot -p"SdhvRkY(u2Rs"
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Abc@1234';
use mysql;
truncate user;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Abc@1234' WITH GRANT OPTION;
# 创建scm用户并授权
GRANT ALL PRIVILEGES ON *.* TO 'scm'@'%' IDENTIFIED BY 'Abc@1234' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;
# 修改MySQL服务端编码为utf8,然后重启服务
echo 'character-set-server=utf8' >> /etc/my.cnf
systemctl restart mysqld
ClouderaManager和CDH安装包下载
Cloudera Manager 6: docs.cloudera.com/documentati…
CDH6: docs.cloudera.com/documentati…
现在Cloudera Manager已经收费,不能免费下载了,需要自行下载,这里准备了cm6.3.1-redhat7.tar.gz包,里面主要包含Cloudera Manager的daemons、agent、server的rpm包
安装
# cm1,需要安装servers、daemons、agent
# 先将cm6.3.1-redhat7.tar.gz上传到cm1
tar xf cm6.3.1-redhat7.tar.gz
cd ~/cm6.3.1/RPMS/x86_64/
# 由于安装过程中会检查系统中的依赖包,如果没有会报错,可以安装时指定 --nodeps 不检查依赖关系
rpm -ivh cloudera-manager-daemons-6.3.1-1466458.el7.x86_64.rpm
rpm -ivh cloudera-manager-agent-6.3.1-1466458.el7.x86_64.rpm
rpm -ivh cloudera-manager-server-6.3.1-1466458.el7.x86_64.rpm
# 将daemons和agent分发到cm2和cm3
for i in 2 3; do scp cloudera-manager-daemons-6.3.1-1466458.el7.x86_64.rpm cm$i:/root/;done
for i in 2 3; do scp cloudera-manager-agent-6.3.1-1466458.el7.x86_64.rpm cm$i:/root/;done
# cm2和cm3,需要安装daemons、agent
rpm -ivh cloudera-manager-daemons-6.3.1-1466458.el7.x86_64.rpm
rpm -ivh cloudera-manager-agent-6.3.1-1466458.el7.x86_64.rpm
# 所有节点,配置CM Agent的server host
# 修改"server_host=cm1"
sed -i 's/server_host=localhost/server_host=cm1/' /etc/cloudera-scm-agent/config.ini
# cm1
# 准备mysql-connector-java-5.1.26.jar包,并上传至cm1节点,注意这个jar包的版本不可以换,否则可能会出现问题
mkdir -p /usr/share/java/;cd ~
mv mysql-connector-java-5.1.26.jar /usr/share/java/mysql-connector-java.jar
# 初始化数据库,-h主机host,-u用户名,-p密码,--scm-host授权host,数据库类型,scm数据库,scm用户,scm密码
# 用于生成scm数据库配置文件,并在数据库创建用户和库,如果前面没有创建scm用户,-u可以使用root
/opt/cloudera/cm/schema/scm_prepare_database.sh -hcm1 -uscm -pAbc@1234 --scm-host=cm1 mysql scm scm Abc@1234
# 执行上面的脚本会生成一个db.properties,上面执行脚本时如果不指定-hcm1,这里生成com.cloudera.cmf.db.host=localhost
tail -6 /etc/cloudera-scm-server/db.properties
com.cloudera.cmf.db.type=mysql
com.cloudera.cmf.db.host=cm1
com.cloudera.cmf.db.name=scm
com.cloudera.cmf.db.user=scm
com.cloudera.cmf.db.setupType=EXTERNAL
com.cloudera.cmf.db.password=Abc@1234
# 查看生成的库和用户
mysql -uroot -pAbc@1234
# 生成了scm库
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| scm |
| sys |
+--------------------+
use mysql;
# 查看生成的用户,'scm'@'%' 是安装mysql之后创建的,'scm'@'cm1' 是上面执行脚本时创建的,执行脚本时如果不指定--scm-host=cm1 会生成 'scm'@'localhost',由于scm用户已经提前创建好了,所以--scm-host选项可以不用指定,否则必须指定
select user,host from user where user='scm';
+------+--------+
| user | host |
+------+--------+
| scm | % |
| scm | cm1 |
+------+--------+
# 可以看到scm_prepare_database.sh脚本执行,只是创建配置文件、库、用户,这些也可以自己创建或修改,通过脚本执行,可以提前看看连接数据库有没有问题
# 退出mysql客户端
exit;
准备CDH Parcels本地源
# cm1,上传3个CDH文件到/opt/cloudera/parcel-repo目录
# 查看上传之后的文件
ll /opt/cloudera/parcel-repo
-rw-r--r-- 1 root root 2082186246 Apr 29 14:11 CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel
-rw-r--r-- 1 root root 40 Apr 29 14:11 CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel.sha
-rw-r--r-- 1 root root 33887 Apr 29 14:12 manifest.json
启动CM Server、Agent
在Server节点启动ClouderaManager Server,分别在Agent节点启动ClouderaManager Agent
# cm1 节点上启动 Server 服务
systemctl start cloudera-scm-server
# cm1、cm2、cm3 节点上启动 Agent 服务
systemctl start cloudera-scm-agent
注意:Server启动比较慢,需要等待一会才能访问对应的web界面,可以查看启动日志,Sever的启动日志默认是"/var/log/cloudera-scm-server/cloudera-scm-server.log"。Agent的启动日志默认是"/var/log/cloudera-scm-agent/cloudera-scm-agent.log"。可以通过以上日志来检查启动中是否有错
Sever首次启动会自动创建表以及数据,不要立即关闭或重启,否则需要删除所有表及数据重新安装
至此,Cloudera Manager的安装完成
CDH安装
登录CM web界面
Cloudera Manager的webui界面登录地址为cm1:7180,默认的用户名和密码都是admin。输入完成后,点击登录
选择安装CDH的节点
登录之后,一直选择“继续”即可
选择Cloudera Express,点击“继续”,弹出页面后再点击“继续”
机器性能差的,这个页面需要等一会
弹出如下页面,该页面是为CDH指定主机,可以使用“模式”通配来选择主机,也可以选择“当前管理的主机”,这里“当前管理的主机”中有节点内容的原因正是由于之前我们在这三台节点配置过agent。如果未来集群增加机器,可以在新主机中搜索添加,后期会自动将agent安装到选中的新节点
这里我们选择“当前管理的主机”中的所有节点,点击“继续”
集群安装
选择CDH版本为CDH6.3.2,点击“继续”,如下图
点击“继续”之后,Cloudera Manager主节点会将下载好的CDH分发到各个Agent节点,此时可以在cm1,cm2,cm3节点上看到/opt/cloudera/ parcel-cache
目录中有Cloudera Manager主节点传过来的CDH安装包,同时在完成传输之后,每个Agent节点还会将CDH安装包解压到/opt/cloudera/parcels
路径下,此时界面显示如下(会显示正在下载解压)
点击“继续”,显示正在检查主机健康状况(稍等片刻,会自动跳转到这个页面)
点击检查结果,查看检查主机出现的问题
这里建议swappiness=10的时候表示最大限度使用物理内存。由于透明超大页面已知会导致意外的节点重新启动,可以在每台节点中执行如下命令,然后在当前页面"Inspect Hosts"后面点击“重新运行”即可规避这些警告,生产环境中不可以这样把警告规避掉
# 所有节点
# 默认是 30
echo 10 > /proc/sys/vm/swappiness
# 默认是 [always] madvise never
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 默认是 [always] madvise never
echo never > /sys/kernel/mm/transparent_hugepage/enabled
最后,点击“继续”,进入“集群设置”
集群设置
在进入的集群设置界面中,点击“自定义服务”,选择"HDFS"、"YARN"、"Zookeeper"进行安装,注意:这里提示还会安装Cloudera Management Service ,用于后期的监控、报告、事件和警报
点击“继续”,进入“角色分配”页面,显示的是Cloudera Manager自动划分的集群分配,当然这里也可以自己分配节点。如下图所示
接着点击“继续”,进入“审核更改页面”,在这里可以手动修改一些配置文件,如下图所示
接着点击“继续”,进入执行集群命令,启动各个组件页面,页面中可以看到各个组件的启动情况,当所有组件启动完成之后,如下图示
点击“继续”,完成集群设置
CDH主页面
ClouderaManager使用
CM中的名词术语
主机:host
机架:rack
服务:service;例如:Hadoop、MapReduce、spark
服务实例:service instance;激活的服务就叫服务实例
角色:role;服务中的角色,例如Yarn中的zookeeper节点,Spark中的Master节点
角色实例:role instance;分配的角色,就是角色实例
角色组:role group
主机模板:host template,可以用来给主机设置不同的角色
parcle: 就是CDH的安装包
静态服务池:static service pool
动态资源池:dynamic resource pool
集群管理
- 添加、删除集群
- 启动、停止、重启集群
- 重命名集群
- 全体集群配置
- 移动主机
主机管理
- 查看主机详细
- 主机检查
- 集群添加主机
- 分配机架
- 主机模板
- 维护模式
- 删除主机
服务管理
- 添加服务
- 对比不同集群上的服务配置
- 启动、停止、重启服务
- 滚动重启
- 终止客户端正在执行的命令
- 删除服务
- 配置最大进程数
资源管理
- 动态资源池
- 静态服务池
用户管理
安全管理
安装Hive
选择集群,添加Hive服务
添加服务向导
选择默认角色配置即可
点击“继续”之后,需要配置Hive依赖的mysql数据库,需要在cm1节点上连接mysql,执行创建数据库及分配权限语句
# cm1
mysql -uroot -pAbc@1234
create database hive DEFAULT CHARACTER SET utf8;
grant all on hive.* TO 'hive'@'%' IDENTIFIED BY 'Hive@1234';
flush privileges;
exit;
在弹出的页面中选择数据库,填写用户名及密码,点击“测试连接”,测试数据库连接成功后,点击“继续”
点击继续之后,设置hive的数据目录及端口,默认即可,点击继续之后等待Hive安装完成即可
oozie的安装
oozie是一个基于Hadoop的工作流引擎,也叫任务调度器,它以xml的形式写调度流程,可以调度mr,pig,hive,shell,jar,spark等。在工作中如果多个任务之间有依赖执行顺序要求,可以使用oozie来进行调度执行
选择集群,添加oozie服务
选择一个集群,搭建添加服务,选择“oozie”,点击“下一步”
添加服务向导
选择HDFS
选择节点,分配oozie角色
当点击“继续”后,需要给oozie配置数据库,需要在cm1节点上连接mysql,执行创建数据库及分配权限语句
# cm1
mysql -uroot -pAbc@1234
create database oozie DEFAULT CHARACTER SET utf8;
grant all on oozie.* TO 'oozie'@'%' IDENTIFIED BY 'Oozie@1234';
flush privileges;
exit;
在弹出的页面中选择数据库,填写用户名及密码,点击“测试连接”,测试数据库连接成功后,点击“继续”
在弹出的页面中,选择默认oozie使用的数据目录,默认即可,点击“继续”
等待服务向导完成,点击“继续”->“完成”,完成oozie安装
Hue介绍及安装
HUE是一个开源的Apache Hadoop UI系统,早期由Cloudera开发,它是基于Python Web框架Django实现,后来贡献给开源社区。它包括3个部分hue ui,hue server,hue db。通过使用Hue我们可以通过浏览器方式操纵Hadoop集群,查看修改hdfs的文件,管理hive的元数据,运行Sqoop,编写Oozie工作流等大量工作。Hue的安装可以依赖hive和oozie,所以这里先安装了Hive和oozie
选择集群,添加服务
添加服务向导
选择“hue”服务,点击“继续”
选择依赖的HDFS,点击“继续”
角色按照默认配置即可,点击“继续”,完成hue的安装
当点击“继续”后,需要给hue配置数据库,需要在cm1节点上连接mysql,执行创建数据库及分配权限语句
# cm1
mysql -uroot -pAbc@1234
create database hue DEFAULT CHARACTER SET utf8;
grant all on hue.* TO 'hue'@'%' IDENTIFIED BY 'Hue@1234';
flush privileges;
exit;
在弹出的页面中选择数据库,填写用户名及密码,点击“测试连接”,测试数据库连接成功后,点击“继续”
等待服务向导完成,点击“继续”->“完成”,完成hue安装
Hue的使用
以上将hue安装在cm1节点上,这里登陆hue时,地址为:http://cm1:8889,首次登陆hue需要登陆hue的账号密码,这里输入user:myhue,password:myhue。最好这里使用hdfs用户。因为hdfs用户可以操作hdfs中的文件,如果使用其他用户只能在当前用户的目录下创建文件
hue创建用户
点击“管理用户”->“添加用户”可以创建用户,并且可以指定权限,是否在HDFS中创建主目录等
hue操作HDFS文件
可以创建新的文件,也可以修改,最好HDFS中大文件不要在hue中操作。hue中的用户默认是进入当前用户的主目录进行操作
点击以上”文件”进入到HDFS文件系统,进行创建文件夹或者文件,还可以对文件进行编辑
准备personinfo.txt,内容如下(这些小文件可以在hue中直接编辑)
1,zhangsan,18,100
2,lisi,19,200
3,wangwu,20,300
4,zhangsan,21,400
将该文件上传到/user/myhue
中,上传之后在页面查看,如下图
hue操作hive中的数据
登录hue之后,点击“查询”->“编辑器”->“Hive”,编写sql创建Hive表
create table my_hive_table(id int,name string,age int,score double) row format delimited fields terminated by ',';
创建完成后,点击hive数据库刷新,可以看到刚才创建的Hive表,创建表完成之后,可以右键表找到“在浏览器中打开”,可以查询、导入、删除表等操作,导入数据时选择的数据可以是HDFS中也可以是本地中的文件数据
点击“提交”将HDFS中文件数据导入到表中。点击“查询”查询表中的数据,如下
在Hive SQL面板中还可以查询数据,在查询编辑器中执行查询sql语句。在hue中执行的sql语句,可以在“查询历史记录”中查到,还可以将sql语句保存,在“文档”中查看
执行sql语句之后,hql转换成MR作业,可以点击“作业”查看任务
hue添加rdbms数据库
hue也支持RDBMS关系数据库的展示及操作。在Cloudera Manager web页面中进入hue页面,在配置中搜索hue_safety_valve.ini
配置项,配置如下内容,保存更改
[librdbms]
[[databases]]
[[[mysql]]]
nice_name="Mysql"
engine=mysql
host=192.168.91.41
port=3306
user=root
password=Abc@1234
options={ "init_command":"SET NAMES 'utf8'"}
[notebook]
[[interpreters]]
[[[hive]]]
name=Hive
[[[mysql]]]
name=Mysql
interface=rdbms
[[[java]]]
name=Java
interface=oozie
[[[spark2]]]
name=Spark
interface=oozie
[[[shell]]]
name=Shell
interface=oozie
[[[sqoop1]]]
name=Sqoop1
interface=oozie
[[[distcp]]]
name=Distcp
interface=oozie
以上参数中,nice_name指定在hue中显示的连接名称。name指定连接的mysql数据库名称,不指定这个参数,将默认显示全部的数据库。engine指定mysql数据库类型。host指定数据库地址。port指定数据库端口号。user指定连接用户名。password指定密码。options中指定的"init_command"指定数据库编码为utf8,防止有中文时乱码
此外,在配置"[notebook]"时,可以只需要配置Hive与Mysql即可。以上配置完成之后,重启hue(在当前页面,操作中有重启按钮,点击即可)。重新进入hue webui中,点击“查询”->“编辑器”,可以看到“MySQL”标签,点击在主页右侧“SQL”中也会出现对应的MySQL中的数据库及表信息
impala介绍及安装
impala简介
impala由Cloudera公司推出,提供对HDFS、Hbase数据的高性能、低延迟的交互式SQL查询功能。 基于Hive使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点。是CDH平台首选的PB级大数据实时查询分析引擎。已有的Hive系统虽然也提供了SQL语义,但由于Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满足查询的交互性。相比之下,Impala的最大特点就是基于内存处理数据,查询速度快
Impala与Hive都是构建在Hadoop之上的数据查询工具各有不同的侧重适应面,但从客户端使用来看Impala与Hive有很多的共同之处,如数据表元数据、ODBC/JDBC驱动、SQL语法、灵活的文件格式、存储资源池等
Impala与Hive在Hadoop中的关系下图所示。Hive适合于长时间的批处理查询分析,而Impala适合于实时交互式SQL查询,Impala给数据分析人员提供了快速实验、验证想法的大数据分析工具。可以先使用hive进行数据转换处理,之后使用Impala在Hive处理后的结果数据集上进行快速的数据分析
Impala架构
Impala主要由Impalad、State Store 、Catlog和CLI组成
Impalad
与DataNode运行在同一节点上,由Impalad进程表示,它接收客户端的查询请求(接收查询请求的Impalad为Coordinator,Coordinator通过JNI[java native interface]调用java前端解释SQL查询语句,生成查询计划树,再通过调度器把执行计划分发给具有相应数据的其它Impalad进行执行),读写数据,并行执行查询,并把结果通过网络流式的传送回给Coordinator,由Coordinator返回给客户端。同时Impalad也与State Store保持连接,用于确定哪个Impalad是健康和可以接受新的工作。在Impalad中启动三个ThriftServer: beeswax_server(连接客户端),hs2_server(借用Hive元数据), be_server(Impalad内部使用)和一个ImpalaServer服务
每个impalad实例会接收、规划并调节来自ODBC或Impala Shell等客户端的查询。每个impalad实例会充当一个Worker,处理由其它impalad实例分发出来的查询片段(query fragments)。客户端可以随便连接到任意一个impalad实例,被连接的impalad实例将充当本次查询的协调者(Ordinator),将查询分发给集群内的其它impalad实例进行并行计算。当所有计算完毕时,其它各个impalad实例将会把各自的计算结果发送给充当 Ordinator的impalad实例,由这个Ordinator实例把结果返回给客户端。每个impalad进程可以处理多个并发请求
Imapla State Store
负责Query的调度及跟踪集群中的Impalad的健康状态及位置信息,由statestored进程表示,它通过创建多个线程来处理Impalad的注册订阅和与各Impalad保持心跳连接,各Impalad都会缓存一份State Store中的信息,当State Store离线后,因为Impalad有State Store的缓存仍然可以工作,但会因为有些Impalad失效了,而已缓存数据无法更新,导致把执行计划分配给了失效的Impalad,导致查询失败。Impalad发现State Store处于离线时,会进入recovery模式,反复注册,当State Store重新加入集群后,自动恢复正常,更新缓存数据
Catalog
当Impala集群启动后,负责从Hive MetaStore中获取元数据信息,放到impala自己的catalog中。Catalog会与StateStore通信,将元数据信息通过StateStore广播到每个Impalad节点。同时当Impala客户端在某个Impalad中创建表后,Impalad也会将建表的元数据信息通过State Store通知给各个Impalad节点和Catalog,由Catalog同步到Hive的元数据中
注意在Hive中创建表产生的元数据信息,不能同步到catalog中,需要手动执行命令同步
CLI(Impala shell)
命令行客户端,提供给用户查询使用的命令行工具
impala的优势
-
基于内存进行计算,能够对PB级数据进行交互式实时查询、分析
不需要把中间结果写入磁盘,省掉了大量的I/O开销。最大限度的使用内存,中间结果不写磁盘,Impalad之间通过网络以stream的方式传递数据
-
无需转换为MR,直接读取HDFS数据
省掉了MR作业启动的开销,Impala直接通过相应的服务进程来进行作业调度,速度快
-
C++编写,LLVM统一编译运行
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time)。使用C++实现,做了很多针对性的硬件优化
-
兼容HiveSQL,可对Hive数据直接分析
-
支持Data Local
Impala支持Data Locality的I/O调度机制,尽可能的将数据和计算分配在同一台机器上执行,减少网络开销
-
支持列式存储
-
支持JDBC/ODBC远程访问
impala的劣势
- 对内存的依赖大,要求高
- 完全依赖Hive,不支持Hive的UDF和UDAF函数,不支持查询期的容错
- 分区超过1w性能严重下降
- 稳定性不如hive
Impala与Hive的异同
相同点
impala与Hive使用相同的元数据,都支持将数据存储在HDFS和Hbase中,都是对SQL进行词法分析生成执行计划
不同点
1.执行计划
Hive: 依赖MR执行框架,执行计划分为map->shuffle->reduce->map->shuffle->reduce…由于中间有很多次shuffle,SQL执行时间长
Impala: 执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个Impalad中执行查询,而不需要转换成MR模式处理,保证impala有更好的并发性和避免不必要的中间sort和shuffle
2.数据流
Hive: 采用推的方式,每个计算节点计算完成之后将数据主动推给后续节点
impala: 采用拉的方式,后续节点通过getNext主动向前面节点要数据,此方式可以将数据流式的返回给客户端,只要有一条数据处理完成,就可以立即被展示出来,不需要等待全部数据处理完成,更符合sql交互式查询
3.内存使用
Hive: 在执行过程中如果内存放不下数据,则会使用磁盘,保证SQL能顺序执行完成,每一轮MR执行结束后,中间结果也会落盘
Impala: 在遇到内存放不下数据时,就会报错。这使impala处理数据有一定的局限性,最好与Hive配合使用。Impala在多个阶段之间利用网络传输数据,在执行过程中不会有写磁盘操作(insert除外)
4.调度
Hive: Hive调度依赖于Hadoop的调度策略
Impala: 调度由Impala自己完成,会尽量将处理数据的进程靠近数据本身所在的物理机器
5.容错
Hive: 依赖于Hadoop的容错能力
Impala: 整体来看,Impala容错一般,用户可以向任意一台impalad提交SQL查询。如果一个Impalad失效,在当前Impala上执行的所有SQL查询将失败,但是用户可以重新提交查询由其他的Impalad代替执行,不影响服务。在查询过程中,没有容错逻辑,如果执行过程中发生故障,则直接返回错误。对于Impala中的State Store目前只有一个,但当State Store失效,也不会影响服务,每个Impalad都缓存了State Store的信息,只是不能再更新集群状态,有可能会把执行任务分配给已经失效的Impalad执行,导致SQL执行失败
6.适用方面
Hive: 复杂的批处理查询任务,数据转换任务
Impala: 实时数据分析,因为不支持UDF,对处理复杂的问题分析有局限性,与Hive配合使用,对Hive的结果数据集进行实时分析
安装
选择集群,添加服务
添加服务向导
在弹出的窗口中选择impala,点击“继续”
角色按照默认配置即可,点击“继续”
选择impala的数据目录,默认即可,点击“继续”->“完成”,完成impala的安装
impala的使用
在集群主页上,启动impala
测试Hive&impala的速度
首先在cm2中切换hdfs用户,默认ClouderaManager在创建hdfs用户时,禁用了使用hdfs用户进行ssh登录,这里需要执行命令(建议所有节点都执行)
# 所有节点
usermod -s /bin/bash hdfs
在cm2节点的shell上进入hive客户端,在之前hue的使用中,给Hive中插入过表my_hive_table
,执行sql语句查看在hive中执行速度
# cm2
su - hdfs
# 进入hive客户端
hive
show tables;
my_hive_table
select count(*) from my_hive_table;
...
4
Time taken: 25.373 seconds, Fetched: 1 row(s)
在cm3节点上进入impala-shell,执行相同的语句查看执行时长
# cm3
# 进入impala客户端
impala-shell
show tables;
Query: show tables
+---------------+
| name |
+---------------+
| my_hive_table |
+---------------+
select count(*) from my_hive_table;
...
+----------+
| count(*) |
+----------+
| 4 |
+----------+
Fetched 1 row(s) in 5.06s
执行同样的sql,hive耗时25秒,impala耗时5秒
测试impala创建表同步元数据
在impala中创建一张表,查看是否元数据会同步到Hive的MetaStore,在impala-shell中执行建表语句
# cm3 impala-shell
create table impala_table (id int,name string,score int) row format delimited fields terminated by '\t';
+-------------------------+
| summary |
+-------------------------+
| Table has been created. |
+-------------------------+
同时,在cm2节点的Hive客户端查看是否有表"impala_table",发现在impala中创建的表元数据在Hive中立即可以查询到
-- cm2 hive
show tables;
impala_table
my_hive_table
测试Hive创建表不同步元数据
在cm2节点,Hive中创建一张表,执行命令如下,在impala中看不到对应的表信息,需要手动更新元数据才可以
-- cm2 hive
create table my_hive_table1 (id int,name string) row format delimited fields terminated by '\t';
在cm3节点查询impala-shell,执行命令如下
# cm3 impala-shell
show tables;
+---------------+
| name |
+---------------+
| impala_table |
| my_hive_table |
+---------------+
# impala同步元数据信息
invalidate metadata;
show tables;
+----------------+
| name |
+----------------+
| impala_table |
| my_hive_table |
| my_hive_table1 |
+----------------+
impala Shell命令
impala-shell命令的选项
选项 | 说明 |
---|---|
-h --help | 帮助 |
-v --version | 查看版本信息 |
-V --verbose | 启用详细输出,显示详细时间,显示执行信息 |
--quiet | 关闭详细输出 |
-p --show_profiles | 显示执行计划 |
-i IMPALAD --impalad=IMPALAD | 指定连接主机,格式hostname:port 默认端口21000 |
-q QUERY --query=QUERY | 从命令行执行查询,不进入impala-shell |
-d DEFAULT_DB --database=DEFAULT_DB | 指定数据库(在启动时发出use database命令) |
-f QUERY_FILE --query_file=QUERY_FILE | 执行查询文件中的查询,以;分隔。如果-f的参数为"-",则从stdin读取查询,并以ctrl-d结束查询 |
-o OUTPUT_FILE --output_file=OUTPUT_FILE | 如果设置,查询结果将写入给定的文件。多个以分号结束的查询的结果将被追加到同一个文件中(就是将1标准输出输出到文件) |
-c --ignore_query_failure | 查询执行失败时继续执行,即跳过错误 |
-B --delimited | 以分隔模式输出行(去默认的格式化输出) |
--print_header | 美化打印时,以分隔模式打印列名 |
--output_delimiter=OUTPUT_DELIMITER | 用于分隔模式下输出的字段分隔符 |
-k, --kerberos | 连接到kerberized impalad,使用kerberos安全加密方式运行impala-shell |
-l --ldap | 使用LDAP认证Impala,Impala必须配置为允许LDAP认证 |
-u USER --user=USER | 要进行身份验证的用户 |
# cm3
# 创建impala_test.sql
echo 'select count(*) from my_hive_table;select * from my_hive_table;' > impala_test.sql
# 执行impala_test.sql脚本,跳过错误、打印列名、输出分隔符为#
# --print_header --output_delimiter 必须与-B一起使用,否则不生效
impala-shell -f impala_test.sql -c --print_header --output_delimiter="#"
...
+----------+
| count(*) |
+----------+
| 4 |
+----------+
...
+----+----------+-----+-------+
| id | name | age | score |
+----+----------+-----+-------+
| 1 | zhangsan | 18 | 100 |
| 2 | lisi | 19 | 200 |
| 3 | wangwu | 20 | 300 |
| 4 | zhangsan | 21 | 400 |
+----+----------+-----+-------+
...
impala-shell -f impala_test.sql -B -c --print_header
...
count(*)
4
...
id name age score
1 zhangsan 18 100
2 lisi 19 200
3 wangwu 20 300
4 zhangsan 21 400
...
# 执行impala_test.sql脚本,以分隔模式输出行,跳过错误,并将标准输出重定向到out1.txt
impala-shell -f impala_test.sql -B -c 1>out1.txt
cat out1.txt
4
1 zhangsan 18 100
2 lisi 19 200
3 wangwu 20 300
4 zhangsan 21 400
# 与上面命令的效果一样
impala-shell -f impala_test.sql -B -o out2.txt
特殊用法,进入impala-shell命令后
命令 | 说明 |
---|---|
help | 在impala-shell中查看帮助 |
connect <hostname:port> | 连接主机,默认端口21000 |
refresh <tablename> | 增量刷新元数据库 |
invalidate metadata | 全量刷新元数据库 |
explain <sql> | 显示查询执行计划、步骤信息 |
set explain_level | 设置显示级别(0,1,2,3) ,默认为1 |
shell <shell> | 不退出impala-shell执行Linux命令 |
profile | 查询最近一次查询的底层信息(查询完成后执行) |
impala-shell
explain select * from my_hive_table;
# 级别越小,内容越精简,级别越大,内容越多
set explain_level = 3;
explain select * from my_hive_table;
# 执行linux命令
shell cat ./impala_test.sql;
impala存储和压缩方式
oozie的使用
Oozie是用于 Hadoop 平台的开源的工作流调度引擎。 用来管理Hadoop作业。 属于web应用程序,由Oozie client和Oozie Server两个组件构成。 Oozie Server是运行于Java Servlet容器(Tomcat)中的web程序
oozie作用
- 统一调度hadoop系统中常见的mr任务启动、hdfs操作、shell调度、hive操作等
- 使得复杂的依赖关系、时间触发、事件触发使用xml语言进行表达
- 一组任务使用一个DAG来表示,使用图形表达流程逻辑更加清晰
- 支持很多种任务调度,能完成大部分hadoop任务处理
- 程序定义支持EL常量和函数,表达更加丰富
oozie中的概念
- workflow: 工作流 ,顺序执行流程节点,支持fork(分支多个节点),join(合并多个节点为一个)
- coordinator: 多个workflow可以组成一个coordinator,可以把前几个workflow的输出作为后一个workflow的输入,也可以定义workflow的触发条件,来做定时触发
- bundle: 是对一堆coordinator的抽象, 可绑定多个coordinator
oozie web控制台
1. 将ext-2.2解压到对应目录
如果使用web控制台,还需要在oozie安装节点cm1上将"ext-2.2"解压到"/var/lib/oozie"目录下
# cm1
wget http://archive.cloudera.com/gplextras/misc/ext-2.2.zip
yum -y install unzip
# 解压ext到路径 /var/lib/oozie 中
unzip ext-2.2.zip -d /var/lib/oozie/
2. 启用 Oozie 服务器 Web 控制台
在CDH中进入oozie,点击配置,找到“启用 Oozie 服务器 Web 控制台”选项,点击“保存更改”之后,重启oozie服务即可
3. 浏览器或者CDH页面访问oozie的webui
webui地址是 cm1:11000
4. oozie job.properties文件参数
5. oozie提交任务命令
默认在CDH中安装了oozie后,每台节点都可以当做客户端来提交oozie任务流任务。启动任务,停止任务,提交任务,开始任务和查看任务执行情况,命令如下
# 启动任务
oozie job -oozie http://ip:11000/oozie/ -config job.properties -run
# 停止任务
oozie job -oozie http://ip:11000/oozie/ -kill 0000000-240430160814840-oozie-oozi-W
# 提交任务
oozie job -oozie http://ip:11000/oozie/ -config job.properties -submit
# 开始任务
oozie job -oozie http://ip:11000/oozie/ -config job.properties -start
# 查看任务执行情况
oozie job -oozie http://ip:11000/oozie/ -info 0000000-240430160814840-oozie-oozi-W
6. oozie提交任务流
oozie提交任务需要两个文件,一个是workflow.xml文件,这个文件要上传到HDFS中,当执行oozie任务流调度时,oozie服务端会从这个xml中获取当前要执行的任务
另一个是job.properties文件,这个文件是oozie在客户端提交流调度任务时告诉oozie服务端workflow.xml文件在什么位置的描述配置文件
配置workflow.xml文件,内容如下
<workflow-app xmlns="uri:oozie:workflow:0.3" name="shell-wf">
<start to="shell-node"/>
<action name="shell-node">
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<exec>echo</exec>
<argument>**** first-hello oozie *****</argument>
</shell>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>
在CDH中进入hue,在HDFS中创建文件workflow.xml
打开文件编辑器,将以上内容写入workflow.xml中,点击保存
在cm1,cm2,cm3任意节点上,选择一个节点当做提交oozie任务的客户端,创建job.properties文件,写入以下内容
nameNode=hdfs://cm1:8020
jobTracker=cm1:8032
queueName=default
examplesRoot=examples
oozie.wf.application.path=${nameNode}/user/myhue
提交oozie任务后会自动转换成MapReduce任务执行,这个时候需要Yarn资源调度。默认在Hadoop2.x版本中默认Yarn每个NodeManager节点分配资源为8core和8G,内存配置为yarn.nodemanager.resource.memory-mb
代表当前NodeManager可以使用的内存总量。每个container启动默认可以使用最大的内存量为yarn.scheduler.maximum-allocation-mb
,默认为8G
在Hadoop3.x版本之后,Yarn NodeManager节点默认分配的资源为1G和4Core。这里oozie任务需要的默认资源是2G和1Core,所以这里需要在Yarn中调大每台NodeManager的内存资源,在Yarn 配置中找到配置项“yarn.nodemanager.resource.memory-mb(表示该节点上YARN可使用的物理内存总量)”调节到至少2G以上,同时需要调大每个Container可以使用的最大内存,将“yarn.scheduler.maximum-allocation-mb(每个Container可申请的最多物理内存量)”调节到至少2G以上,但是应小于“yarn.nodemanager.resource.memory-mb”参数。配置如下
以上点击“保存修改”完成配置之后,需要重新启动Yarn集群即可。配置完成后,在当前客户端执行提交如下oozie的命令,可以看到返回了一个jobid,可以根据这个jobId,停止任务或者查看任务执行情况
# cm3
# 先切换到hdfs用户,否则可能会报访问hdfs权限错误
su - hdfs
# 先创建job.properties
# 启动任务
oozie job -oozie http://cm1:11000/oozie/ -config job.properties -run
job: 0000000-240430165611257-oozie-oozi-W
# 查看任务执行情况
oozie job -oozie http://cm1:11000/oozie/ -info 0000000-240430165611257-oozie-oozi-W
Job ID : 0000000-240430165611257-oozie-oozi-W
----------------------------------------------------------------------------------------------------------
Workflow Name : shell-wf
App Path : hdfs://cm1:8020/user/myhue
Status : SUCCEEDED
Run : 0
User : hdfs
Group : -
Created : 2024-04-30 09:01 GMT
Started : 2024-04-30 09:01 GMT
Last Modified : 2024-04-30 09:01 GMT
Ended : 2024-04-30 09:01 GMT
CoordAction ID: -
Actions
----------------------------------------------------------------------------------------------------------
ID Status Ext ID Ext Status Err Code
----------------------------------------------------------------------------------------------------------
0000000-240430165611257-oozie-oozi-W@:start: OK - OK -
----------------------------------------------------------------------------------------------------------
0000000-240430165611257-oozie-oozi-W@shell-node OK application_1714465260691_0001SUCCEEDED -
----------------------------------------------------------------------------------------------------------
0000000-240430165611257-oozie-oozi-W@end OK - OK -
----------------------------------------------------------------------------------------------------------
启动任务之后,可以在oozie的webui页面中看到如下结果
上图中,可以点击任务流中的任务找打对应的console url ,在浏览器中输入url查看结果(实际就是在yarn中查看结果)
7. oozie提交含有多个任务的任务流
通过hue修改workflow.xml文件写入以下命令,执行任务a和任务b
<workflow-app xmlns="uri:oozie:workflow:0.3" name="myflow">
<start to="a"/>
<action name="a">
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<exec>echo</exec>
<argument>**** first-hello oozie *****</argument>
</shell>
<ok to="b"/>
<error to="fail"/>
</action>
<action name="b">
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<exec>echo</exec>
<argument>**** second-i am second *****</argument>
</shell>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>
# cm3节点hdfs用户
oozie job -oozie http://cm1:11000/oozie/ -config job.properties -run
执行命令之后,进入oozie webui查看任务执行情况,可以点击任务流中的某个任务,查看详细执行信息或登录yarn查看结果
CDH集成Flink
安装包准备
下载Flink jar工具包
Flink jar工具包主要是让Cloudera Manager来支持Flink服务安装,下载地址:archive.cloudera.com/csa/1.0.0.0…
将下载好的"FLINK-1.9.0-csa1.0.0.0-cdh6.3.0.jar"工具包上传至cm1节点的/opt/cloudera/csd目录下,Cloudera Manager 才能有安装Flink的服务界面,不然界面看不到Flink,无法添加Flink服务
下载Flink parcels文件
下载地址:archive.cloudera.com/csa/1.0.0.0…
Flink parcels 文件中含有Flink的安装包,下载Flink Parcels时,需要下载以下三个文件
- FLINK-1.9.0-csa1.0.0.0-cdh6.3.0-el7.parcel
- FLINK-1.9.0-csa1.0.0.0-cdh6.3.0-el7.parcel.sha
- manifest.json
将下载好的以上三个文件上传至cm1节点的/opt/cloudera/parcel-repo目录下,该目录下已经有manifest.json这个文件注意做好备份
注意:上面的下载路径现在都不可用了,可以在网上找到相关的资源
分配parcel进行安装
# cm1
# 可能需要先重启CM,在线安装的可能不用
systemctl restart cloudera-scm-server
进入Cloudea Manager平台中,点击“主机”,选择“Parcel”,进入parcel管理页面
点击“检查新Parcel”,刷新几次就可以看到对应的Flink Parcel出现,如下图
点击分配,会将parcel分发到其他Agent节点,并自动完成解压
点击激活,激活就是创建对应的Flink一些目录和用户,激活成功后可以在集群中添加Flink服务
添加Flink服务
打开Cloudera Manager主页,找到对应的集群,添加Flink服务
选择Flink HistoryServer和Flink客户端
点击“继续”,“审核更改”中可以不做修改,点击“继续”->”完成”。最后Flink服务实例安装完成
注意:完成之后,需要重启Cloudera Management Service服务(在页面中有重启按钮),Flink服务实例状态才能被监控
提交Flink任务
# cm3节点hdfs用户
# 准备数据
hdfs dfs -mkdir -p /tmp/flink_test/in
cat > word.txt << EOF
hello java
hello bigdata
hello hadoop
hello spark
hello flink
flink flink
EOF
hdfs dfs -put word.txt /tmp/flink_test/in/
# 测试flink
flink run -m yarn-cluster -yn 4 -yjm 1024 -ytm 1024 /opt/cloudera/parcels/FLINK/lib/flink/examples/streaming/WordCount.jar --input hdfs://cm1:8020/tmp/flink_test/in/ --output hdfs://cm1:8020/tmp/flink_test/out
# 查看结果
hdfs dfs -cat /tmp/flink_test/out
(hello,1)
(java,1)
(hello,2)
(bigdata,1)
(hello,3)
(hadoop,1)
(hello,4)
(spark,1)
(hello,5)
(flink,1)
(flink,2)
(flink,3)
可以在Flink的webui中查看执行的job,通过CM部署的组件对应的webui都可以在CM页面中点击跳转过去