hadoop完全分布式

前言

1
2
3
4
5
6
7
8
9
1.准备3台服务器
2.安装JDK
3.配置java环境变量
4.安装hadoop
5.配置hadoop环境变量
6.配置集群
7.单点启动
8.配置ssh无密码访问
9.群起并测试集群

集群分配脚本配置

虚拟机/服务器配置ip,hosts,hostname

1
2
vim /etc/hosts
hostnamectl/hostname +name

编写集群分发脚本xsync

scp(secure copy)安全拷贝

实现数据库之间的数据拷贝

1
2
3
4
5
6
scp –r(递归) 数据源路径 目的地路径
scp –r route user@ip:route推送
scp –r user@ip:route route拉取
scp –r user@ip:route user@ip:route作为中转站
把配置好的第一台服务器的文件拷贝到其它服务器,并把/etc/profile拷贝一下.
soruce /etc/profile

rsync 远程同步工具

1
2
3
4
rsync主要用于备份和镜像.具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsyn做文件复制要比scp快,rsync只对差异文件做更新,scp是无差别拷贝。
语法:
rsync –rvl(递归,v显示过程,l拷贝符号链接) 源数据路径 目的路径

xsync集群分发脚本

要求:输入xsync +要同步的文件名 即可同步
#!/bin/bash –开头指定文件运行–

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#1 获取传入参数,如果没有就直接结束脚本
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi

#2 获取要拷贝的文件名(第1个参数)
p1=$1
fname=`basename $p1` 确保为相对路径
echo fname=$fname

#3 获取文件路径的上级目录的绝对路径
pdir=`cd -P $(dirname $p1); pwd` -P是进入到软连接实际的物理存储位置
echo pdir=$pdir
# get the user
user=`whoami`

#4 循环同步所有的节点
for((host=101; host<103; host++)); do
echo ------------------------ hadoop$host --------------------------
rsync -rvl $pdir/$fname $user@h@host:$pdir
done

所以之后只需要在100上修改配置分发同步到各个节点即可

集群的配置

集群的部署规划

1
2
3
4
5
6
h100 				h101 				 h102
HDFS namenode datanode secondarynamenode
datanode datanode

YARN nodemanager resourcemanager nodemanager
nodemanager

要求

  • 1.namenode和secondarynamenode内存规划1:1
    所以两个节点不能部署在一台服务器上,那样相当于内存折半性能降低。
  • 2.resourceManager是整个集群资源的老大很耗内存,所以需要避开namenode和secondarynamenode节点服务器

配置集群

  • 1.配置core-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    vim core-site.xml
    1.指定namenode的地址
    2.指定hadoop运行产生临时文件存储目录
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/hadoop-3.3.0/data</value>
    <description>Abase for other temporary directories.</description>
    </property>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://h100:9000</value>
    </property>
  • 2.HDFS配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    1.修改环境变量导入java路径
    2.修改节点个数
    3.修改secondarynamenode辅助名称节点
    vim hadoop-env.sh
    EXPORT JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.el7_9.x86_64/jre/

    vim hdfs-site.xml
    <property>
    <name>dfs.replication</name>
    <value>3</value>
    <property>

    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>h102:50090</value>
    <property>
  • 3.配置yarn

    1
    2
    3
    4
    5
    6
    7
    1.配置java_home
    vim yarn-env.sh
    2.配置指定resourcemanager的运行地址 nodemanager
    <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>h101</value>
    </property>
  • 4.配置mapreduce

    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
    1.配置java_home
    vim mapred-env.sh
    2.指定mr运行在yarn上
    vim mapred-site.xml
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    <property>
    <name>yarn.app.mapreduce.am.env</name>
    <value>HADOOP_MAPRED_HOME=/opt/hadoop-3.3.0</value>
    </property>
    <property>
    <name>mapreduce.map.env</name>
    <value>HADOOP_MAPRED_HOME=/opt/hadoop-3.3.0</value>
    </property>
    <property>
    <name>mapreduce.reduce.env</name>
    <value>HADOOP_MAPRED_HOME=/opt/hadoop-3.3.0</value>
    </property>
    <property>
    <name>mapreduce.jobhistory.address</name>
    <value>h101:10020</value>
    </property>

    <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>h101:19888</value>
    </property>

    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/
  • 5.分发配置好的集群文件

    1
    xsync /opt/hadoop-3.3.0/

