日志数据采集

371 阅读3分钟

Hadoop经验之谈

1. LZO压缩
    需要编译hadoop,手动为LZO压缩文件创建索引,没有索引,则LZO文件的切片只有一个, 128MB一个切片

2. 基准测试
    HDFS读写性能测试

3. 参数调优
    HDFS参数调优
    1. dfs.namenode.handler.count=20*log2(集群规模)
       用来处理不同 DataNode 的并发心跳
    
    YARN参数调优
    1. yarn.nodemanager.resource.memory-mb
       YARN 可使用的物理内存总量 默认 8G
    2. yarn.scheduler.maximum-allocation-mb
       单个任务可申请的最多物 理内存量,默认是 8192MB

shell 脚本

#! /bin/bash

case $1 in
"start"){
    for i in hadoop102 hadoop103 hadoop104
    do
    ssh $i "/opt/module/zookeeper-3.4.10/bin/zkServer.sh start"
    done
};; 
"stop"){
    for i in hadoop102 hadoop103 hadoop104
    do
    ssh $i "/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop"
    done
};;

"status"){
    for i in hadoop102 hadoop103 hadoop104
    do
    ssh $i "/opt/module/zookeeper-3.4.10/bin/zkServer.sh status"
    done
};;
esac

flume收集日志 --- 用户行为数据和启动日志

1. 在 master 和 slave1上开启 flume 
2. log文件在 /usr/local/src/sub/logcollect/logs

3. 使用TairDir source  flume1.7支持断点续传的功能,多目录
4. 采用kafka channel 这个就省去了sink

5. 对日志文件进行简单的ETL处理和区分
   5.1 ETL拦截器
       获取事件的 body 信息
       根据 埋点的数据 包含的信息来区分 是 "启动日志"还是"事件日志"
       
   5.1 类型区分拦截器
       获取 事件的 body 和 header信息
       根据 埋点的数据 包含的信息来区分 是 "启动日志"还是"事件日志"
       给对应的日志 在header加上标识 topic 
   
6. channel 选择器
    根据事件的 header 的标识 将 "启动日志"还是"事件日志" 打到不同的 kafka topic
    
    
7. 开启flume 脚本  到 kafka channel 的脚本

   7.1f1.sh
   7.2 
   #! /bin/bash
   # flume读取日志文件的启动和关闭脚本
    case $1 in
    "start"){
    for i in master slave1
    do
        echo " --------启动 $i 采集 flume-------"
        ssh $i "nohup /usr/local/src/apache-flume-1.7.0-bin/bin/flume-ng agent --name a1 --conf-file /usr/local/src/apache-flume-1.7.0-bin/job/dir-log-flume-kafka.conf -Dflume.root.logger=INFO,LOGFILE > /usr/local/src/apache-flume-1.7.0-bin/job/logs/test 2>&1 &"
    done
    };;
    "stop"){
    for i in master slave1
    do
    echo " --------停止 $i 采集 flume-------"
    ssh $i "ps -ef | grep dir-log-flume-kafka.conf | grep -v grep|awk '{print \$2}' | xargs kill"
    done
    };;
    esac
    
    7.3 解释命令行
    # 取SecondaryNameNode进程信息
    ps -ef | grep SecondaryNameNode
    # 过滤带有 grep 一行的数据
    ps -ef | grep SecondaryNameNode | grep -v grep
    # 空行切割 将 第二个原始 打印出来
    ps -ef | grep SecondaryNameNode | grep -v grep | awk '{print $2}'
    # 将前面打印出来的数据作为参数 给后面的命令
    ps -ef | grep SecondaryNameNode | grep -v grep | awk '{print $2}' | xargs kill

#### kafka
   1. 查看主题: kafka-topics.sh --zookeeper master:2181 --list
   2. 消费数据:kafka-console-consumer.sh --bootstrap-server master:9092 --from-beginning --topic topic_start
   
   3. kafka 压力测试
   自带测试
   
   4. 配置多少台kafka
    
    kafka机器数 = 2 * (峰值生成速度*副本数/100) + 1
    
    
#### 开启flume脚本 kakfa channel 到 HDFS 的脚本
   f2.sh
   flume 配置文件 slave2
   /usr/local/src/apache-flume-1.7.0-bin/job/kafka-flume-hdfs.conf
   
   注意:flume 消费kafka 写到 HDFS 的时候,默认是读一条数据写一个文件,这样就会参数大量的小文件
   需要配置滚动时间
   
   要变成Lzo压缩

flume内存优化

"-XMs4096m -Xmx4096 -Dcom.sum.managment,jmxremote"

source
    taildir 多目录、断点续传 1.7版本后
    数据重复 修改源码,修改成事务,或者下级去重
    taildir 不支持递归遍历读取文件 默认不支持,修改源码

channle
    file 可靠性高、效率底 100万 event
    memory 可靠性底、效率高 100 event
    kafka 可靠性高、效率高、旦下一级必须是kafka
    
sink
    hdfs sink 需要注意小文件
    时间 1小时 滚动一次 或者到达128m 
    文件名.lzo.tmp => 文件名.lzo

put 事务和 take 事务

"拦截器"
    ETL拦截器
       event events
       body 就是日志数据
    分类拦截器
       根据 body 分类,再到 header 做标记
"选择器"
   根据event 上做的标记 发送到不同的kafka topic
"监控器"
   Ganglia