数仓项目配置安装

数仓项目

1、模板机的安装

最小化安装

CentOS-7

–使用NAT网络

/boot 1G 标准分区 ext4
swap  2G 标准分区 swap
/    47G 标准分区 ext4
root 123456
lu 123456

开始安装

2、模板机的处理

使用Xshell连接

ip addr//查看ip地址

安装必要环境。

[root@hadoop100 ~]# yum install -y epel-release psmisc nc net-tools rsync vim lrzsz ntp libzstd openssl-static tree iotop git

修改主机名

vim /etc/hostname
=================
hadoop100

修改网络配置

vim /etc/sysconfig/network-scripts/ifcfg-ens33
=====================
//修改
BOOTPROTO=static
//添加
IPADDR=192.168.1.102
PREFIX=24
GATEWAY=192.168.1.2
DNS1=192.168.1.2

添加主机之间的映射

[root@hadoop100 ~]# vim /etc/hosts
===========================
192.168.1.100 hadoop100
192.168.1.101 hadoop101
192.168.1.102 hadoop102
192.168.1.103 hadoop103
192.168.1.104 hadoop104

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld//关闭开机自启
systemctl status firewalld

在/opt目录下创建文件夹

mkdir module software
chown lu:lu module/ software/ //改变其拥有组

使用用户免密使用sudo

[root@hadoop102 ~]# vim /etc/sudoers
=====================
## Allow root to run any commands anywhere
root    ALL=(ALL)     ALL
lu   ALL=(ALL)     NOPASSWD:ALL

3、克隆三台机器

hadoop102-hadoop103-hadoop104

修改主机名(102为例)

vim /etc/hostname

修改IP地址(102为例)

vim /etc/sysconfig/network-scripts/ifcfg-ens33
=====================
//修改
BOOTPROTO=static
//添加
IPADDR=192.168.1.102
PREFIX=24
GATEWAY=192.168.1.2
DNS1=192.168.1.2

编写分发脚本

(102为例)

[lu@hadoop102 opt]$ cd /home/lu
[lu@hadoop102 ~]$ mkdir bin
[lu@hadoop102 ~]$ cd bin
[lu@hadoop102 bin]$ vim xsync
==================================
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
  echo Not Enough Arguement!
  exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
  echo ====================  $host  ====================
  #3. 遍历所有目录,挨个发送
  for file in $@
  do
    #4. 判断文件是否存在
    if [ -e $file ]
    then
      #5. 获取父目录
      pdir=$(cd -P $(dirname $file); pwd)
      #6. 获取当前文件的名称
      fname=$(basename $file)
      ssh $host "mkdir -p $pdir"
      rsync -av $pdir/$fname $host:$pdir
    else
      echo $file does not exists!
    fi
  done
done

修改脚本的执行权限并复制到/bin中全局使用

[lu@hadoop102 bin]$ chmod +x xsync
[lu@hadoop102 bin]$ sudo cp xsync /bin/

SSH配置免密登录

首先先相互认识一下

[lu@hadoop102 ~]$ ssh hadoop102 ls
[lu@hadoop102 ~]$ ssh hadoop103 ls
[lu@hadoop102 ~]$ ssh hadoop104 ls

就会出现/home/lu/.ssh

然后生成公钥和私钥

[lu@hadoop102 .ssh]$ ssh-keygen -t rsa

将公钥拷贝到要免密登录的目标机器上

[lu@hadoop102 .ssh]$ ssh-copy-id hadoop102
[lu@hadoop102 .ssh]$ ssh-copy-id hadoop103
[lu@hadoop102 .ssh]$ ssh-copy-id hadoop104

使用root重复以上动作

su
==
cd /root/.ssh

java进程脚本

jpsall

[lu@hadoop102 ~]$ cd /home/lu/bin
[lu@hadoop102 ~]$ vim jpsall
===================================
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
        echo =============== $host ===============
        ssh $host jps $@ | grep -v Jps
done

4、安装JDK

通过工具将JDKjar包导入到/opt/software

[lu@hadoop102 software]$ tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/

配置JDK环境变量:

[lu@hadoop102 ~]$ sudo vim /etc/profile.d/my_env.sh
======================
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin

source一下/etc/profile文件,让新的环境变量PATH生效

---->执行文件并从文件中加载变量及函数到执行环境

[lu@hadoop102 ~]$ source /etc/profile

测试JDK是否安装成功

[lu@hadoop102 ~]$ java -version
=====================
java version "1.8.0_212"

分发到其他机器

5、安装hadoop

以hadoop102为例

通过工具将hadoopjar包导入到/opt/software