集群的单点启动

1
2
3
4
5
6
7
8
9
10
11
12
1.删除每台服务器对应的data logs
rm –rf data logs

2.单点启动
在h100上单点启动
bin/hdfs namenode –format
bin/hdfs –daemon start namenode
bin/hdfs –daemon start datanode

注意整个集群只有一个namenode
h101和h102
bin/hdfs –daemon start datanode

群起集群

配置ssh无密码连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
为什么需要ssh无密登录?
h100有namenode需要向别的datanode节点分发,通讯。
(resourcemanager也需要)
https://blog.csdn.net/mmd0308/article/details/73825953
原理:
用公钥解密私钥,服务器A把生成的钥匙对的公钥给服务器B,当服务器A传输ssh信息或发送文件到服务器B时,服务器找寻服务器A的公钥并用来解密信息上加密的私钥。
如果解密成功,服务器B采用服务器A的公钥加密数据返回给A,A再用私钥解密
1.找到当前用户的.ssh
/root/.ssh
/home/gugu/.ssh
2.生成密钥
ssh-keygen –t rsa 指定使用的加密算法
连续三次回车
id_rsa
id_rsa.pub
ssh-copy-id h101
或者手动建立authorized_keys
cat id _rsa.pub >> authorized_keys
3.把各个服务器的id_rsa.pub都拷贝到authorized_keys

100的主节点还需要配置root的无密登录
(如果配置的不是root的话)

配置slaves 3.0以上为workers

1
2
3
4
5
vim etc/hadoop/workers
h100
h101
h102
不允许有空格和回车,不然脚本检测还要检查空格回车

执行群起脚本

1
sbin/start-dfs.sh

执行群起yarn脚本

注意:yarn群起脚本必须在配置了resourcemanager的那台服务器上执行,否则会报错。

1
2
进入h101
/opt/hadoop-3.3.0/sbin/start-yarn.sh

至此集群群起完成

群起集群测试

集群的基本测试

  • 1.上传小文件和大文件
    1
    2
    bin/hdfs dfs –put wcinput/wc.input /
    bin/hdfs dfs –put /opt/hadoop-3.3.0.tar.gz /
    因为每个块的大小为128M所以大文件会分块储存,n=size/128 – block0 – blockn
    并且通过replicaiton设置的副本数将数据分别存储到了3台服务器上。
  • 注意:我们所传输到hdfs /的路径所存放的数据放在服务器的哪里?
    • 放在我们指定的core-site.xml中的hadoop.tmp.dir,当然也可以单独指定hdfs.dfs.dir
      所以数据放在/opt/hadoop-3.3.0/data/tmp/dfs/data/current/BP-63934372-10.167.218.160-1606840182184
      /current/finalized/subdir0/subdir0
1
2
3
4
touch tmp.txt
cat blk_.... >> tmp.txt
把分块文件组合在一起
tar –zxvf tmp.txt,发现就是我们之前传入的hadoop-3.3.0.tar.gz

集群启动/停止方式总结

单节点启动

