流程:

  1. 准备虚拟机
    1. 创建一个虚拟机
    2. 键入setup设置网络,ping通百度
    3. 关闭防火墙,设置不自启
    4. 关闭selinx
    5. 复制出另外两份虚拟机,解决复制冲突
    6. ssh密钥分享
  2. 安装JDK
    1. 解压到目录
    2. 将系统默认java替换为刚刚安装
    3. 设置环境变量
  3. 安装集群
    1. 编写分发脚本
    2. 解压到目录
    3. 确定每个节点要布置的主要服务
    4. 认识配置文件
    5. 更改配置文件
    6. 集群功能测试

准备服务器

我使用的是 centos-6.9

创建虚拟机:

选择自定义

1598109945516

选择硬件策略

1598109993416

稍后再选择操作系统

1598110020593

选择linux

1543962

1598110102577

设置计算能力可以多设置一点,反正你的cpu会自己判断

1598110151879

设置内存越大,跑的任务越快

1598110184788

剩下的配置一路下一步,直到硬盘空间设置,要量力而为,但最好大一点

1598110226731

一直下一步,最后检查一下是否有配置不满意,可以上一步回去重新设置

1598110298028

完成之后,先设置虚拟机的系统镜像

1598110511021

之后,开启虚拟机,选择页面中的第二个

1598110577088

跳过检查,否则会浪费很多时间,键盘选择右边

1598110621146

选择默认语言,最好选择中文

1598110668858

之后一直下一步到这里,选择是

1598110738639

之后需要给主机起名字

1598110774990

一直下一步到设置密码,设置你的root用户的密码,测试环境推荐:123456

再一直下一步到这里,选择右边,继续进行

1598110895704

之后,选择你安装的是什么样的系统环境,我选择的是自带基本开发环境,没有可视化界面

1598110983375

最后安装过程,等待

1598111009774

修改网络配置

安装好后,输入用户名密码进入系统,之后输入setup,图形化界面设置网络

第一个页面选择第三个 network configuration

第二个页面选择第一个 device configuration

第三个页面选择第一个 最长的

最终:

1598111350970

设置完毕之后,按左右选择ok,依次选择ok,最终退出图形化页面

但是网络还没有配置完毕,进一步设置才可以上网:

1
[root@node01 software]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 

1598111600861

更改完毕,刷新网络配置

1
service network restart

之后就可以ping通了

关闭防火墙

先关闭,再设置开机不自启

1
2
service iptables stop
chkconfig iptables off

关闭selinux

1
2
vim /etc/selinux/config
设置第一个参数为disabled

复制虚拟机

一定要在虚拟机关闭状态下克隆,虚拟机会小很多,因为进行了刚刚的防火墙与selinux设置,复制出的虚拟机不需要再次设置

在要克隆的虚拟机上右键,点击管理,克隆。

克隆出来之后你会发现克隆出的虚拟机与被克隆虚拟机的主机名等某些配置完全相同,这在开发中是违规的,需要更改

改主机名

1
vim /etc/sysconfig/network

设置本地dns

1
vim /etc/hosts

你的ip node01

你的ip node02

以此类推

改网络参数

若是有bringing up报错 :rm -f /etc/udev/rules.d/70-persistent-net.rules文件删除

1
rm -f /etc/udev/rules.d/70-persistent-net.rules

将hwaddr 与uuid 删除

img

刷新网络

1
service network restart

继续测试ping百度,成功

分享密钥

分别在三台服务器上输入

1
ssh-keygen

之后出现的交互操作直接输入三次回车即可

之后将自己的密钥发给别的服务器,并且输入密码,就拥有了登录别的节点的权力了

1
2
3
ssh-copy-id root@node01
ssh-copy-id root@node02
ssh-copy-id root@node03

指令独有化

环境变量只对某一个用户有效

1
2
3
4
5
6
1)修改/etc/profile文件:用来设置系统环境参数,比如$PATH. 这里面的环境变量是对系统内所有用户生效。使用bash命令,需要source  /etc/profile一下。
2)修改~/.bashrc文件:针对某一个特定的用户,环境变量的设置只对该用户自己有效。使用bash命令,只要以该用户身份运行命令行就会读取该文件。
3)把/etc/profile里面的环境变量追加到~/.bashrc目录
[root@node01 ~]# cat /etc/profile >> ~/.bashrc
[root@node02 ~]# cat /etc/profile >> ~/.bashrc
[root@node03 ~]# cat /etc/profile >> ~/.bashrc

安装jdk

解压到 /opt/module下