[lu@hadoop102 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/

配置环境变量

sudo vim /etc/profile.d/my_env.sh
==========================
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

使文件生效

[lu@hadoop102 hadoop-3.1.3]$ source /etc/profile

测试是否安装成功

[lu@hadoop102 hadoop-3.1.3]$ hadoop version
=======================
Hadoop 3.1.3

6、集群部署

修改自定义配置文件

1.核心配置文件,配置core-site.xml

cd /opt/module/hadoop-3.1.3/etc/hadoop/
vim core-site.xml
=====================
<configuration>
        <!-- 指定NameNode的位置 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop102:8020</value>
    </property>
    <!-- 指定NameNode、DataNode、2nn数据存储的位置-->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-3.1.3/data</value>
    </property>
    <!-- 代理配置-->
    <property>
        <name>hadoop.proxyuser.lu.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.lu.groups</name>
        <value>*</value>
    </property>
   <!-- 指定web端操作的用户 -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>lu</value>
    </property>
</configuration>

2.配置hdfs-site.xml

vim hdfs-site.xml
=================
<configuration>
<!-- 指定2nn的位置 --> 
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop104:9868</value>
    </property>

    <!-- 
     namenode数据存储目录的配置:dfs.namenode.name.dir
     datanode数据存储目录的配置:dfs.datanode.data.dir
     2nn数据存储目录的配置:dfs.namenode.checkpoint.dir
    -->
</configuration>

3.YARN配置文件

vim yarn-site.xml
=================
<configuration>
    <!-- shuffle的方式 -->
     <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!-- 指定Resourcemanager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop103</value>
</property>
    <!-- 环境变量的继承 -->
<property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
    
    <!-- 给每个container分配的最小资源 -->
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>512</value>
    </property>
    <!-- 给每个container分配的最大资源-->
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>4096</value>
    </property>
    <!-- nodemanager将多少内存交给resourcemanager进行分配 -->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>4096</value>
    </property>
</configuration>

4.配置mapred-site.xml

vim mapred-site.xml
===================
<configuration>
    <!-- 指定mapreduce程序运行在yarn -->
<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

5.配置workers

vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
====================
hadoop102
hadoop103
hadoop104

注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行

6.配置历史服务器

vi mapred-site.xml
==================
<!-- 历史服务器端地址 -->
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>hadoop102:10020</value>
</property>

<!-- 历史服务器web端地址 -->
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop102:19888</value>
</property>

7.配置日志的聚集

vim yarn-site.xml
================
 <!-- 开启日志聚集 -->  
<property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
</property>
<!-- 日志访问路径 -->
    <property>  
        <name>yarn.log.server.url</name>  
        <value>http://hadoop102:19888/jobhistory/logs</value>  
</property> 
<!-- 日志保存时间 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
	</property>

分发Hadoop

第一次启动要格式化NameNode

 bin/hdfs namenode -format

群起脚本

//启动HDFS-->hadoop102
sbin/start-dfs.sh
//启动YARN-->hadoop103
sbin/start-yarn.sh

自制群起脚本

[lu@hadoop102 ~]$ cd /home/lu/bin
[lu@hadoop102 ~]$ vim myhadoop.sh
========================================
#!/bin/bash
if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi
case $1 in
"start")
        echo " =================== 启动 hadoop集群 ==================="

        echo " --------------- 启动 hdfs ---------------"
        ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
        echo " --------------- 启动 yarn ---------------"
        ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
        echo " --------------- 启动 historyserver ---------------"
        ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
        echo " =================== 关闭 hadoop集群 ==================="

        echo " --------------- 关闭 historyserver ---------------"
        ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
        echo " --------------- 关闭 yarn ---------------"
        ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
        echo " --------------- 关闭 hdfs ---------------"
        ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
    echo "Input Args Error..."
;;
esac

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

[lu@hadoop102 common]$ pwd
/opt/module/hadoop-3.1.3/share/hadoop/common
[lu@hadoop102 common]$ ls
hadoop-lzo-0.4.20.jar

分发到其他机器

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

<configuration>
    <property>
        <name>io.compression.codecs</name>
        <value>
            org.apache.hadoop.io.compress.GzipCodec,
            org.apache.hadoop.io.compress.DefaultCodec,
            org.apache.hadoop.io.compress.BZip2Codec,
            org.apache.hadoop.io.compress.SnappyCodec,
            com.hadoop.compression.lzo.LzoCodec,
            com.hadoop.compression.lzo.LzopCodec
        </value>
    </property>

    <property>
        <name>io.compression.codec.lzo.class</name>
        <value>com.hadoop.compression.lzo.LzoCodec</value>
    </property>
