大数据实训笔记Day06

Flume

其他组件

Selector

  1. Selector是Source的子组件,Selector是配置在Source上的,Selector决定了数据的分发方式

  2. Selector提供了两种分发方式

    1. replicating:复制模式。当节点收到数据之后,会将数据复制之后分发给每一个节点,此时数据接收的节点收到的数据是相同的,这种分发方式通常用于数据的备份或者数据的不同处理
    2. Multiplexing:路由模式/多路复用模式。当节点收到数据之后,会根据数据的headers中的指定字段的值来决定发送给哪一个节点,此时注意,每一个节点收到的数据是不相同的
  3. 案例

    1. 格式文件

      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
      
    2. 启动命令

      flume-ng agent -n a1 -c $FLUME_HOME/conf -f multiplexing.conf -Dflume.root.logger=INFO,console
      
    3. 发送数据

      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

  1. Interceptor也是Source的子组件,即Interceptor也是配置在Source上

  2. 不同于Selector,一个Source上可以配置多个Interceptor,构成拦截器链

  3. Timestamp Interceptor:在数据的headers部分来添加一个timestamp字段用于标记数据被收集的时间

    1. 格式文件

      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
      
    2. 启动命令

      flume-ng agent -n a1 -c $FLUME_HOME/conf -f in.conf -Dflume.root.logger=INFO,console
      
  4. Host Interceptor:在数据的headers部分添加一个host字段,用于标记当前数据的来源主机

    1. 格式文件

      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
      
    2. 启动命令

      flume-ng agent -n a1 -c $FLUME_HOME/conf -f hostin.conf -Dflume.root.logger=INFO,console
      
  5. Static Iterceptor:在数据的headers部分来添加一个固定的指定字段

    1. 格式文件

      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
      
    2. 启动命令

      flume-ng agent -n a1 -c $FLUME_HOME/conf -f staticin.conf -Dflume.root.logger=INFO,console
      
  6. UUID Interceptor:会在数据的headers部分添加一个id字段用于标记这个数据的唯一性

    1. 格式文件

      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
      
    2. 启动命令

      flume-ng agent -n a1 -c $FLUME_HOME/conf -f uuidin.conf -Dflume.root.logger=INFO,console
      
  7. Search And Replace Interceptor:在使用的时候需要指定一个正则表达式,会将Event的body部分的数据替换为指定的形式

    1. 格式文件

      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
      
    2. 启动命令

      flume-ng agent -n a1 -c $FLUME_HOME/conf -f searchin.conf -Dflume.root.logger=INFO,console
      
    3. 发送数据

      curl -X POST -d '[{"headers":{"date":"2021-07-17"},"body":"P2P"}]' http://hadoop:8090
      
  8. Regex Filtering Interceptor:在使用的时候同样需要定义正则表达式,通过excludeEvets属性来控制表达式的结果。当excludeEvents属性的值为false的时候,那么符合正则表达式的数据会被留下;当excludeEvents属性的值为true的时候,那么表示不符合正则表达式的数据会被留下

    1. 格式文件

      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
      
    2. 启动命令

      flume-ng agent -n a1 -c $FLUME_HOME/conf -f regexin.conf -Dflume.root.logger=INFO,console
      

Processor

  1. Processor本质上就是一个Sink Group,在使用的时候,需要将一个或者多个Sink绑定到一个组中

  2. Processor提供了三种方式

    1. default:默认模式。如果不指定,那么默认使用的就是default模式,这种模式下,每一个Sink对应了一个单独的Sink Group
    2. failover:崩溃恢复模式。在使用的时候需要将多个Sink绑定到一个组中,通过优先级的大小决定将数据优先发送给哪一个Sink。如果高优先级的节点宕机,那么此时会启动低优先级的Sink
    3. Load Balance:负载均衡模式。采用不同的方式将数据平均的发送到每一个节点上,但是Flume原生的负载均衡方式不太好用
  3. Failover Processor案例

    1. 格式文件

      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
      
    2. 启动命令

      flume-ng agent -n a1 -c $FLUME_HOME/conf -f failover.conf -Dflume.root.logger=INFO,console
      

