300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 电商数仓笔记2_用户行为采集(数据采集模块)

电商数仓笔记2_用户行为采集(数据采集模块)

时间:2021-05-12 16:56:56

相关推荐

电商数仓笔记2_用户行为采集(数据采集模块)

电商数仓

一、数据采集模块1、集群所有进程查看脚本2、Hadoop安装(1)项目经验之HDFS存储多目录(2)集群数据均衡(3)项目经验之支持LZO压缩配置(4)项目经验之LZO创建索引(5)项目经验之基准测试(6)项目经验之Hadoop参数调优(6.1)HDFS参数调优hdfs-site.xml(6.2)YARN参数调优yarn-site.xml

一、数据采集模块

1、集群所有进程查看脚本

(1)在/home/lyh/bin目录下创建脚本xcall.sh

[lyh@hadoop102 bin]$ vim xcall.sh

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

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

(3)修改脚本执行权限

[lyh@hadoop102 bin]$ chmod 777 xcall.sh

(4)启动脚本

[lyh@hadoop102 bin]$ xcall.sh jps

2、Hadoop安装

详情见前面的笔记hadoop

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

(1)给Linux系统新增加一块硬盘

参考:/yujianadu/p/10750698.html

(2)生产环境服务器磁盘情况

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

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

dfs.datanode.data.dir

file:///dfs/data1,file:///hd2/dfs/data2,file:///hd3/dfs/data3,file:///hd4/dfs/data4

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

(2)集群数据均衡

1)节点间数据均衡

(1)开启数据均衡命令

start-balancer.sh -threshold 10

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

(2)停止数据均衡命令

stop-balancer.sh

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

2)磁盘间数据均衡

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

hdfs diskbalancer -plan hadoop103

(2)执行均衡计划

hdfs diskbalancer -execute hadoop103.plan.json

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

hdfs diskbalancer -query hadoop103

(4)取消均衡任务

hdfs diskbalancer -cancel hadoop103.plan.json

(3)项目经验之支持LZO压缩配置

1)hadoop-lzo编译

hadoop本身并不支持lzo压缩,故需要使用twitter提供的hadoop-lzo开源组件。hadoop-lzo需依赖hadoop和lzo进行编译,编译步骤如下。

Hadoop支持LZO0. 环境准备maven(下载安装,配置环境变量,修改sitting.xml加阿里云镜像)gcc-c++zlib-develautoconfautomakelibtool通过yum安装即可,yum -y install gcc-c++ lzo-devel zlib-devel autoconf automake libtool1. 下载、安装并编译LZOwget /opensource/lzo/download/lzo-2.10.tar.gztar -zxvf lzo-2.10.tar.gzcd lzo-2.10./configure -prefix=/usr/local/hadoop/lzo/makemake install2. 编译hadoop-lzo源码2.1 下载hadoop-lzo的源码,下载地址:/twitter/hadoop-lzo/archive/master.zip2.2 解压之后,修改pom.xml<hadoop.current.version>3.1.3</hadoop.current.version>2.3 声明两个临时环境变量export C_INCLUDE_PATH=/usr/local/hadoop/lzo/includeexport LIBRARY_PATH=/usr/local/hadoop/lzo/lib 2.4 编译进入hadoop-lzo-master,执行maven编译命令mvn package -Dmaven.test.skip=true2.5 进入target,hadoop-lzo-0.4.21-SNAPSHOT.jar 即编译成功的hadoop-lzo组件

2)将编译好后的hadoop-lzo-0.4.20.jar 放入hadoop-3.1.3/share/hadoop/common/

[lyh@hadoop102 common]$ pwd

/opt/module/hadoop-3.1.3/share/hadoop/common

[lyh@hadoop102 common]$ ls

hadoop-lzo-0.4.20.jar

3)同步hadoop-lzo-0.4.20.jar到hadoop103、hadoop104

[lyh@hadoop102 common]$ xsync hadoop-lzo-0.4.20.jar

4)core-site.xml增加配置支持LZO压缩

<configuration><property><name>pression.codecs</name><value>org.apache.press.GzipCodec,org.apache.press.DefaultCodec,org.apache.press.BZip2Codec,org.apache.press.SnappyCodec,pression.lzo.LzoCodec,pression.lzo.LzopCodec</value></property><property><name>pression.codec.lzo.class</name><value>pression.lzo.LzoCodec</value></property></configuration>

5)同步core-site.xml到hadoop103、hadoop104

[lyh@hadoop102 hadoop]$ xsync core-site.xml

6)启动及查看集群

[lyh@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh

[lyh@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh

7)测试-数据准备

[lyh@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /input

[lyh@hadoop102 hadoop-3.1.3]$ hadoop fs -put README.txt /input

8)测试-压缩

[lyh@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -Dmapreduce.press=true -Dmapreduce.press.codec=pression.lzo.LzopCodec /input /output

(4)项目经验之LZO创建索引

1)创建LZO文件的索引

LZO压缩文件的可切片特性依赖于其索引,故我们需要手动为LZO压缩文件创建索引。若无索引,则LZO文件的切片只有一个。

2)测试

(1)将bigtable.lzo(200M)上传到集群的根目录

[lyh@hadoop102 software]$ hadoop fs -mkdir /input

[lyh@hadoop102 software]$ hadoop fs -put bigtable.lzo /input

(2)执行wordcount程序

[lyh@hadoop102 software]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat /input /output1

(3)对上传的LZO文件建索引

[lyh@hadoop102 software]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar pression.lzo.DistributedLzoIndexer /input/bigtable.lzo

(4)再次执行WordCount程序

[lyh@hadoop102 software]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat /input /output2

3)注意:如果以上任务,在运行过程中报如下异常