</configuration>

分发到其他机器

项目经验之LZO创建索引

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

hadoop jar /path/to/your/hadoop-lzo.jar com.hadoop.compression.lzo.DistributedLzoIndexer big_file.lzo

2)测试

执行wordcount程序

[lu@hadoop102 module]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output1

对上传的LZO文件建索引

[lu@hadoop102 module]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar  com.hadoop.compression.lzo.DistributedLzoIndexer /input/bigtable.lzo

再次执行WordCount程序

[lu@hadoop102 module]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output2

项目经验之基准测试

1) 测试HDFS写性能

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

[lu@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

2)测试HDFS读性能

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

[lu@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

3)删除测试生成数据

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

4)使用Sort程序评测MapReduce(非服务器集群慎用!!!)

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

[lu@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程序

[lu@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

项目经验之Hadoop参数调优

1)HDFS参数调优hdfs-site.xml

dfs.namenode.handler.count=20×〖log〗_e^(Cluster Size),比如集群规模为8台时,此参数设置为41
============
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>

2)YARN参数调优yarn-site.xml

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

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

(2)解决办法:

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

(a)yarn.nodemanager.resource.memory-mb
表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。
(b)yarn.scheduler.maximum-allocation-mb
单个任务可申请的最多物理内存量,默认是8192(MB)。

7、Zookeeper安装

安装ZK

(1)解压Zookeeper安装包到/opt/module/目录下

[lu@hadoop102 software]$ tar -zxvf zookeeper-3.5.7.tar.gz -C /opt/module/

(2)修改/opt/module/apache-zookeeper-3.5.7-bin名称为zookeeper-3.5.7

[lu@hadoop102 module]$ mv apache-zookeeper-3.5.7-bin/ zookeeper-3.5.7

分发到其他机器

配置服务器编号

(1)在/opt/module/zookeeper-3.5.7/这个目录下创建zkData

[lu@hadoop102 zookeeper-3.5.7]$ mkdir zkData

(2)在/opt/module/zookeeper-3.5.7/zkData目录下创建一个myid的文件

[lu@hadoop102 zkData]$ vi myid
=============//不同集群编号不同最好连号
2

分发到其他机器上

并分别在hadoop103、hadoop104上修改myid文件中内容为3、4

配置Zoo.cfg文件

(1)重命名/opt/module/zookeeper-3.5.7/conf这个目录下的zoo_sample.cfg为zoo.cfg

[lu@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg
为什么要改名
官网:要启动ZooKeeper,您需要一个配置文件。这是一个示例,在conf / zoo.cfg中创建它:
zkServer.sh 开头就给我了答案,调用zkEnv.sh 
在 zkEnv.sh 中果然找到了 zoo.cfg
if [ "x$ZOOCFG" = "x" ]
then
    ZOOCFG="zoo.cfg"
fi
所以启动的话我们 需要一个zoo.cfg或者修改zkEnv.sh

(2)修改数据存储路径配置

[lu@hadoop102 conf]$ vim zoo.cfg
========================
dataDir=/opt/module/zookeeper-3.5.7/zkData
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888

(3)同步zoo.cfg配置文件

(4)配置参数解读

server.A=B:C:D。
A是一个数字,表示这个是第几号服务器;
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
B是这个服务器的地址;
C是这个服务器Follower与集群中的Leader服务器交换信息的端口;
D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

集群操作

(1)分别启动Zookeeper

[lu@hadoop102 zookeeper-3.5.7]$ bin/zkServer.sh start
[lu@hadoop103 zookeeper-3.5.7]$ bin/zkServer.sh start
[lu@hadoop104 zookeeper-3.5.7]$ bin/zkServer.sh start

(2)查看状态

[lu@hadoop102 zookeeper-3.5.7]# bin/zkServer.sh status

客户端命令行操作

命令基本语法功能描述
help显示所有操作命令
ls path使用 ls 命令来查看当前znode的子节点 -w 监听子节点变化 -s 附加次级信息
create普通创建 -s 含有序列 -e 临时(重启或者超时消失)
get path获得节点的值 -w 监听节点内容变化 -s 附加次级信息
set设置节点的具体值
stat查看节点状态
delete删除节点
deleteall递归删除节点

启动客户端

[lu@hadoop103 zookeeper-3.5.7]$ bin/zkCli.sh

ZK集群启动停止脚本

1)在hadoop102的/home/lu/bin目录下创建脚本

[lu@hadoop102 bin]$ vim zk.sh
====================================
#! /bin/bash

