摘要:偽分布模式在單節點上同時啟動等個進程,模擬分布式運行的各個節點。完全分布式模式正常的集群,由多個各司其職的節點構成。在之前在集群中存在單點故障。正確的下載鏈接會有,這個就是公司需要用戶在下載時提供的注冊信息。
每一次 Hadoop 生態的更新都是如此令人激動
像是 hadoop3x 精簡了內核,spark3 在調用 R 語言的 UDF 方面,速度提升了 40 倍
所以該文章肯定得配備上最新的生態
OS :
組件:
可選項
- Hive
- Flume 1.9
- Sqoop 2
- kafka 2x
- Spark 3x
RDMS:
開發語言:
集群規劃
建議:Zookeeper、JournalNode 節點為奇數
- 防止由腦裂造成的集群不可用
- leader 選舉,要求 可用節點數量 > 總節點數量/2 ,節省資源
Hadoop 安裝有如下三種方式:
此文采用 HA方案 進行部署
可選方案:
此文采用 多臺物理機 方案
共 4 臺物理設備
此文采用版本:Centos7.4 x64
建議:百度網盤 centos7.4 密碼: 8jwf
鏡像刻錄不進行介紹
請參考:
選擇語言:
采用最小安裝方案
> >
設置 root 密碼
點擊 ROOT PASSWORD 設置 root 密碼,不用添加用戶
> >等待完成
完成之后點擊Reboot > >
該節點為虛擬機的朋友提供幫助
1)共享網絡
2)選擇橋接模式
1)查找配置文件
find / -name ifcfg-*
2)修改你 etc 目錄下,并以你網卡名結尾的文件
# 這里舉例我的vi /etc/sysconfig/network-scripts/ifcfg-ens33
動態 IP 修改操作:
- 啟用 dhcp
- 注釋 ipaddr 和 gateway
- onboot 設置為 yes
建議做如下修改
修改為靜態 IP
# 修改BOOTPROTO="static" #dhcp改為staticONBOOT="yes" #開機啟用本配置# 添加IPADDR=192.168.x.x #靜態IPGATEWAY=192.168.x.x #默認網關NETMASK=255.255.255.0 #子網掩碼DNS1=你本機的dns配置 #DNS 配置
3)重啟服務
service network restart
4)ping 一下我的博客試試
ping uiuing.com
安裝 net-tools
yum -y install net-tools
查看 ip
ifconfig
打開客戶端終端進行 ssh 連接
ssh root@yourip
此文采用版本:mysql5.7
登陸 centos
yum -y install gcc gcc-c++ ncurses ncurses-devel cmake
Mysql5.7 版本更新后有很多變化,安裝必須要 BOOST 庫(版本需為 1.59.0)
boost 庫下載地址:boost
1)下載
wget https://jaist.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz
2)檢查 MD5 值,若不匹配則需要重新下載
md5sum boost_1_59_0.tar.gz
3)解壓
tar -vxzf boost_1_59_0.tar.gz
4)存儲
mv boost_1_59_0 /usr/local/boost_1_59_0
安裝 wget
yum -y install wget
官方下載地址:mysql
1)下載
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.21.tar.gz
2)檢查 MD5 值,若不匹配則需要重新下載
md5sum mysql-5.7.21.tar.gz
1)解壓
tar -vxzf mysql-5.7.21.tar.gz
2)編譯
cmake ./
make
3)安裝
make install
啟動
systemctl start mysqld
或者
systemctl start | stop
查看 mysql 狀態
systemctl status mysqld
或者
systemctl status
開機自啟(可選)
systemctl enable mysqld
重載配置(可選)
systemctl daemon-reload
配置 root 密碼
1)生成默認密碼
grep temporary password /var/log/mysqld.log
localhost 后面的就是你的 root 密碼
2)修改密碼
登陸 mysql
mysql -uroot -p你的密碼
修改密碼
ALTER USER root@localhost IDENTIFIED BY 你的密碼;
注意:mysql 5.7 默認安裝了密碼安全檢查插件(validate_password),默認密碼檢查策略要求密碼必須包含:大小寫字母、數字和特殊符號,并且長度不能少于8位
以后可以用 update 更新密碼
use mysql;update user set password=PASSWORD(你的密碼) where user=root;flush privileges;
添加遠程用戶(可選)
GRANT ALL PRIVILEGES ON *.* TO 用戶名@% IDENTIFIED BY 密碼 WITH GRANT OPTION;
use mysql;UPDATE user SET Host=% WHERE User=用戶名;flush privileges;
配置文件:/etc/my.cnf
日志文件:/var/log/mysqld.log
服務啟動腳本:/usr/lib/systemd/system/mysqld.service
socket 文件:/var/run/mysqld/mysqld.pid
此文采用版本:JDK8
安裝文本編輯器 vim
yum -y install vim
JDK 官方下載地址:oracle jdk
使用命令下載:
wget https://download.oracle.com/otn/java/jdk/8u291-b10/d7fc238d0cbf4b0dac67be84580cfb4b/jdk-8u291-linux-x64.tar.gz?AuthParam=1619936099_3a37c8b389365d286242f4b1aa4967b0
因為 oracle 公司不允許直接通過 wget 下載官網上的 jdk 包
正確做法:
通過搜索引擎搜索 jdk 官網下載, 進入 oracle 官網
勾選 accept licence agreement ,并選擇你系統對應的版本
點擊對應的版本下載,彈出如下下載框,然后復制下載鏈接
這個復制的鏈接結算我們 wget 命令的地址。
正確的下載鏈接會有”AuthParam“,這個就是 oracle 公司需要用戶在下載時提供的注冊信息。而且這個信息是用時間限制的,過了一段時間后就會失效,如果你想再次下載 jdk 包,只能再次重復上面的操作。
檢查大小
ls -lht
查看文件名(用于解壓)
ls
創建文件夾
mkdir /usr/local/java
解壓
tar -zxvf 你的jdk包名 -C /usr/local/java/
查看文件名(用于配置環境變量)
ls /usr/local/java
打開配置文件
vi /etc/profile
在末尾添加
# jdk8 # 添加jdk地址變量 JAVA_HOME=/usr/local/java # 添加jre地址變量 JRE_HOME=${JAVA_HOME}/jre # 添加java官方庫地址變量 CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib # 添加PATH地址變量 PATH=${JAVA_HOME}/bin:$PATH # 使變量生效 export JAVA_HOME JRE_HOME CLASSPATH PATH
刷新配置文件
source /etc/profile
添加軟鏈接(可選)
ln -s /usr/local/java/jdk1.8.0_291/bin/java /usr/bin/java
檢查
java -version
此文采用版本:Python3.6
我們已經掌握了二進制包安裝的方法,所以我們直接通過 yum 來安裝 Python
yum -y install python36
依賴:python36-libs
安裝 pip3(默認已安裝)
yum install python36-pip -y
檢查
python3 --version
此文采用版本:Scala2.11.7
請確保已安裝JDK8或者JDK11
Scala 官方下載地址:Scala
使用命令下載:
wget https://downloads.lightbend.com/scala/2.11.7/scala-2.11.7.tgz
檢查大小
ls -lht
查看文件名(用于解壓)
ls
創建文件夾
mkdir /usr/local/scala
解壓
tar -zxvf 你的jdk包名 -C /usr/local/scala/
查看文件名(用于配置環境變量)
ls /usr/local/scala
打開配置文件
vi /etc/profile
在末尾添加
# scala 2.11.7 # 添加scala執行文件地址變量 SCALA_HOME=/usr/local/scala/scala-2.11.7 # 添加PATH地址變量 PATH=$PATH:$SCALA_HOME/bin # 使變量生效 export SCALA_HOME PATH
刷新配置文件
source /etc/profile
檢查
scala -version
使用虛擬機的朋友請直接克隆
切記要返回第四步驟更改各節點ip,不然會發生ip沖突
1)備份
前往根目錄
cd /
備份
tar cvpzf backup.tgz / --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys --exclude=backup.tgz
備份完成后,在文件系統的根目錄將生成一個名為“backup.tgz”的文件,它的尺寸有可能非常大。你可以把它燒錄到 DVD 上或者放到你認為安全的地方去
在備份命令結束時你可能會看到這樣一個提示:’tar: Error exit delayed from previous
errors’,多數情況下你可以忽略
2)準備
別忘了到其他設備下重新創建那些在備份時被排除在外的目錄(如果不存在):
mkdir procmkdir lost+foundmkdir mntmkdir sys
3)復刻
可選前提:
到其他物理機上恢復文件
tar xvpfz backup.tgz -C /
恢復 SELinux 文件屬性
restorecon -Rv /
1)修改 hostname
到各設備下執行
# 設備 1 (立即生效)hostnamectl set-hostname master
# 設備 2 (立即生效)hostnamectl set-hostname slave1
# 設備 3 (立即生效)hostnamectl set-hostname slave2
# 設備 4 (立即生效)hostnamectl set-hostname slave3
2)配置 host 文件
查看各設備 ip(到各設備下執行)
ifconfig
到 master 下打開 host 文件
vim /etc/hosts
末尾追加
master設備的ip masterslave1設備的ip masterslave2設備的ip masterslave3設備的ip master
3)通過 scp 傳輸 host 文件
scp 語法:scp 文件名 遠程主機用戶名@遠程主機名或ip:存放路徑
到 master 下執行
scp /etc/hosts root@SlaveIP:/etc/
注意:請按照 slave 個數,對其 ip 枚舉傳輸
ping 一下
ping -c 4 slave1
能 ping 通就沒問題
以下操作均在master下執行
1)到各設備下生成密鑰
ssh-keygen -t rsa
一路回車
到 master 生成公鑰
cd ~/.ssh/ && cat id_rsa.pub > authorized_keys
之后將各設備的密鑰全復制到authorized_keys文件里
2)通過 scp 傳輸公鑰
到 master 下執行
scp authorized_keys root@SlaveNumbe:~/.ssh/
注意:請按照之前設置的 hostname ,對其 ip 枚舉傳輸
例如: scp authorized_keys root@slave1:~/.ssh/
注意,如果各節點下沒有 ~/.ssh/ 目錄則會配置失敗
檢查
ssh slave1
中斷該 ssh 連接(可選)
exit
該配置主要方便客戶端遠程操作
無論是用虛擬機進行學習的朋友,還是工作的朋友都強烈推薦
以下操作均在客戶端(MAC OS)上執行
修改 hots 文件
sudo vim /etc/hosts
將 master 設備下/etc/hosts 之前追加的內容,copy 追加到客戶端 hosts 末尾
ping 一下,能 ping 通就沒問題
免密鑰 ssh 登陸
客戶端生產密鑰:
sudo ssh-keygen -t rsa
打開密鑰
vim ~/.ssh/id_rsa
到 master 內向各節點申請同步
scp authorized_keys root@SlaveNumbe:~/.ssh/
windows ssh 目錄:C:/Users/your_userName.ssh
檢查
ssh master
此文采用版本 ZooKeepr3.6.3
官方下載地址:Zookeeper記得下載帶bin字樣的
從客戶端上下載 壓縮包
到 master 節點上創建 zookeeper 文件夾
mkdir /usr/local/zookeeper
從客戶端上傳到 master
scp 你下載的Zookeeper路徑 root@master:/usr/local/zookeeper
以下操作切換至master節點上
解壓
cd /usr/local/zookeeper tar xf apache-zookeeper-3.6.3-bin.tar.gz
打開配置文件
vim /etc/profile
在末尾添加
# ZooKeeper3.6.3 # 添加zookeeper地址變量 ZOOKEEPER_HOME=/usr/local/zookeeper/apache-zookeeper-bin.3.6.3 # 添加PATH地址變量 PATH=$ZOOKEEPER_HOME/bin:$PATH # 使變量生效 export ZOOKEEPER_HOME PATH
刷新配置文件
source /etc/profile
創建數據目錄
mkdir /zookeepermkdir /zookeeper/datamkdir /zookeeper/logs# 同步# 自行枚舉
添加配置文件
cp $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg
vim $ZOOKEEPER_HOME/conf/zoo.cfg
修改和添加
tickTime=2000initLimit=10syncLimit=5dataDir=/zookeeper/datadataLogDir=/zookeeper/logsclientPort=2181server.1=master:2888:3888server.2=slea1:2888:3888server.3=slea2:2888:3888server.4=slea3:2888:3888:observer
到 master 下執行請根據節點個數枚舉執行
同步文件
scp /etc/profile root@slave1:/etc/
scp -r /zookeeper root@slave1:/
scp -r /usr/local/zookeeper root@slave1:/usr/local/
配置節點標識
參考資資料:leader 選舉
ssh master "echo "9" > /zookeeper/data/myid"ssh slave1 "echo "1" > /zookeeper/data/myid"ssh slave2 "echo "2" > /zookeeper/data/myid"ssh slave3 "echo "3" > /zookeeper/data/myid"
防火墻配置
#開放端口firewall-cmd --add-port=2181/tcp --permanentfirewall-cmd --add-port=2888/tcp --permanentfirewall-cmd --add-port=3888/tcp --permanent#重新加載防火墻配置firewall-cmd --reload
節點批量執行
# master節點ssh master "firewall-cmd --add-port=2181/tcp --permanent && firewall-cmd --add-port=2888/tcp --permanent && firewall-cmd --add-port=3888/tcp --permanent && firewall-cmd --reload "# slave1節點 其他請自行枚舉執行ssh slave1 "firewall-cmd --add-port=2181/tcp --permanent && firewall-cmd --add-port=2888/tcp --permanent && firewall-cmd --add-port=3888/tcp --permanent && firewall-cmd --reload "
啟動 ZooKeeper
sh $ZOOKEEPER_HOME/bin/zkServer.sh start
編寫批量啟動 shell
vim /bin/zk && chmod 777 /bin/zk
#! /bin/shcase $1 in"start"){ echo -e "/e[32m---------------------------------------------------------------------------/033[0m" echo -e "/e[32m...master-start.../033[0m" ssh master "sh $ZOOKEEPER_HOME/bin/zkServer.sh start" echo -e "/e[32m...slave1-start.../033[0m" ssh slave1 "sh $ZOOKEEPER_HOME/bin/zkServer.sh start" echo -e "/e[32m...slave2-start.../033[0m" ssh slave2 "sh $ZOOKEEPER_HOME/bin/zkServer.sh start" echo -e "/e[32m...slave3-start.../033[0m" ssh slave3 "sh $ZOOKEEPER_HOME/bin/zkServer.sh start" echo -e "/e[32m...all-start-end.../033[0m" echo -e "/e[32m---------------------------------------------------------------------------/033[0m"};;"stop"){ echo -e "/e[32m---------------------------------------------------------------------------/033[0m" echo -e "/e[32m...master-stop.../033[0m" ssh master "sh $ZOOKEEPER_HOME/bin/zkServer.sh stop" echo -e "/e[32m...slave1-start.../033[0m" ssh slave1 "sh $ZOOKEEPER_HOME/bin/zkServer.sh stop" echo -e "/e[32m...slave2-start.../033[0m" ssh slave2 "sh $ZOOKEEPER_HOME/bin/zkServer.sh stop" echo -e "/e[32m...slave3-start.../033[0m" ssh slave3 "sh $ZOOKEEPER_HOME/bin/zkServer.sh stop" echo -e "/e[32m...all-stop-end.../033[0m" echo -e "/e[32m---------------------------------------------------------------------------/033[0m"};;"status"){ echo -e "/e[32m---------------------------------------------------------------------------" echo -e "/e[32m...master-status.../033[0m" ssh master "sh $ZOOKEEPER_HOME/bin/zkServer.sh status" echo -e "/e[32m...slave1-start.../033[0m" ssh slave1 "sh $ZOOKEEPER_HOME/bin/zkServer.sh status" echo -e "/e[32m...slave2-start.../033[0m" ssh slave2 "sh $ZOOKEEPER_HOME/bin/zkServer.sh status" echo -e "/e[32m...slave3-start.../033[0m" ssh slave3 "sh $ZOOKEEPER_HOME/bin/zkServer.sh status" echo -e "/e[32m...all-status-end.../033[0m" echo -e "/e[32m---------------------------------------------------------------------------/033[0m"};;esac
命令
# 啟動zk start# 查看狀態zk status# 關閉zk stop
啟動之后 MODE 和我的顯示一樣就算成功了
此文采用版本 Hadoop3.2.2
官方下載地址:Hadoop
從客戶端上下載 壓縮包
到 master 節點上創建 Hadoop 文件夾
mkdir /usr/local/hadoop
從客戶端上傳到 master
scp 你下載的hadoop路徑 root@master:/usr/local/hadoop
以下操作切換至master節點上
解壓
cd /usr/local/hadoop tar xf hadoop包名
打開配置文件
vim /etc/profile
在末尾添加
# Hadoop 3.2.2 # 添加hadoop地址變量 HADOOP_HOME=/usr/local/hadoop/hadoop-3.3.0 # 添加PATH地址變量 PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin # 使變量生效 export HADOOP_HOME PATH# IF HADOOP >= 3x / for root # HDFS HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root HDFS_ZKFC_USER=root # YARN YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root # run export HDFS_DATANODE_USER HADOOP_SECURE_DN_USER HDFS_NAMENODE_USER HDFS_SECONDARYNAMENODE_USER HDFS_ZKFC_USER YARN_RESOURCEMANAGER_USER HADOOP_SECURE_DN_USER YARN_NODEMANAGER_USER
請自行使用scp將文件同步至各節點
刷新配置文件
source /etc/profile
創建數據目錄
mkdir /hadoopmkdir /hadoop/journaldatamkdir /hadoop/hadoopdata# 同步# 自行枚舉
添加 Jdk 環境
打開文件
vim /usr/local/hadoop/hadoop-3.3.0/etc/hadoop/hadoop-env.sh
添加或修改
export JAVA_HOME=/usr/local/java
接下來我們要修改的文件:
前往配置文件目錄
cd /usr/local/hadoop/hadoop-3.3.0/etc/hadoop/
core-site.xml
fs.defaultFS hdfs://jed hadoop.tmp.dir /hadoop/hadoopdata ha.zookeeper.quorum master:2181,slave1:2181,slave2:2181,slave3:2181
hdfs-site.xml
dfs.replication 2 dfs.nameservices jed dfs.ha.namenodes.jed nn1,nn2 dfs.namenode.rpc-address.jed.nn1 master:9000 dfs.namenode.http-address.jed.nn1 master:50070 dfs.namenode.rpc-address.jed.nn2 slave1:9000 dfs.namenode.http-address.jed.nn2 slave1:50070 dfs.namenode.shared.edits.dir qjournal://master:8485;slave1:8485;slave2:8485/jed dfs.journalnode.edits.dir /hadoop/journaldata dfs.ha.automatic-failover.enabled true dfs.client.failover.proxy.provider.jed org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider dfs.ha.fencing.methods sshfence shell(/bin/true) dfs.ha.fencing.ssh.private-key-files /var/root/.ssh/id_rsa dfs.ha.fencing.ssh.connect-timeout 20000
mapred-site.xml
mapreduce.framework.name yarn mapreduce.jobhistory.address master:10020 mapreduce.jobhistory.webapp.address master:19888 yarn.app.mapreduce.am.env HADOOP_MAPRED_HOME=${HADOOP_HOME} mapreduce.map.env HADOOP_MAPRED_HOME=${HADOOP_HOME} mapreduce.reduce.env HADOOP_MAPRED_HOME=${HADOOP_HOME}
yarn-site.xml
yarn.resourcemanager.ha.enabled true yarn.resourcemanager.cluster-id Cyarn yarn.resourcemanager.ha.rm-ids rm1,rm2 yarn.resourcemanager.hostname.rm1 slave2 yarn.resourcemanager.webapp.address.rm1 slave2 yarn.resourcemanager.hostname.rm2 slave3 yarn.resourcemanager.webapp.address.rm2 slave3 yarn.resourcemanager.zk-address master:2181,slave1:2181,slave2:2181,slave3:2181 yarn.nodemanager.aux-services mapreduce_shuffle yarn.log-aggregation-enable true yarn.log-aggregation.retain-seconds 86400 yarn.resourcemanager.recovery.enabled true yarn.resourcemanager.store.class org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
workers注意!在Hadoop3x以前的版本是 slaves 文件
masterslave1slave2slave3
使用 scp 分發給其他節點
scp -r /usr/local/hadoop slave1:/usr/local/
請自行枚舉執行
使用之前的 zk 腳本啟動 zeekeeper 集群
zk start
分別在每個 journalnode 節點上啟動 journalnode 進程
# master slave1 slave2hadoop-daemon.sh start journalnode
在第一個 namenode 節點上格式化文件系統
hadoop namenode -format
同步兩個 namenode 的元數據
查看你配置的 hadoop.tmp.dir 這個配置信息,得到 hadoop 工作的目錄,我的是/hadoop/hadoopdata/
把 master 上的 hadoopdata 目錄發送給 slave1 的相同路徑下,這一步是為了同步兩個 namenode 的元數據
scp -r /hadoop/hadoopdata slave1:/hadoop/
也可以在 slave1 執行以下命令:
hadoop namenode -bootstrapStandby
格式化 ZKFC(任選一個 namenode 節點格式化)
hdfs zkfc -formatZK
啟動 hadoop 集群
start-all.sh
相關命令請前往 $HADOOP_HOME/sbin/ 查看
啟動 mapreduce 任務歷史服務器
mr-jobhistory-daemon.sh start historyserver
編寫 jps 集群腳本
vim /bin/jpall && chmod 777 /bin/jpall
#! /bin/sh echo -e "/e[32m---------------------------------------------------------------------------/033[0m" echo -e "/e[32m...master-jps.../033[0m" ssh master "jps" echo -e "/e[32m...slave1-jps.../033[0m" ssh slave1 "jps" echo -e "/e[32m...slave2-jps.../033[0m" ssh slave2 "jps" echo -e "/e[32m...slave3-jps.../033[0m" ssh slave3 "jps" echo -e "/e[32m...all-jps-end.../033[0m" echo -e "/e[32m---------------------------------------------------------------------------/033[0m"
運行
jpall
查看各節點的主備狀態
hdfs haadmin -getServiceState nn1
查看 HDFS 狀態
hdfs dfsadmin -report
WEB 訪問可以直接瀏覽器: IP:50070
上傳一個文件
hdfs dfs -put test.out
check
hdfs dfs -ls /user/root
hadoop fs -rm -r -skipTrash /user/root/test.out
刪除
我們使用 hadoop 自帶的圓周率測試
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar pi 5 5
運行結果
查看進程
jps
殺死進程
kill -9 5114
現在 master 已不是 namenode 了
現在 slave1 變成了主節點
恢復 master 節點
hadoop-daemon.sh start namenode
master 變成了 standby,什么 HA 具備
刪除所有節點中 hadoop 的工作目錄(core-site.xml 中配置的 hadoop.tmp.dir 那個目錄)
如果你在 core-site.xml 中還配置了 dfs.datanode.data.dir 和 dfs.datanode.name.dir 這兩個配置,那么把這兩個配置對應的目錄也刪除
刪除所有節點中 hadoop 的 log 日志文件,默認在 HADOOP_HOME/logs 目錄下
刪除 zookeeper 集群中所關于 hadoop 的 znode 節點
圖中的紅色框中 rmstore 這個節點不能刪除,刪除另外兩個就可以
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/123650.html
閱讀 730·2023-04-25 19:43
閱讀 3974·2021-11-30 14:52
閱讀 3801·2021-11-30 14:52
閱讀 3865·2021-11-29 11:00
閱讀 3796·2021-11-29 11:00
閱讀 3894·2021-11-29 11:00
閱讀 3571·2021-11-29 11:00
閱讀 6154·2021-11-29 11:00