流程

在这里插入图片描述

Hive

简介

概述

  1. Hive是Facebook开发后来贡献给了Apache的一套用于进行数据仓库管理的工具,提供了对大量数据的读写以及管理功能
  2. Hive提供了类SQL(Hive QL -> HQL)来管理HDFS上的大量数据,底层会将HQL转化为MapReduce程序来执行,因此执行效率相对较低,适合于离线批处理/离线分析场景

特点

  1. 优点
    1. 提供了类SQL来进行操作,也就意味着Hive相对易于学习,易于推广
    2. 避免程序员去学习MapReduce的规则,在Hive底层会自动将SQL转化为MapReduce,降低了程序员的学习成本
    3. Hive能够批量的处理数据,因此在大数据场景中更具有优势
    4. 支持用户自定义函数,允许用户根据需求定义当前场景可以使用的函数
  2. 缺点
    1. Hive采用了类SQL语言,使得它本身的表达能力比较有限:当需求比较复杂的时候,此时SQL的写法可能比较复杂,甚至于SQL无法表达
    2. Hive的效率相对比较低:本身MapReduce的执行效率就不高,Hive还要将SQL转化为MapReduce,然后才能执行,所以就导致Hive的执行效率更低
    3. Hive不擅长做数据挖掘

安装

MySQL安装

  1. 卸载Centos7中自带的残缺的MySQL

    rpm -qa | grep -i mariadb | xargs rpm -ev --nodeps
    
  2. 卸载MySQL

    rpm -qa | grep -i mysql | xargs rpm -ev --nodeps
    
  3. 查看是否有mysql的数据目录

    cd /var/lib/
    ls mysql*
    # 如果出现了和mysql相关的目录或者文件,删除掉
    
  4. 查看是否有my.cnf

    cd /usr/
    ls my.cnf
    # 如果出现,则删除掉
    cd /etc/
    ls my.cnf
    # 如果出现,则删除掉
    
  5. 查看是否有mysql.history

    cd /root/
    ls .mysql*
    # 如果出现,则删除掉
    
  6. 上传MySQL的安装包

    cd /opt
    rz
    # 选择MySQL的安装包上传
    
  7. 解压

    tar -xvf mysql-5.7.33-1.el7.x86_64.rpm-bundle.tar
    
  8. 安装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
    
  9. 启动MySQL

    systemctl start mysqld
    # 查看状态
    systemctl status mysqld
    
  10. 查看MySQL初始密码

    grep 'temporary password' /var/log/mysqld.log
    
  11. 登录MySQL

    mysql -u root -p
    # 回车,输入密码
    
  12. 修改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';
    
  13. 修改MySQL的权限策略

    grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
    flush privileges;
    
  14. 退出MySQL

    quit;
    
  15. 重启MySQL

    systemctl restart mysqld
    

Hive安装

  1. 进入/opt目录下,上传Hive的安装包

    cd /opt
    rz
    # 选择Hive的安装包上传
    
  2. 解压

    tar -xvf apache-hive-3.1.2-bin.tar.gz
    
  3. 重命名

    mv apache-hive-3.1.2-bin hive-3.1.2
    
  4. 修改环境变量

    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
    
  5. 解决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 ./
    
  6. 解决Hive的日志jar包冲突

    mv log4j-slf4j-impl-2.10.0.jar log4j-slf4j-impl-2.10.0.bak
    
  7. 上传MySQL的驱动jar包

    rz
    # 选择jar包上传
    
  8. 进入Hive的配置目录下

    cd ../conf
    # 上传Hive的配置文件hive-site.xml
    
  9. 修改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>
    
  10. 进入MySQL,创建Hive的元数据库

    mysql -u root -p
    # 输入密码
    create database hive;
    quit;
    
  11. 初始化Hive的元数据库

    schematool -initSchema -dbType mysql --verbose
    
  12. 启动Hadoop

    start-all.sh
    
  13. 启动Hive的元数据服务和后台服务

    hive --service hiveserver2 &
    hive --service metastore &
    
  14. 进入Hive的命令行

    hive
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值