case $1 in
"start"){
	for i in hadoop102 hadoop103 hadoop104
	do
        echo ---------- zookeeper $i 启动 ------------
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"
	done
};;
"stop"){
	for i in hadoop102 hadoop103 hadoop104
	do
        echo ---------- zookeeper $i 停止 ------------    
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
	done
};;
"status"){
	for i in hadoop102 hadoop103 hadoop104
	do
        echo ---------- zookeeper $i 状态 ------------    
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"
	done
};;
esac

2)增加脚本执行权限

[lu@hadoop102 bin]$ chmod 777 zk.sh

8、Kafka集群安装

集群规划

hadoop102hadoop103hadoop104
zkzkzk
kafkakafkakafka

1)解压安装包

[lu@hadoop102 software]$ tar -zxvf kafka_2.11-2.4.1.tgz -C /opt/module/

2)修改解压后的文件名称

[lu@hadoop102 module]$ mv kafka_2.11-2.4.1/ kafka

3)在/opt/module/kafka目录下创建logs文件夹

[lu@hadoop102 kafka]$ mkdir logs

4)修改配置文件

[lu@hadoop102 kafka]$ cd config/
[lu@hadoop102 config]$ vi server.properties
修改或者增加以下内容:
#broker的全局唯一编号,不能重复
broker.id=0
#删除topic功能使能
delete.topic.enable=true
#kafka运行日志存放的路径
log.dirs=/opt/module/kafka/logs
#配置连接Zookeeper集群地址
zookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka

5)配置环境变量

[lu@hadoop102 module]$ sudo vi /etc/profile.d/env.sh
===================
#KAFKA_HOME
export KAFKA_HOME=/opt/module/kafka
export PATH=$PATH:$KAFKA_HOME/bin
===============
[lu@hadoop102 module]$ source /etc/profile.d/env.sh

6)分发安装包

7)启动集群

依次在hadoop102、hadoop103、hadoop104节点上启动kafka
[lu@hadoop102 kafka]$ bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties
[lu@hadoop103 kafka]$ bin/kafka-server-start.sh -daemon  /opt/module/kafka/config/server.properties
[lu@hadoop104 kafka]$ bin/kafka-server-start.sh -daemon  /opt/module/kafka/config/server.properties

8)关闭集群

[lu@hadoop102 kafka]$ bin/kafka-server-stop.sh
[lu@hadoop103 kafka]$ bin/kafka-server-stop.sh
[lu@hadoop104 kafka]$ bin/kafka-server-stop.sh

kafka群起脚本

1)在/home/lu/bin目录下创建脚本kf.sh

[lu@hadoop102 bin]$ vim kf.sh
========================
#! /bin/bash

case $1 in
"start"){
    for i in hadoop102 hadoop103 hadoop104
    do
        echo " --------启动 $i Kafka-------"
        ssh $i "/opt/module/kafka/bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties "
    done
};;
"stop"){
    for i in hadoop102 hadoop103 hadoop104
    do
        echo " --------停止 $i Kafka-------"
        ssh $i "/opt/module/kafka/bin/kafka-server-stop.sh stop"
    done
};;
esac

=====================
[lu@hadoop102 bin]$ chmod 777 kf.sh

Kafka命令行操作

1)查看当前服务器中的所有topic

[lu@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka --list

2)创建topic

[lu@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka \
--create --replication-factor 3 --partitions 1 --topic first

选项说明:

–topic 定义topic名

–replication-factor 定义副本数

–partitions 定义分区数

3)删除topic

[lu@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka \
--delete --topic first
需要server.properties中设置delete.topic.enable=true否则只是标记删除。

4)发送消息

[lu@hadoop102 kafka]$ bin/kafka-console-producer.sh \
--broker-list hadoop102:9092 --topic first
>hello world
>lu  lu

5)消费消息

[lu@hadoop103 kafka]$ bin/kafka-console-consumer.sh \
--bootstrap-server hadoop102:9092 --from-beginning --topic first

[lu@hadoop103 kafka]$ bin/kafka-console-consumer.sh \
--bootstrap-server hadoop102:9092 --from-beginning --topic first
--from-beginning:会把主题中以往所有的数据都读取出来。

6)查看某个Topic的详情

[lu@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka \
--describe --topic first

7)修改分区数

[lu@hadoop102 kafka]$bin/kafka-topics.sh --zookeeper hadoop102:2181/kafka --alter --topic first --partitions 6

项目经验之Kafka压力测试

1)Kafka压测

用Kafka官方自带的脚本,对Kafka进行压测。Kafka压测时,可以查看到哪个地方出现了瓶颈(CPU,内存,网络IO)。一般都是网络IO达到瓶颈。