1
tar -zxvf /你的jdk位置  -C   /解压位置

此时输入 java -version,你会发现java的版本还是1.7,所以输入whereis java发现真正的java引用位置在 /usr/bin/java的软连接位置,我们直接删除 /usr/bin/java 的软连接即可

1
rm -rf /usr/bin/java

设置环境变量,在 /etc/profile.d/ 目录下创建 java.sh ,添加以下配置

1
2
export JAVA_HOME=你的jdk解压目录
export PATH=$PATH:$JAVA_HOME/bin

输入完毕之后,刷新环境变量配置

1
source /etc/profile

为什么我们修改了profile.d 的文件,却要刷新 profile?

因为profile.d 被profile所引用,刷新了profile就会默认读取profile.d的信息

别忘了三个主机都要配置jdk,分发可以用scp指令,当然也可以用 下面描述的分发脚本

1
scp  -r   文件目录     用户名@ip:$PWD

$PWD 代表当前位置,也就是将文件复制到中与被复制服务器中文件相同的位置

安装集群

分发脚本

如果你一个一个的部署集群,等你部署完毕,我们一天的时间也结束了,直接下班?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi

#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname

#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

#4 获取当前用户名称
user=`whoami`

#5 循环
for((host=103; host<105; host++)); do
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done

更改循环位置的代码,现在的循环遍历拼接的参数是 当前用户@hadoop103、当前用户@hadoop104,根据你的实际情况更改代码,并且将储存代码的文件命名为 xsync,设置权限为 777,放到 /usr/local/bin目录中

为什么不用scp?

rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。

rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。

解压

1
tar -zxvf 你的hadoop压缩包   -C  解压到哪里

目标

1598113621148

文件配置

这些文件全都在 hadoop安装目录/etc/hadoop/ 下

配置core-site.xml

1
2
3
4
5
6
7
8
9
10
11
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:9000</value>
</property>

<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>

vi hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
<!-- 副本数 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>

<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node03:50090</value>
</property>

vi yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node02</value>
</property>

配置mapred-env.sh

1
2
[atguigu@hadoop102 hadoop]$ vi mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144

配置mapred-site.xml

cp mapred-site.xml.template mapred-site.xml
vi mapred-site.xml

1
2
3
4
5
6
在该文件中增加如下配置
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

slaves

1
2
3
node01
node02
node03

vi mapred-site.xml

1
2
3
4
5
6
7
8
9
10
11
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node01:10020</value>
</property>

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

开启指令: sbin/mr-jobhistory-daemon.sh start historyserver

vi yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>

<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>

查看储存在hdfs中的聚合日志:

1
http://hadoop101:19888/jobhistory

配置完成之后,执行脚本命令分发程序

1
xsync 要传输的目录

NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN

测试集群

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

