大数据项目实战之数据仓库:用户行为采集平台——第4章 用户行为数据采集模块
创始人
2024-05-31 13:44:09
0

第4章 用户行为数据采集模块

4.1 数据通道

Untitled

4.2 环境准备

4.2.1 集群所有进程查看脚本

1)在/home/atguigu/bin目录下创建脚本xcall

[atguigu@hadoop102 bin]$ vim xcall

2)在脚本中编写如下内容

#! /bin/bashfor i in hadoop102 hadoop103 hadoop104
doecho --------- $i ----------ssh $i "$*"
done

3)修改脚本执行权限

[atguigu@hadoop102 bin]$ chmod 777 xcall

4)启动脚本

[atguigu@hadoop102 bin]$ xcall jps

4.2.2 Hadoop安装

1)安装步骤

详见:尚硅谷大数据技术之Hadoop(入门)

(1)集群规划

hadoop102hadoop103hadoop104
HDFSNameNode
DataNode
DataNodeDataNode
SecondaryNameNode
YARNNodeManagerResourcemanager
NodeManager
NodeManager

注意:尽量使用离线方式安装

2)项目经验

(1)项目经验之HDFS存储多目录

①生产环境服务器磁盘情况

Untitled

②在hdfs-site.xml文件中配置多目录,注意新挂载磁盘的访问权限问题

HDFS的DataNode节点保存数据的路径由dfs.datanode.data.dir参数决定,其默认值为file://${hadoop.tmp.dir}/dfs/data,若服务器有多个磁盘,必须对该参数进行修改。如服务器磁盘如上图所示,则该参数应修改为如下的值。

dfs.datanode.data.dirfile:///dfs/data1,file:///hd2/dfs/data2,file:///hd3/dfs/data3,file:///hd4/dfs/data4

注意:因为每台服务器节点的磁盘情况不同,所以这个配置配完之后,不需要分发

(2)项目经验之集群数据均衡

①节点间数据均衡

开启数据均衡命令:

start-balancer.sh -threshold 10

对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整。

停止数据均衡命令

stop-balancer.sh

注意:于HDFS需要启动单独的Rebalance Server来执行Rebalance操作,所以尽量不要在NameNode上执行start-balancer.sh,而是找一台比较空闲的机器。

②磁盘间数据均衡

生成均衡计划(我们只有一块磁盘,不会生成计划

hdfs diskbalancer -plan hadoop103

执行均衡计划

hdfs diskbalancer -execute hadoop103.plan.json

查看当前均衡任务的执行情况

hdfs diskbalancer -query hadoop103

取消均衡任务

hdfs diskbalancer -cancel hadoop103.plan.json

(3)项目经验之Hadoop参数调优

①HDFS参数调优hdfs-site.xml

The number of Namenode RPC server threads that listen to requests from clients. If dfs.namenode.servicerpc-address is not configured then Namenode RPC server threads listen to requests from all nodes.
NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。
对于大集群或者有大量客户端的集群来说,通常需要增大参数dfs.namenode.handler.count的默认值10。
dfs.namenode.handler.count10

dfs.namenode.handler.count=20×〖log〗_e^(Cluster Size),比如集群规模为8台时,此参数设置为41。可通过简单的python代码计算该值,代码如下。

[atguigu@hadoop102 ~]$ python
Python 2.7.5 (default, Apr 11 2018, 07:36:10) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> print int(20*math.log(8))
41
>>> quit()

②YARN参数调优yarn-site.xml

情景描述:总共7台机器,每天几亿条数据,数据源->Flume->Kafka->HDFS->Hive

面临问题:数据统计主要用HiveSQL,没有数据倾斜,小文件已经做了合并处理,开启的JVM重用,而且IO没有阻塞,内存用了不到50%。但是还是跑的非常慢,而且数据量洪峰过来时,整个集群都会宕掉。基于这种情况有没有优化方案。

解决办法:

内存利用率不够。这个一般是Yarn的2个配置造成的,单个任务可以申请的最大内存大小,和Hadoop单个节点可用内存大小。调节这两个参数能提高系统内存的利用率。

(a)yarn.nodemanager.resource.memory-mb

表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。

(b)yarn.scheduler.maximum-allocation-mb

单个任务可申请的最多物理内存量,默认是8192(MB)。

4.2.3 Zookeeper安装

1)安装步骤

详见:尚硅谷大数据技术之Zookeeper

4.2.4 Kafka安装

1)安装步骤

详见:尚硅谷大数据技术之Kafka

4.2.5 Flume安装

按照采集通道规划,需在hadoop102,hadoop103,hadoop104三台节点分别部署一个Flume。可参照以下步骤先在hadoop102安装,然后再进行分发。

1)安装步骤

详见:尚硅谷大数据技术之Flume

2)分发Flume

[atguigu@hadoop102 ~]$ xsync /opt/module/flume/

3)项目经验

(1)堆内存调整

Flume堆内存通常设置为4G或更高,配置方式如下:

修改/opt/module/flume/conf/flume-env.sh文件,配置如下参数**(虚拟机环境暂不配置)**