kafka-consumer-perf-test.sh

kafka-producer-perf-test.sh

2)Kafka Producer压力测试

(1)在/opt/module/kafka/bin目录下面有这两个文件。我们来测试一下

[lu@hadoop102 kafka]$ bin/kafka-producer-perf-test.sh  --topic test --record-size 100 --num-records 100000 --throughput -1 --producer-props bootstrap.servers=hadoop102:9092,hadoop103:9092,hadoop104:9092

说明:

record-size是一条信息有多大,单位是字节。

num-records是总共发送多少条信息。

throughput 是每秒多少条信息,设成-1,表示不限流,可测出生产者最大吞吐量。

3)Kafka Consumer压力测试

Consumer的测试,如果这四个指标(IO,CPU,内存,网络)都不能改变,考虑增加分区数来提升性能。

[lu@hadoop102 kafka]$ bin/kafka-consumer-perf-test.sh --broker-list hadoop102:9092,hadoop103:9092,hadoop104:9092 --topic test --fetch-size 10000 --messages 10000000 --threads 1

参数说明:

–zookeeper 指定zookeeper的链接信息

–topic 指定topic的名称

–fetch-size 指定每次fetch的数据的大小

–messages 总共要消费的消息个数

项目经验之Kafka机器数量计算

Kafka机器数量(经验公式)=2*(峰值生产速度*副本数/100)+1
先拿到峰值生产速度,再根据设定的副本数,就能预估出需要部署Kafka的数量。
比如我们的峰值生产速度是50M/s。副本数为2。
Kafka机器数量=2*(50*2/100)+ 1=3台

项目经验之Kafak分区数计算

1)创建一个只有1个分区的topic

2)测试这个topic的producer吞吐量和consumer吞吐量。

3)假设他们的值分别是Tp和Tc,单位可以是MB/s。

4)然后假设总的目标吞吐量是Tt,那么分区数=Tt / min(Tp,Tc)

例如:producer吞吐量=20m/s;consumer吞吐量=50m/s,期望吞吐量100m/s;

分区数=100 / 20 =5分区

https://blog.youkuaiyun.com/weixin_42641909/article/details/89294698

分区数一般设置为:3-10个

9、采集日志Flume安装

安装地址

(1) Flume官网地址:http://flume.apache.org/

(2)文档查看地址:http://flume.apache.org/FlumeUserGuide.html

(3)下载地址:http://archive.apache.org/dist/flume/

安装部署

(1)将apache-flume-1.9.0-bin.tar.gz上传到linux的/opt/software目录下

(2)解压apache-flume-1.9.0-bin.tar.gz到/opt/module/目录下

[lu@hadoop102 software]$ tar -zxf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/

(3)修改apache-flume-1.9.0-bin的名称为flume

[lu@hadoop102 module]$ mv /opt/module/apache-flume-1.9.0-bin /opt/module/flume

(4)将lib文件夹下的guava-11.0.2.jar删除以兼容Hadoop 3.1.3

rm /opt/module/flume/lib/guava-11.0.2.jar

注意:删除guava-11.0.2.jar的服务器节点,一定要配置hadoop环境变量。否则会报如下异常。

Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Lists

​    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)

​    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

​    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)

​    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

​    ... 1 more

(5)将flume/conf下的flume-env.sh.template文件修改为flume-env.sh,并配置flume-env.sh文件

[lu@hadoop102 conf]$ mv flume-env.sh.template flume-env.sh

[lu@hadoop102 conf]$ vi flume-env.sh

export JAVA_HOME=/opt/module/jdk1.8.0_212

集群规划:

服务器hadoop102服务器hadoop103服务器hadoop104
Flume(采集日志)FlumeFlume

项目经验之Flume组件选型

1)Source

(1)Taildir Source相比Exec Source、Spooling Directory Source的优势

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

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

Spooling Directory Source监控目录,支持断点续传。

(2)batchSize大小如何设置?

答:Event 1K左右时,500-1000合适(默认为100)

2)Channel

采用Kafka Channel,省去了Sink,提高了效率。KafkaChannel数据存储在Kafka里面,所以数据是存储在磁盘中。

注意在Flume1.7以前,Kafka Channel很少有人使用,因为发现parseAsFlumeEvent这个配置起不了作用。也就是无论parseAsFlumeEvent配置为true还是false,都会转为Flume Event。这样的话,造成的结果是,会始终都把Flume的headers中的信息混合着内容一起写入Kafka的消息中,这显然不是我所需要的,我只是需要把内容写入即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值