Flume
其他组件
Selector
-
Selector是Source的子组件,Selector是配置在Source上的,Selector决定了数据的分发方式
-
Selector提供了两种分发方式
- replicating:复制模式。当节点收到数据之后,会将数据复制之后分发给每一个节点,此时数据接收的节点收到的数据是相同的,这种分发方式通常用于数据的备份或者数据的不同处理
- Multiplexing:路由模式/多路复用模式。当节点收到数据之后,会根据数据的headers中的指定字段的值来决定发送给哪一个节点,此时注意,每一个节点收到的数据是不相同的
-
案例
-
格式文件
a1.sources = s1 a1.channels = c1 c2 a1.sinks = k1 k2 a1.sources.s1.type = http a1.sources.s1.port = 8090 # 配置Multiplexing Selector a1.sources.s1.selector.type = multiplexing # 指定要监听的字段 a1.sources.s1.selector.header = kind # 指定字段的值 a1.sources.s1.selector.mapping.video = c1 a1.sources.s1.selector.mapping.music = c2 a1.sources.s1.selector.default = c2 a1.channels.c1.type = memory a1.channels.c2.type = memory a1.sinks.k1.type = avro a1.sinks.k1.hostname = hadoop02 a1.sinks.k1.port = 8090 a1.sinks.k2.type = avro a1.sinks.k2.hostname = hadoop03 a1.sinks.k2.port = 8090 a1.sources.s1.channels = c1 c2 a1.sinks.k1.channel = c1 a1.sinks.k2.channel = c2
-
启动命令
flume-ng agent -n a1 -c $FLUME_HOME/conf -f multiplexing.conf -Dflume.root.logger=INFO,console
-
发送数据
curl -X POST -d '[{"headers":{"kind":"video"},"body":"from video"}]' http://hadoop:8090 curl -X POST -d '[{"headers":{"kind":"music"},"body":"from music"}]' http://hadoop:8090 curl -X POST -d '[{"headers":{"kind":"log"},"body":"from log"}]' http://hadoop:8090
-
Interceptor
-
Interceptor也是Source的子组件,即Interceptor也是配置在Source上
-
不同于Selector,一个Source上可以配置多个Interceptor,构成拦截器链
-
Timestamp Interceptor:在数据的headers部分来添加一个timestamp字段用于标记数据被收集的时间
-
格式文件
a1.sources = s1 a1.channels = c1 a1.sinks = k1 a1.sources.s1.type = netcat a1.sources.s1.bind = 0.0.0.0 a1.sources.s1.port = 8090 # 配置Interceptor a1.sources.s1.interceptors = i1 # 配置Timestamp Interceptor a1.sources.s1.interceptors.i1.type = timestamp a1.channels.c1.type = memory a1.sinks.k1.type = logger a1.sources.s1.channels = c1 a1.sinks.k1.channel = c1
-
启动命令
flume-ng agent -n a1 -c $FLUME_HOME/conf -f in.conf -Dflume.root.logger=INFO,console
-
-
Host Interceptor:在数据的headers部分添加一个host字段,用于标记当前数据的来源主机
-
格式文件
a1.sources = s1 a1.channels = c1 a1.sinks = k1 a1.sources.s1.type = netcat a1.sources.s1.bind = 0.0.0.0 a1.sources.s1.port = 8090 # 配置Interceptor a1.sources.s1.interceptors = i1 # 配置Host Interceptor a1.sources.s1.interceptors.i1.type = host a1.channels.c1.type = memory a1.sinks.k1.type = logger a1.sources.s1.channels = c1 a1.sinks.k1.channel = c1
-
启动命令
flume-ng agent -n a1 -c $FLUME_HOME/conf -f hostin.conf -Dflume.root.logger=INFO,console
-
-
Static Iterceptor:在数据的headers部分来添加一个固定的指定字段
-
格式文件
a1.sources = s1 a1.channels = c1 a1.sinks = k1 a1.sources.s1.type = netcat a1.sources.s1.bind = 0.0.0.0 a1.sources.s1.port = 8090 a1.sources.s1.interceptors = i1 # 配置Static Interceptor a1.sources.s1.interceptors.i1.type = static # 指定字段 a1.sources.s1.interceptors.i1.key = kind # 指定字段值 a1.sources.s1.interceptors.i1.value = test a1.channels.c1.type = memory a1.sinks.k1.type = logger a1.sources.s1.channels = c1 a1.sinks.k1.channel = c1
-
启动命令
flume-ng agent -n a1 -c $FLUME_HOME/conf -f staticin.conf -Dflume.root.logger=INFO,console
-
-
UUID Interceptor:会在数据的headers部分添加一个id字段用于标记这个数据的唯一性
-
格式文件
a1.sources = s1 a1.channels = c1 a1.sinks = k1 a1.sources.s1.type = netcat a1.sources.s1.bind = 0.0.0.0 a1.sources.s1.port = 8090 a1.sources.s1.interceptors = i1 # 配置UUID Interceptor a1.sources.s1.interceptors.i1.type = org.apache.flume.sink.solr.morphline.UUIDInterceptor$Builder a1.channels.c1.type = memory a1.sinks.k1.type = logger a1.sources.s1.channels = c1 a1.sinks.k1.channel = c1
-
启动命令
flume-ng agent -n a1 -c $FLUME_HOME/conf -f uuidin.conf -Dflume.root.logger=INFO,console
-
-
Search And Replace Interceptor:在使用的时候需要指定一个正则表达式,会将Event的body部分的数据替换为指定的形式
-
格式文件
a1.sources = s1 a1.channels = c1 a1.sinks = k1 a1.sources.s1.type = http a1.sources.s1.port = 8090 a1.sources.s1.interceptors = i1 # 配置Search And Replace Interceptor a1.sources.s1.interceptors.i1.type = search_replace # 指定正则表达式 a1.sources.s1.interceptors.i1.searchPattern = [0-9] # 指定替换后的形式 a1.sources.s1.interceptors.i1.replaceString = * a1.channels.c1.type = memory a1.sinks.k1.type = logger a1.sources.s1.channels = c1 a1.sinks.k1.channel = c1
-
启动命令
flume-ng agent -n a1 -c $FLUME_HOME/conf -f searchin.conf -Dflume.root.logger=INFO,console
-
发送数据
curl -X POST -d '[{"headers":{"date":"2021-07-17"},"body":"P2P"}]' http://hadoop:8090
-
-
Regex Filtering Interceptor:在使用的时候同样需要定义正则表达式,通过excludeEvets属性来控制表达式的结果。当excludeEvents属性的值为false的时候,那么符合正则表达式的数据会被留下;当excludeEvents属性的值为true的时候,那么表示不符合正则表达式的数据会被留下
-
格式文件
a1.sources = s1 a1.channels = c1 a1.sinks = k1 a1.sources.s1.type = netcat a1.sources.s1.bind = 0.0.0.0 a1.sources.s1.port = 8090 a1.sources.s1.interceptors = i1 # 配置Regex Filterding Interceptor a1.sources.s1.interceptors.i1.type = regex_filter # 指定正则表达式 - 判断数据中是否含有数字 a1.sources.s1.interceptors.i1.regex = .*[0-9].* # 决定了数据的刨除方式 a1.sources.s1.interceptors.i1.excludeEvents = false a1.channels.c1.type = memory a1.sinks.k1.type = logger a1.sources.s1.channels = c1 a1.sinks.k1.channel = c1
-
启动命令
flume-ng agent -n a1 -c $FLUME_HOME/conf -f regexin.conf -Dflume.root.logger=INFO,console
-
Processor
-
Processor本质上就是一个Sink Group,在使用的时候,需要将一个或者多个Sink绑定到一个组中
-
Processor提供了三种方式
- default:默认模式。如果不指定,那么默认使用的就是default模式,这种模式下,每一个Sink对应了一个单独的Sink Group
- failover:崩溃恢复模式。在使用的时候需要将多个Sink绑定到一个组中,通过优先级的大小决定将数据优先发送给哪一个Sink。如果高优先级的节点宕机,那么此时会启动低优先级的Sink
- Load Balance:负载均衡模式。采用不同的方式将数据平均的发送到每一个节点上,但是Flume原生的负载均衡方式不太好用
-
Failover Processor案例
-
格式文件
a1.sources = s1 a1.channels = c1 c2 a1.sinks = k1 k2 # 给SinkGroup起名 a1.sinkgroups = g1 # 配置Source a1.sources.s1.type = netcat a1.sources.s1.bind = 0.0.0.0 a1.sources.s1.port = 8090 # 配置Channel a1.channels.c1.type = memory a1.channels.c1.capacity = 10000 a1.channels.c1.transactionCapacity = 1000 a1.channels.c2.type = memory a1.channels.c2.capacity = 10000 a1.channels.c2.transactionCapacity = 1000 # 配置Sink a1.sinks.k1.type = avro a1.sinks.k1.hostname = hadoop02 a1.sinks.k1.port = 8090 a1.sinks.k2.type = avro a1.sinks.k2.hostname = hadoop03 a1.sinks.k2.port = 8090 # 配置Sink Group # 将Sink绑定到Sinkgroup中 a1.sinkgroups.g1.sinks = k1 k2 # 配置Sinkgroup的类型 a1.sinkgroups.g1.processor.type = failover # 给每一个Sink指定优先级 a1.sinkgroups.g1.processor.priority.k1 = 3 a1.sinkgroups.g1.processor.priority.k2 = 7 # 指定等待时间 a1.sinkgroups.g1.processor.maxpenalty = 10000 # 绑定Channel a1.sources.s1.channels = c1 c2 a1.sinks.k1.channel = c1 a1.sinks.k2.channel = c2
-
启动命令
flume-ng agent -n a1 -c $FLUME_HOME/conf -f failover.conf -Dflume.root.logger=INFO,console
-
流程
Hive
简介
概述
- Hive是Facebook开发后来贡献给了Apache的一套用于进行数据仓库管理的工具,提供了对大量数据的读写以及管理功能
- Hive提供了类SQL(Hive QL -> HQL)来管理HDFS上的大量数据,底层会将HQL转化为MapReduce程序来执行,因此执行效率相对较低,适合于离线批处理/离线分析场景
特点
- 优点
- 提供了类SQL来进行操作,也就意味着Hive相对易于学习,易于推广
- 避免程序员去学习MapReduce的规则,在Hive底层会自动将SQL转化为MapReduce,降低了程序员的学习成本
- Hive能够批量的处理数据,因此在大数据场景中更具有优势
- 支持用户自定义函数,允许用户根据需求定义当前场景可以使用的函数
- 缺点
- Hive采用了类SQL语言,使得它本身的表达能力比较有限:当需求比较复杂的时候,此时SQL的写法可能比较复杂,甚至于SQL无法表达
- Hive的效率相对比较低:本身MapReduce的执行效率就不高,Hive还要将SQL转化为MapReduce,然后才能执行,所以就导致Hive的执行效率更低
- Hive不擅长做数据挖掘
安装
MySQL安装
-
卸载Centos7中自带的残缺的MySQL
rpm -qa | grep -i mariadb | xargs rpm -ev --nodeps
-
卸载MySQL
rpm -qa | grep -i mysql | xargs rpm -ev --nodeps
-
查看是否有mysql的数据目录
cd /var/lib/ ls mysql* # 如果出现了和mysql相关的目录或者文件,删除掉
-
查看是否有my.cnf
cd /usr/ ls my.cnf # 如果出现,则删除掉 cd /etc/ ls my.cnf # 如果出现,则删除掉
-
查看是否有mysql.history
cd /root/ ls .mysql* # 如果出现,则删除掉
-
上传MySQL的安装包
cd /opt rz # 选择MySQL的安装包上传
-
解压
tar -xvf mysql-5.7.33-1.el7.x86_64.rpm-bundle.tar
-
安装MySQL
rpm -ivh mysql-community-common-5.7.33-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-5.7.33-1.el7.x86_64.rpm rpm -ivh mysql-community-devel-5.7.33-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-compat-5.7.33-1.el7.x86_64.rpm rpm -ivh mysql-community-client-5.7.33-1.el7.x86_64.rpm rpm -ivh mysql-community-server-5.7.33-1.el7.x86_64.rpm
-
启动MySQL
systemctl start mysqld # 查看状态 systemctl status mysqld
-
查看MySQL初始密码
grep 'temporary password' /var/log/mysqld.log
-
登录MySQL
mysql -u root -p # 回车,输入密码
-
修改MySQL的登录密码
# 从MySQL5.5开始,要求登录密码至少12个字符,要求至少出现1个大写字母,至少1个小写字母,至少1个数字,至少1个符号 # 所以在上课过程中,需要更改MySQL的密码策略 set global validate_password_length=4; set global validate_password_policy=0; # 更改MySQL的初始密码 set password for 'root'@'localhost' = 'root';
-
修改MySQL的权限策略
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option; flush privileges;
-
退出MySQL
quit;
-
重启MySQL
systemctl restart mysqld
Hive安装
-
进入/opt目录下,上传Hive的安装包
cd /opt rz # 选择Hive的安装包上传
-
解压
tar -xvf apache-hive-3.1.2-bin.tar.gz
-
重命名
mv apache-hive-3.1.2-bin hive-3.1.2
-
修改环境变量
vim /etc/profile.d/hivehome.sh
在文件中添加
export HIVE_HOME=/opt/hive-3.1.2 export PATH=$PATH:$HIVE_HOME/bin
保存退出,重新生效
source /etc/profile.d/hivehome.sh
测试
hive --version
-
解决Hive的连接池的冲突jar包问题
cd hive-3.1.2/lib/ rm -rf guava-19.0.jar cp /opt/hadoop-3.1.3/share/hadoop/common/lib/guava-27.0-jre.jar ./
-
解决Hive的日志jar包冲突
mv log4j-slf4j-impl-2.10.0.jar log4j-slf4j-impl-2.10.0.bak
-
上传MySQL的驱动jar包
rz # 选择jar包上传
-
进入Hive的配置目录下
cd ../conf # 上传Hive的配置文件hive-site.xml
-
修改Hadoop的配置
vim /opt/hadoop-3.1.3/etc/hadoop/mapred-site.xml
在文件中添加
<property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property>
-
进入MySQL,创建Hive的元数据库
mysql -u root -p # 输入密码 create database hive; quit;
-
初始化Hive的元数据库
schematool -initSchema -dbType mysql --verbose
-
启动Hadoop
start-all.sh
-
启动Hive的元数据服务和后台服务
hive --service hiveserver2 & hive --service metastore &
-
进入Hive的命令行
hive