export JAVA_OPTS="-Xms4096m -Xmx4096m -Dcom.sun.management.jmxremote"

注:

-Xms表示JVM Heap(堆内存)最小尺寸,初始分配;

-Xmx 表示JVM Heap(堆内存)最大允许的尺寸,按需分配。

4.3 日志采集Flume

4.3.1 日志采集Flume配置概述

按照规划,需要采集的用户行为日志文件分布在hadoop102,hadoop103两台日志服务器,故需要在hadoop102,hadoop103两台节点配置日志采集Flume。日志采集Flume需要采集日志文件内容,并对日志格式(JSON)进行校验,然后将校验通过的日志发送到Kafka。

此处可选择TaildirSource和KafkaChannel,并配置日志校验拦截器。

选择TailDirSource和KafkaChannel的原因如下:

1)TailDirSource

TailDirSource相比ExecSource、SpoolingDirectorySource的优势

TailDirSource:断点续传、多目录。Flume1.6以前需要自己自定义Source记录每次读取文件位置,实现断点续传。

ExecSource可以实时搜集数据,但是在Flume不运行或者Shell命令出错的情况下,数据将会丢失。

SpoolingDirectorySource监控目录,支持断点续传。

2)KafkaChannel

采用Kafka Channel,省去了Sink,提高了效率。

日志采集Flume关键配置如下:

Untitled

4.3.2 日志采集Flume配置实操

1)创建Flume配置文件

在hadoop102节点的Flume的job目录下创建file_to_kafka.conf

[atguigu@hadoop102 flume]$ mkdir job
[atguigu@hadoop102 flume]$ vim job/file_to_kafka.conf

2)配置文件内容如下

#定义组件
a1.sources = r1
a1.channels = c1#配置source
a1.sources.r1.type = TAILDIR
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /opt/module/applog/log/app.*
a1.sources.r1.positionFile = /opt/module/flume/taildir_position.json
a1.sources.r1.interceptors =  i1
a1.sources.r1.interceptors.i1.type = com.atguigu.gmall.flume.interceptor.ETLInterceptor$Builder#配置channel
a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel
a1.channels.c1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092,hadoop104:9092
a1.channels.c1.kafka.topic = topic_log
a1.channels.c1.parseAsFlumeEvent = false#组装 
a1.sources.r1.channels = c1

3)编写Flume拦截器

(1)创建Maven工程flume-interceptor

(2)创建包:com.atguigu.gmall.flume.interceptor

(3)在pom.xml文件中添加如下配置

org.apache.flumeflume-ng-core1.9.0providedcom.alibabafastjson1.2.62
maven-compiler-plugin2.3.21.81.8maven-assembly-pluginjar-with-dependenciesmake-assemblypackagesingle

(4)在com.atguigu.gmall.flume.utils包下创建JSONUtil类

package com.atguigu.gmall.flume.utils;import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONException;public class JSONUtil {
/*
* 通过异常判断是否是json字符串
* 是:返回true  不是:返回false
* */public static boolean isJSONValidate(String log){try {JSONObject.parseObject(log);return true;}catch (JSONException e){return false;}}
}

(5)在com.atguigu.gmall.flume.interceptor包下创建ETLInterceptor类

package com.atguigu.gmall.flume.interceptor;import com.atguigu.gmall.flume.utils.JSONUtil;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;import java.nio.charset.StandardCharsets;
import java.util.Iterator;
import java.util.List;public class ETLInterceptor implements Interceptor {@Overridepublic void initialize() {}@Overridepublic Event intercept(Event event) {//1、获取body当中的数据并转成字符串byte[] body = event.getBody();String log = new String(body, StandardCharsets.UTF_8);//2、判断字符串是否是一个合法的json,是:返回当前event;不是:返回nullif (JSONUtil.isJSONValidate(log)) {return event;} else {return null;}}@Overridepublic List intercept(List list) {Iterator iterator = list.iterator();while (iterator.hasNext()){Event next = iterator.next();if(intercept(next)==null){iterator.remove();}}return list;}public static class Builder implements Interceptor.Builder{@Overridepublic Interceptor build() {return new ETLInterceptor();}@Overridepublic void configure(Context context) {}}@Overridepublic void close() {}
}

(6)打包

Untitled

(7)需要先将打好的包放入到hadoop102的/opt/module/flume/lib文件夹下面。

4.3.3 日志采集Flume测试

1)启动Zookeeper、Kafka集群

2)启动hadoop102的日志采集Flume

[atguigu@hadoop102 flume]$ bin/flume-ng agent -n a1 -c conf/ -f job/file_to_kafka.conf -Dflume.root.logger=info,console

3)启动一个Kafka的Console-Consumer

[atguigu@hadoop102 kafka]$ bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --topic topic_log

4)生成模拟数据

[atguigu@hadoop102 ~]$ lg.sh

5)观察Kafka消费者是否能消费到数据

4.3.4 日志采集Flume启停脚本

1)分发日志采集Flume配置文件和拦截器

若上述测试通过,需将hadoop102节点的Flume的配置文件和拦截器jar包,向另一台日志服务器发送一份。