解决办法:在hadoop102的/opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml文件中增加如下配置,然后分发到hadoop103、hadoop104服务器上,并重新启动集群。

<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true --><property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value></property>

(5)项目经验之基准测试

在企业中非常关心每天从Java后台拉取过来的数据,需要多久能上传到集群?消费者关心多久能从HDFS上拉取需要的数据?为了搞清楚HDFS的读写性能,生产环境上非常需要对集群进行压测。

HDFS的读写性能主要受网络和磁盘影响比较大。为了方便测试,将hadoop102、hadoop103、hadoop104虚拟机网络都设置为100mbps。100Mbps单位是bit;10M/s单位是byte ; 1byte=8bit,100Mbps/8=12.5M/s

测试网速:

(1)来到hadoop102的/opt/module目录,创建一个

[lyh@hadoop102 software]$ python -m SimpleHTTPServer

(2)在Web页面上访问

hadoop102:8000

1)测试HDFS写性能

(1)写测试底层原理

(2)测试内容:向HDFS集群写10个128M的文件

[lyh@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB-02-09 10:43:16,853 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write-02-09 10:43:16,854 INFO fs.TestDFSIO: Date & time: Tue Feb 09 10:43:16 CST -02-09 10:43:16,854 INFO fs.TestDFSIO: Number of files: 10-02-09 10:43:16,854 INFO fs.TestDFSIO: Total MBytes processed: 1280-02-09 10:43:16,854 INFO fs.TestDFSIO: Throughput mb/sec: 1.61-02-09 10:43:16,854 INFO fs.TestDFSIO: Average IO rate mb/sec: 1.9-02-09 10:43:16,854 INFO fs.TestDFSIO: IO rate std deviation: 0.76-02-09 10:43:16,854 INFO fs.TestDFSIO:Test exec time sec: 133.05-02-09 10:43:16,854 INFO fs.TestDFSIO:

注意:nrFiles n为生成mapTask的数量,生产环境一般可通过hadoop103:8088查看CPU核数,设置为(CPU核数 - 1)

Number of files:生成mapTask数量,一般是集群中(CPU核数 - 1),我们测试虚拟机就按照实际的物理内存-1分配即可。(目标,让每个节点都参与测试)

Total MBytes processed:单个map处理的文件大小

Throughput mb/sec:单个mapTak的吞吐量

计算方式:处理的总文件大小/每一个mapTask写数据的时间累加

集群整体吞吐量:生成mapTask数量*单个mapTak的吞吐量

Average IO rate mb/sec::平均mapTak的吞吐量

计算方式:每个mapTask处理文件大小/每一个mapTask写数据的时间

全部相加除以task数量

IO rate std deviation:方差、反映各个mapTask处理的差值,越小越均衡

注意:如果测试过程中,出现异常

①可以在yarn-site.xml中设置虚拟内存检测为false

<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true --><property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value></property>

②分发配置并重启Yarn集群

(3)测试结果分析

①由于副本1就在本地,所以该副本不参与测试

一共参与测试的文件:10个文件 * 2个副本 = 20个

压测后的速度:1.61

实测速度:1.61M/s * 20个文件 ≈ 32M/s

三台服务器的带宽:12.5 + 12.5 + 12.5 ≈ 30m/s

所有网络资源都已经用满。

如果实测速度远远小于网络,并且实测速度不能满足工作需求,可以考虑采用固态硬盘或者增加磁盘个数

②如果客户端不在集群节点,那就三个副本都参与计算

2)测试HDFS读性能

(1)测试内容:读取HDFS集群10个128M的文件

[lyh@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 128MB-02-09 11:34:15,847 INFO fs.TestDFSIO: ----- TestDFSIO ----- : read-02-09 11:34:15,847 INFO fs.TestDFSIO: Date & time: Tue Feb 09 11:34:15 CST -02-09 11:34:15,847 INFO fs.TestDFSIO: Number of files: 10-02-09 11:34:15,847 INFO fs.TestDFSIO: Total MBytes processed: 1280-02-09 11:34:15,848 INFO fs.TestDFSIO: Throughput mb/sec: 200.28-02-09 11:34:15,848 INFO fs.TestDFSIO: Average IO rate mb/sec: 266.74-02-09 11:34:15,848 INFO fs.TestDFSIO: IO rate std deviation: 143.12-02-09 11:34:15,848 INFO fs.TestDFSIO:Test exec time sec: 20.83

(2)删除测试生成数据

[lyh@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -clean

(3)测试结果分析:为什么读取文件速度大于网络带宽?由于目前只有三台服务器,且有三个副本,数据读取就近原则,相当于都是读取的本地磁盘数据,没有走网络。

3)使用Sort程序评测MapReduce(一般不测评这个)

(1)使用RandomWriter来产生随机数,每个节点运行10个Map任务,每个Map产生大约1G大小的二进制随机数

[lyh@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar randomwriter random-data

(2)执行Sort程序

[lyh@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar sort random-data sorted-data

(3)验证数据是否真正排好序了

[lyh@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar testmapredsort -sortInput random-data -sortOutput sorted-data

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

(6.1)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。<property><name>dfs.namenode.handler.count</name><value>10</value></property>

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

(6.2)YARN参数调优yarn-site.xml

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

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

(2)解决办法:

NodeManager内存和服务器实际内存配置尽量接近,如服务器有128g内存,但是NodeManager默认内存8G,不修改该参数最多只能用8G内存。NodeManager使用的CPU核数和服务器CPU核数尽量接近。

①yarn.nodemanager.resource.memory-mb

NodeManager使用内存数

②yarn.nodemanager.resource.cpu-vcores NodeManager

使用CPU核数

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。