我这里列举了两种方法。第一种是网上常见的,但是我总是配置失败,报各种错。第二种是我结合思考根据第一种改编了,目前没有出现问题。您自行选择使用哪种。

这些操作必须使用root权限(命令前加sudo)

如果没有特别说明,全部机器都要该操作。

前置准备

  1. 安装ntp服务和ntpdate服务

    1
    2
    sudo apt-get install ntp
    sudo apt-get install ntpdate
  2. 查看所有节点 ntpd 服务状态和开机自启动状态

    1
    2
    3
    sudo systemctl status ntp			# 查看服务状态
    sudo systemctl start ntp # 开启服务
    sudo systemctl is-enabled ntp # 开机自启动状态

    如果第二步报错:Failed to start ntp.service: Unit ntp.service is masked.

    就先输入:

    1
    sudo systemctl unmask ntp.service

    先解除mask,然后在执行开启服务命令。

  3. 修改时区:d

    1
    date # 查看时间

    发现时间和系统时间不同,修改时区。

    先查看一下当前时区:

    1
    timedatectl

    我查了之后是:Etc/UTC (UTC, +0000)

    罗列一下可用时区:

    1
    timedatectl list-timezones

    浏览一下选择一个最近的,然后:

    1
    sudo timedatectl set-timezone Asia/Chongqing

    我选的是重庆,一般可以选Asia/Shanghai。

  4. 设置时间为24小时(默认是12小时的,我不喜欢)

    1
    sudo vim /etc/default/locale

    添加:

    1
    LC_TIME=en_DK.UTF-8

    修改后重启服务器即可(reboot)。

  5. 如果有如下情况:

    System clock synchronized: no

    即:System clock synchronized: no。表示同步服务没有启动:

    需要:

    1
    sudo apt install systemd-timesyncd

    完了之后它会说重启服务(如下图),不用选,按下Tab就到了OK,回车即可。

    重启服务

    再输入timedatectl查看,如果是yes就OK了。

第一种方法

  1. 修改hadoop103的ntp.conf配置文件

    1
    s

    修改内容为:

    • 修改授权 192.168.64.0-192.168.64.255 网段上的所有机器可以从这台机器上查询和同步时间

      1
      restrict 192.168.64.0 mask 255.255.255.0 nomodify notrap

      修改后

    • 注释掉使用外部网络

      1
      2
      3
      4
      # pool 0.ubuntu.pool.ntp.org iburst
      # pool 1.ubuntu.pool.ntp.org iburst
      # pool 2.ubuntu.pool.ntp.org iburst
      # pool 3.ubuntu.pool.ntp.org iburst
    • 当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中 的其他节点提供时间同步

      pool ntp.ubuntu.com下添加(这一行也要注释掉):

      1
      2
      server 127.127.1.0
      fudge 127.127.1.0 stratum 10

      修改后如图:

      修改后

  2. 关闭其他机器上的ntp服务和自启动

    1
    2
    sudo systemctl stop ntp
    sudo systemctl disable ntp
  3. 其他机器每十分钟来向主机(hadoop103)同步一次时间

    注意,hadoop103不写,只有其他机器才写。

    1
    sudo crontab -e

    如果出现如下情况:

    情形

    则选择2(/usr/bin/vim.basic).

    编写定时任务:

    1
    */10 * * * * /usr/sbin/ntpdate hadoop103

    第二种方法

这个根据第一种方法得到的灵感。第一种方法是关闭其他两台服务器的ntp服务,然后编写定时任务,每十分钟向主节点hadoop103申请时间同步。我就在想,干脆三台节点都编写定时任务,每十分钟向Windows或Mac主机请求同步时间,不也是准确的吗。

如果你执行了第一种方法请先还原相关配置(按第一种方法逆向操作、关闭的东西该开就打开)。因为我是逆向操作了的,如果不还原我也不知道会不会出其他错。

只要时间都是可主机大差不差,就直接编写定时任务即可:

1
sudo crontab -e

编写:

1
*/10 * * * * /usr/sbin/ntpdate cn.pool.ntp.org