[atguigu@hadoop102 flume]$ scp -r job hadoop103:/opt/module/flume/
[atguigu@hadoop102 flume]$ scp lib/flume-interceptor-1.0-SNAPSHOT-jar-with-dependencies.jar hadoop103:/opt/module/flume/lib/

2)方便起见,此处编写一个日志采集Flume进程的启停脚本

在hadoop102节点的/home/atguigu/bin目录下创建脚本f1.sh

[atguigu@hadoop102 bin]$ vim f1.sh

在脚本中填写如下内容

#!/bin/bashcase $1 in
"start"){for i in hadoop102 hadoop103doecho " --------启动 $i 采集flume-------"ssh $i "nohup /opt/module/flume/bin/flume-ng agent -n a1 -c /opt/module/flume/conf/ -f /opt/module/flume/job/file_to_kafka.conf >/dev/null 2>&1 &"done
};; 
"stop"){for i in hadoop102 hadoop103doecho " --------停止 $i 采集flume-------"ssh $i "ps -ef | grep file_to_kafka | grep -v grep |awk  '{print \$2}' | xargs -n1 kill -9 "done};;
esac

3)增加脚本执行权限

[atguigu@hadoop102 bin]$ chmod 777 f1.sh

4)f1启动

[atguigu@hadoop102 module]$ f1.sh start

5)f2停止

[atguigu@hadoop102 module]$ f1.sh stop

相关内容

热门资讯

师恩难忘初三优秀作文600字... 师恩难忘初三优秀作文600字 篇一师恩难忘初三,是我人生中最难忘的一年。这一年里,我经历了许多事情,...
半瓢初三我沉浮 -初中作文(... 半瓢初三我沉浮 -初中作文 篇一初三,是一个让人充满期待和焦虑的阶段。对于我来说,初三的生活就像是在...
感谢你我的老师初三作文(经典... 感谢你我的老师初三作文 篇一在我初三的这一年里,我结识了许许多多的老师,他们用他们的知识和智慧,引导...
初三毕业留言英文大全(精简3... 初三毕业留言英文大全 篇一Dear Classmates,As we reach the end o...
献给全天下为学生带来温暖的老... 献给全天下为学生带来温暖的老师们初三作文 篇一老师,您是我们成长道路上的指路明灯,是我们学习生活中的...
忘不了的那个人初三作文【精彩... 忘不了的那个人初三作文 篇一那个人,是我初三时候班上的一位同学,他的名字叫李明。李明是一个非常聪明而...
九年级作文我的新老师(优质6... 九年级作文我的新老师 篇一我的新老师我很庆幸在这个学期里遇到了一位特别好的新老师,她就是我们班的班主...
雨夜初三上册语文第一单元作文... 雨夜初三上册语文第一单元作文450字 篇一雨夜初三上册语文第一单元作文450字 篇一 雨夜初三上册语...
初三语文作文(优秀6篇) 初三语文作文 篇一:我的偶像作为一个初三学生,我有许多偶像。他们有的是优秀的运动员,有的是杰出的科学...
初三毕业赠言(通用3篇) 初三毕业赠言 篇一初三毕业了,时间过得真快。回顾这三年的学习生活,我不禁感慨万分。在这里,我想给同学...
我的初三生活作文【精选6篇】 我的初三生活作文 篇一初三,对于每一个初中生来说都是一个重要的阶段。对我而言,初三不仅仅是一个学习的...
写初三的幸福作文500字(优... 写初三的幸福作文500字 篇一初三是学生生活中最为重要的一年,也是最为紧张和忙碌的一年。然而,尽管充...
初三写哈尔滨作文范文【通用6... 初三写哈尔滨作文范文 篇一哈尔滨,一个美丽的城市哈尔滨是我国东北地区的一座美丽城市,也是我最喜欢的城...
初三优秀范文记叙(优选6篇) 初三优秀范文记叙 篇一勇敢面对变化这个寒假,我经历了一次意想不到的变化。爸爸妈妈告诉我他们要搬到另一...
灯初三作文【精彩6篇】 灯初三作文 篇一初三晚上,我和爸爸一起准备放灯笼。我们先去买了一些彩纸、竹签和蜡烛,然后回家开始动手...
我眼中的初三作文800字记叙... 我眼中的初三作文800字记叙文 篇一初三,对于每个初中生来说都是一个特殊的阶段。它意味着告别稚嫩的初...
做粥成瘾的妈妈初三作文【最新... 做粥成瘾的妈妈初三作文 篇一做粥成瘾的妈妈我有一个特别的妈妈,她对做粥有着特别的热爱,甚至可以说是成...
战胜自己才是赢家初三作文(精... 战胜自己才是赢家初三作文 篇一近年来,越来越多的人开始关注自我成长和个人发展。而在这个不断进步的社会...
唯一的爱初三作文【经典3篇】 唯一的爱初三作文 篇一标题:家人的唯一的爱家庭是每个人一生中最重要的组成部分,而在家庭中,父母和兄弟...
关于诚实的作文初一25篇【优... 关于诚实的作文初一25篇 篇一诚实是一种美德,它是我们与他人建立信任的基石。诚实是指言行一致,真实可...