1
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.2-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
19/05/02 11:44:26 INFO fs.TestDFSIO: TestDFSIO.1.8
19/05/02 11:44:26 INFO fs.TestDFSIO: nrFiles = 10
19/05/02 11:44:26 INFO fs.TestDFSIO: nrBytes (MB) = 128.0
19/05/02 11:44:26 INFO fs.TestDFSIO: bufferSize = 1000000
19/05/02 11:44:26 INFO fs.TestDFSIO: baseDir = /benchmarks/TestDFSIO
19/05/02 11:44:28 INFO fs.TestDFSIO: creating control file: 134217728 bytes, 10 files
19/05/02 11:44:30 INFO fs.TestDFSIO: created control files for: 10 files
19/05/02 11:44:30 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8032
19/05/02 11:44:31 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8032
19/05/02 11:44:32 INFO mapred.FileInputFormat: Total input paths to process : 10
19/05/02 11:44:32 INFO mapreduce.JobSubmitter: number of splits:10
19/05/02 11:44:33 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1556766549220_0003
19/05/02 11:44:34 INFO impl.YarnClientImpl: Submitted application application_1556766549220_0003
19/05/02 11:44:34 INFO mapreduce.Job: The url to track the job: http://hadoop103:8088/proxy/application_1556766549220_0003/
19/05/02 11:44:34 INFO mapreduce.Job: Running job: job_1556766549220_0003
19/05/02 11:44:47 INFO mapreduce.Job: Job job_1556766549220_0003 running in uber mode : false
19/05/02 11:44:47 INFO mapreduce.Job: map 0% reduce 0%
19/05/02 11:45:05 INFO mapreduce.Job: map 13% reduce 0%
19/05/02 11:45:06 INFO mapreduce.Job: map 27% reduce 0%
19/05/02 11:45:08 INFO mapreduce.Job: map 43% reduce 0%
19/05/02 11:45:09 INFO mapreduce.Job: map 60% reduce 0%
19/05/02 11:45:10 INFO mapreduce.Job: map 73% reduce 0%
19/05/02 11:45:15 INFO mapreduce.Job: map 77% reduce 0%
19/05/02 11:45:18 INFO mapreduce.Job: map 87% reduce 0%
19/05/02 11:45:19 INFO mapreduce.Job: map 100% reduce 0%
19/05/02 11:45:21 INFO mapreduce.Job: map 100% reduce 100%
19/05/02 11:45:22 INFO mapreduce.Job: Job job_1556766549220_0003 completed successfully
19/05/02 11:45:22 INFO mapreduce.Job: Counters: 51
File System Counters
FILE: Number of bytes read=856
FILE: Number of bytes written=1304826
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=2350
HDFS: Number of bytes written=1342177359
HDFS: Number of read operations=43
HDFS: Number of large read operations=0
HDFS: Number of write operations=12
Job Counters
Killed map tasks=1
Launched map tasks=10
Launched reduce tasks=1
Data-local map tasks=8
Rack-local map tasks=2
Total time spent by all maps in occupied slots (ms)=263635
Total time spent by all reduces in occupied slots (ms)=9698
Total time spent by all map tasks (ms)=263635
Total time spent by all reduce tasks (ms)=9698
Total vcore-milliseconds taken by all map tasks=263635
Total vcore-milliseconds taken by all reduce tasks=9698
Total megabyte-milliseconds taken by all map tasks=269962240
Total megabyte-milliseconds taken by all reduce tasks=9930752
Map-Reduce Framework
Map input records=10
Map output records=50
Map output bytes=750
Map output materialized bytes=910
Input split bytes=1230
Combine input records=0
Combine output records=0
Reduce input groups=5
Reduce shuffle bytes=910
Reduce input records=50
Reduce output records=5
Spilled Records=100
Shuffled Maps =10
Failed Shuffles=0
Merged Map outputs=10
GC time elapsed (ms)=17343
CPU time spent (ms)=96930
Physical memory (bytes) snapshot=2821341184
Virtual memory (bytes) snapshot=23273218048
Total committed heap usage (bytes)=2075656192
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=1120
File Output Format Counters
Bytes Written=79
19/05/02 11:45:23 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write
19/05/02 11:45:23 INFO fs.TestDFSIO: Date & time: Thu May 02 11:45:23 CST 2019
19/05/02 11:45:23 INFO fs.TestDFSIO: Number of files: 10
19/05/02 11:45:23 INFO fs.TestDFSIO: Total MBytes processed: 1280.0
19/05/02 11:45:23 INFO fs.TestDFSIO: Throughput mb/sec: 10.69751115716984
19/05/02 11:45:23 INFO fs.TestDFSIO: Average IO rate mb/sec: 14.91699504852295
19/05/02 11:45:23 INFO fs.TestDFSIO: IO rate std deviation: 11.160882132355928
19/05/02 11:45:23 INFO fs.TestDFSIO: Test exec time sec: 52.315

调优:

多目录

在hdfs-site.xml文件中配置多目录,最好提前配置好,否则更改目录需要重新启动集群

1
2
3
4
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///hd2/dfs/data2,file:///hd3/dfs/data3,file:///hd4/dfs/data4</value>
</property>

支持lzo压缩:

先下载lzo的jar项目
https://github.com/twitter/hadoop-lzo/archive/master.zip

下载后的文件名是hadoop-lzo-master,它是一个zip格式的压缩包,先进行解压,然后用maven编译。生成hadoop-lzo-0.4.20.jar。

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

1
2
3
4
[root@hadoop102 common]$ pwd
/opt/module/hadoop-2.7.2/share/hadoop/common
[root@hadoop102 common]$ ls
hadoop-lzo-0.4.20.jar

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<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>

参数调优:

1、提高心跳稳定

dfs.namenode.handler.count=20 * log2(Cluster Size),比如集群规模为8台时,此参数设置为60

log以2为底clustersize的对数,也就是 2的几次幂=clustersize?比如clustersize为8的时候,2的3次幂就是8,所以log2(8)=3,也就是20*3

这个参数的含义是增加线程池数量用来维护心跳,集群数量极多的时候,这个参数会有用

2、降低延迟

编辑日志存储路径dfs.namenode.edits.dir设置与镜像文件存储路径dfs.namenode.name.dir尽量分开,达到最低写入延迟