1
2
3
4
5
6
7
8
9
在每个节点上遍历对应的命令
bin/hdfs namenode –format
bin/hdfs –daemon start namenode
bin/hdfs –daemon start datanode
bin/hdfs –daemon start secondarynamenode
(sbin/hadoop-daemon.sh start/stop)
bin/yarn –daemon start resourcemanager 必须在对应的节点上启动resourcemanager
bin/yarn –daemon start nodemanager
(sbin/yarn-daemon.sh start/stop resourcemanager/nodemanager

各个按模块整体分开启动

1
2
3
4
5
6
7
首要是配置ssh免密登录

1.整体启动hdfs
sbin/start-dfs.sh /stop-dfs.sh

2.整体启动yarn
sbin/start-yarn.sh /stop-yarn.sh

当然还有全部启动(但不建议使用)

1
sbin/start-all.sh /stop-all.sh

集群时间同步

使用crontab定时任务,到了哪个时间起哪个进程哪个任务

crond服务管理

1
2
3
4
5
6
7
8
9
serveice crond restart
systemctcl start crond
设置程序开机自启动:
方法:
1.centos7以下chkconfig
2.centos7以上systemctl enable/disable xxxx
查看systemctl list-unit-files (| grep enable)
systemctl enable redis
3.ntsysv图形界面进入确认

crontab定时任务设置

基础命令

  • crontab –e 编辑crontab定时任务

  • crontab –l 查询crontab任务

  • crontab –r 删除当前用户所有的crontab任务

    参数说明

  • 1.* * * * * 执行任务

    1
    2
    3
    4
    5
    第一个*		表示一小时当中的第几分钟 0-59
    第二个* 一天当中的第几个小时
    第三个* 一个月当中的第几天
    第四个* 一年当中的第几个月
    第五个* 一个星期的星期几
  • 2.特殊符号

    1
    2
    3
    4
    5
    6
    * 代表任何时间,比如第一个“*”就代表一个小时中每分钟都执行一次
    ,代表不连续的时间,比如“0 8,12,16 * * *”,就代表在每天的8点0分,12点0分,16点0分都执行一次命令
    - 代表连续的时间范围,比如“0 5 * * 1-6”代表在周一到周六的凌晨5点0分执行命令
    */n 代表每隔多久执行一次,比如“*/10 * * * *”代表每隔10分钟就执行一遍该命令

    如果是过于复杂的命令就换用uz框架实现
  • 3.添加一个简单命令

    1
    */1 * * * * /bin/echo “11” >> /root/bailongma.txt

集群时间同步

找一台服务器作为时间服务器,所有机器每隔固定时间进行定时同步。

  • 1.检查时间服务器是否安装ntp

    1
    2
    3
    4
    5
    6
    net time protocol
    rpm –qa|grep ntp
    能查到这仨个就ok:
    fontpackages-filesystem-1.44-8.el7.noarch
    ntp-4.2.6p5-25.el7.centos.x86_64
    ntpdate-4.2.6p5-25.el7.centos.x86_64
  • 2.修改ntp时间服务器配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    vim /etc/ntp.conf
    1.授权网段10.167.218.0-10.167.218.255可以从这台机器上查询和同步时间
    找到这个网段限制:
    restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

    2.(集群在局域网中不使用其他互联网上的时间)
    注释掉这个
    # server 0.centos.pool.ntp.org iburst
    # server 1.centos.pool.ntp.org iburst
    # server 2.centos.pool.ntp.org iburst
    # server 3.centos.pool.ntp.org iburst

    3.当节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步。
    127.127.1.0
    fudge 127.127.1.0 stratum 10(时间同步精度)
  • 3.修改/etc/sysconfig/ntpd文件
    让硬件时间与系统时间一起同步

    1
    2
    3
    vim /etc/sysconfig/ntpd
    添加
    SYNC_HWCLOCK=yes
  • 4.重启ntp服务设置ntp服务开机启动

    1
    2
    3
    4
    5
    service ntpd status

    systemctl start ntpd.service
    开机启动
    systemctl enable ntpd.service(chkconfig ntpd on(centos7以下))
  • 5.其他服务器添加crontab –e加上每十分钟同步一次时间
    先执行nptdate h100 同步一次时间

    1
    */10 * * * * /usr/sbin/ntpdate h100(时间服务器ip/域名)
分享到