hadoop安装配置前期的阿里云ECS环境已装好,现在开始正式搭建项目的环境
1.集群规划
| 服务器hadoop102 | 服务器hadoop103 | 服务器hadoop104 | |
|---|---|---|---|
| HDFS | NameNodeDataNode | DataNode | DataNodeSecondaryNameNode |
| Yarn | NodeManager | ResourcemanagerNodeManager | NodeManager |
2.部署安装
hadoop我这里使用的版本是hadoop-3.1.3.tar.gz
# 解压 [atguigu@hadoop102 software]$ pwd /opt/software [atguigu@hadoop102 software]$ ll |grep hadoop -rw-rw-r-- 1 atguigu atguigu 338075860 Oct 16 21:37 hadoop-3.1.3.tar.gz [atguigu@hadoop102 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C ../module/ # 配置环境变量 /etc/profile.d/my_env.sh, 然后 source /etc/profile export HADOOP_HOME=/opt/module/hadoop-3.1.3 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin # hadoop version 检验hadoop是否安装成功
3.配置集群
core-site.xml,在configuration中添加如下配置
fs.defaultFS
hdfs://hadoop102:8020
hadoop.tmp.dir
/opt/module/hadoop-3.1.3/data
hadoop.http.staticuser.user
atguigu
hadoop.proxyuser.atguigu.hosts
*
hadoop.proxyuser.atguigu.groups
*
hadoop.proxyuser.atguigu.groups
*
hdfs-site.xml
dfs.namenode.http-address hadoop102:9870 dfs.namenode.secondary.http-address hadoop104:9868
yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.hostname
hadoop103
yarn.nodemanager.env-whitelist
JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME
yarn.scheduler.minimum-allocation-mb
512
yarn.scheduler.maximum-allocation-mb
4096
yarn.nodemanager.resource.memory-mb
4096
yarn.nodemanager.pmem-check-enabled
false
yarn.nodemanager.vmem-check-enabled
false
mapred-site.xml
mapreduce.framework.name
yarn
配置works
hadoop102 hadoop103 hadoop104
4.配置历史服务器
mapred-site.xml
mapreduce.jobhistory.address hadoop102:10020 mapreduce.jobhistory.webapp.address hadoop102:19888
5.配置日志聚集
yarn-site.xml
yarn.log-aggregation-enable true yarn.log.server.url http://hadoop102:19888/jobhistory/logs yarn.log-aggregation.retain-seconds 604800
ok,配到这里,所有的配置已经配置完毕,接下来就把整个hadoop的安装目录分发到hadoop103,hadoop104机器,环境变量也分发一下。
[atguigu@hadoop102 module]$ pwd /opt/module # 分发hadoop安装目录 [atguigu@hadoop102 module]$ my_rsync.sh hadoop-3.1.3 # 分发环境变量 [atguigu@hadoop102 module]$ my_rsync.sh /etc/profile.d/my_env.sh # 查看各个机器的hadoop环境变量是否生效 [atguigu@hadoop102 module]$ all.sh hadoop version
测试完成,现在所有机器的hadoop的环境已经装好
6.启动hadoop
# 102 [atguigu@hadoop102 module]$ hdfs namenode -format # 102 [atguigu@hadoop102 module]$ start-dfs.sh # 103 [atguigu@hadoop102 module]$ start-yarn.sh
ok.启动成功,
# namenode web地址 hadoop102:9870 # yarn web地址 hadoop103:8088
7.简单跑个mr测试一下
hadoop fs -mkdir /input hadoop fs -put READ.txt /input hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output # 启动历史服务器 mapred --daemon start historyserver多目录存储
先熟悉一下,将来生产环境一定会用到
1.生产环境服务器磁盘情况
2.在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
注意:每台服务器挂载的磁盘不一样,所以每个节点的多目录配置可以不一致。单独配置即可。 不慌,到时候看下磁盘挂载情况,然后datanode属性dfs.datanode.data.dir相应的配置就行
注意:每台服务器挂载的磁盘不一样,所以每个节点的多目录配置可以不一致。单独配置即可。
集群数据均衡 节点间数据均衡开启数据均衡命令: start-balancer.sh -threshold 10 对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整。 停止数据均衡命令: stop-balancer.sh磁盘间数据均衡
(1)生成均衡计划(我们只有一块磁盘,不会生成计划) hdfs diskbalancer -plan hadoop103 (2)执行均衡计划 hdfs diskbalancer -execute hadoop103.plan.json (3)查看当前均衡任务的执行情况 hdfs diskbalancer -query hadoop103 (4)取消均衡任务 hdfs diskbalancer -cancel hadoop103.plan.jsonLZO压缩配置
hadoop本身并不支持lzo压缩,故需要使用twitter提供的hadoop-lzo开源组件。hadoop-lzo需依赖hadoop和lzo进行编译。编译步骤略,编译后打成jar包: hadoop-lzo-0.4.20.jar
# 1.将编译好后的hadoop-lzo-0.4.20.jar 放入hadoop-3.1.3/share/hadoop/common/ [atguigu@hadoop102 common]$ pwd /opt/module/hadoop-3.1.3/share/hadoop/common [atguigu@hadoop102 common]$ ls hadoop-lzo-0.4.20.jar # 2.同步hadoop-lzo-0.4.20.jar到hadoop103、hadoop104 [atguigu@hadoop102 common]$ my_rsync.sh hadoop-lzo-0.4.20.jar # 3.core-site.xml增加配置支持LZO压缩基准测试# 4.同步core-site.xml到hadoop103、hadoop104 [atguigu@hadoop102 hadoop]$ my_rsync.sh core-site.xml # 5.启动及查看集群 [atguigu@hadoop102 hadoop-3.1.3]$ start-dfs.sh [atguigu@hadoop103 hadoop-3.1.3]$ start-yarn.sh # 5.测试lzo压缩 hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -Dmapreduce.output.fileoutputformat.compress=true -Dmapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec /input /lzo-output # 5.测试lzo切片 # 注意:lzo的切片必须要创建索引,执行后会新建一个后缀为.index的文件 hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /lzo-input/bigtable.lzo # 测试lzo切片(把默认的TextInputFormat替换为LzoInputFormat) 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 /lzo-input /lzo-output io.compression.codecs 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 io.compression.codec.lzo.class com.hadoop.compression.lzo.LzoCodec
测试HDFS写性能
# 测试命令(-nrFiles设置为cpu数量-2)hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -write -nrFiles 4 -fileSize 128MB
测试HDFS读性能
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -read -nrFiles 4 -fileSize 128MB
删除测试生成的数据
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -cleanhadoop参数调优
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.count 10
计算公式:
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)。zookeeper安装配置
集群规划
| 服务器hadoop102 | 服务器hadoop103 | 服务器hadoop104 | |
|---|---|---|---|
| Zookeeper | Zookeeper | Zookeeper | Zookeeper |
解压安装
# 解压 [atguigu@hadoop102 module]$ tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C ../module/ # 配置环境变量 # zookeeper export ZOOKEEPER_HOME=/opt/module/zookeeper-3.5.7 export PATH=$PATH:$ZOOKEEPER_HOME/bin # 修改zookeeper的配置文件(创建zkData文件夹,myid文件,不重复id:2,3,4,) # 还要zoo.sample.conf 改名为 zoo.cfg dataDir=/opt/module/zookeeper-3.5.7/zkData server.2=hadoop102:2888:3888 server.3=hadoop103:2888:3888 server.4=hadoop104:2888:3888 # 文件分发到103,104 [atguigu@hadoop102 module]$ my_rsync.sh zookeeper-3.5.7/ # 分发后各自改 myid文件3,4 # 分发环境变量 [atguigu@hadoop102 module]$ scp /etc/profile.d/my_env.sh root@hadoop103:/etc/profile.d/ [atguigu@hadoop102 module]$ scp /etc/profile.d/my_env.sh root@hadoop104:/etc/profile.d/
zk群启脚本zk_cluster.sh
#!/bin/bash
if [ $# -lt 1 ]
then
echo "USAGE: zk.sh {start|stop|status}"
exit
fi
case $1 in
start)
for i in hadoop102 hadoop103 hadoop104
do
echo "=================> START $i ZK <================="
ssh $i /opt/module/zookeeper-3.5.7/bin/zkServer.sh start
done
;;
stop)
for i in hadoop102 hadoop103 hadoop104
do
echo "=================> STOP $i ZK <================="
ssh $i /opt/module/zookeeper-3.5.7/bin/zkServer.sh stop
done
;;
status)
for i in hadoop102 hadoop103 hadoop104
do
echo "=================> STATUS $i ZK <================="
ssh $i /opt/module/zookeeper-3.5.7/bin/zkServer.sh status
done
;;
*)
echo "USAGE: zk.sh {start|stop|status}"
exit
;;
esac
kafka安装配置
集群规划
| 服务器hadoop102 | 服务器hadoop103 | 服务器hadoop104 | |
|---|---|---|---|
| Kafka | Kafka | Kafka | Kafka |
解压安装
# 解压 [atguigu@hadoop102 config]$ tar -zxvf kafka_2.11-2.4.1.tgz -C ../module/ # 在安装目录新建data目录,用来存消息数据 # 修改配置文件 broker.id=2 log.dirs=/opt/module/kafka_2.11-2.4.1/datas zookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka # 编写环境变量 #kafka export KAFKA_HOME=/opt/module/kafka_2.11-2.4.1 export PATH=$PATH:$KAFKA_HOME/bin # 分发kafka安装目录(各自修改broker.id)以及环境变量 [atguigu@hadoop102 module]$ my_rsync.sh kafka_2.11-2.4.1/ [atguigu@hadoop102 module]$ scp /etc/profile.d/my_env.sh root@hadoop103:/etc/profile [atguigu@hadoop102 module]$ scp /etc/profile.d/my_env.sh root@hadoop104:/etc/profile
kafka群启脚本
#!/bin/bash
if [ $# -lt 1 ]
then
echo "USAGE: kafka.sh {start|stop}"
exit
fi
case $1 in
start)
for i in hadoop102 hadoop103 hadoop104
do
echo "=================> START $i KF <================="
ssh $i /opt/module/kafka_2.11-2.4.1/bin/kafka-server-start.sh -daemon /opt/module/kafka_2.11-2.4.1/config/server.properties
done
;;
stop)
for i in hadoop102 hadoop103 hadoop104
do
echo "=================> STOP $i KF <================="
ssh $i /opt/module/kafka_2.11-2.4.1/bin/kafka-server-stop.sh
done
;;
*)
echo "USAGE: kafka.sh {start|stop}"
exit
;;
esac
kafka压力测试
用Kafka官方自带的脚本,对Kafka进行压测。Kafka压测时,可以查看到哪个地方出现了瓶颈(CPU,内存,网络IO)。一般都是网络IO达到瓶颈。
kafka-consumer-perf-test.sh
kafka-producer-perf-test.sh
# Kafka Producer压力测试 (1)在/opt/module/kafka/bin目录下面有这两个文件。我们来测试一下 [atguigu@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,表示不限流,可测出生产者最大吞吐量。 (2)Kafka会打印下面的信息 100000 records sent, 95877.277085 records/sec (9.14 MB/sec), 187.68 ms avg latency, 424.00 ms max latency, 155 ms 50th, 411 ms 95th, 423 ms 99th, 424 ms 99.9th. 参数解析:本例中一共写入10w条消息,吞吐量为9.14 MB/sec,每次写入的平均延迟为187.68毫秒,最大的延迟为424.00毫秒。 # Kafka Consumer压力测试 Consumer的测试,如果这四个指标(IO,CPU,内存,网络)都不能改变,考虑增加分区数来提升性能。 [atguigu@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 总共要消费的消息个数 测试结果说明: start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec 2019-02-19 20:29:07:566, 2019-02-19 20:29:12:170, 9.5368, 2.0714, 100010, 21722.4153 开始测试时间,测试结束数据,共消费数据9.5368MB,吞吐量2.0714MB/s,共消费100010条,平均每秒消费21722.4153条。kafka机器数量计算
经验计算公式
Kafka机器数量(经验公式)=2*(峰值生产速度*副本数/100)+1 先拿到峰值生产速度,再根据设定的副本数,就能预估出需要部署Kafka的数量。 比如我们的峰值生产速度是50M/s。副本数为2。 Kafka机器数量=2*(50*2/100)+ 1=3台kafka分区计算公式
https://blog.csdn.net/weixin_42641909/article/details/89294698
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分区 分区数一般设置为:3-10个



