最近負責的項目準備上大數據平臺存儲,主要仍是圍繞Hadoop平臺來實現,雖然打算上cdh版本的hadoop,可是爲了前期方便開發仍是先使用原聲的hadoop進行開發,後期再準備更好的環境進行擴展。html
三臺服務器系統環境是創建在Centos7.6基礎上。而且是創建在root帳戶上運行的,若是須要使用其餘用戶操做,注意權限的問題java
在三臺新購買的服務器上進行搭建。服務器規劃以下node
hostname | ip | 說明 |
---|---|---|
tidb1 | 192.168.108.66 | namenode與datanode |
tidb2 | 192.168.108.67 | namenode與datanode |
tidb3 | 192.168.108.68 | namenode與datanode |
搭建大數據集羣基礎機器配置是三臺,真實環境部署建議namenode與datanode進行分開,兩臺機器專門作namenode節點,其餘三臺作datanode節點。linux
每臺機器安裝內容以下:web
tidb1 | tidb2 | tidb3 | |
---|---|---|---|
NameNode | √ | √ | |
DataNode | √ | √ | √ |
ResourceManager | √ | √ | |
NodeManager | √ | √ | √ |
Zookeeper | √ | √ | √ |
journalnode | √ | √ | √ |
zkfc | √ | √ |
在3.0版本以上,咱們能夠進行安裝多個NameNode節點,來保證更高的高可用方案。可是做爲基礎的測試環境開發這樣就是能夠了,更多機器擴展也在此進行擴展便可。數據庫
三臺機器都須要這麼作express
部署集羣以前將集羣的防火牆進行關閉,不然部署出現,訪問端口訪問不到的情景。apache
centos 系統中存在兩種防火牆,firewall 與iptables , 7.0之後默認是firewall 防火牆,可是也在網上看到其餘朋友碰見過 7.0系統上存在兩種防火牆策略致使佈置程序端口一直訪問不到的狀況。vim
[root@tidb1 sbin]# firewall-cmd --state
running
複製代碼
systemctl stop firewalld.service
複製代碼
systemctl disbale firewalld.service
複製代碼
執行以上三步以後,程序再開機以後再也不出現防火牆的配置問題。centos
若是是這個防火牆的配置,咱們也須要進行防火牆的關閉,若是熟悉的話其實打開對應的端口策略便可。
service iptables status
複製代碼
service iptables stop
Redirecting to /bin/systemctl stop iptables.service
複製代碼
chkconfig iptables off
複製代碼
對於安裝在其餘系統上的集羣環境,按照對應的策略進行關閉防火牆。
三臺機器都須要這麼作
關於這個加強型Linux,網上不少都建議關閉,在這裏搜索下了相關資料,主要是沒有人進行專門的維護運營白名單致使的。
測試環境上咱們也進行關閉,方便咱們集羣的搭建。正式上線根據運維的須要進行部署執行。
getenforce
複製代碼
setenforce 0 #將SELinux修改成Permissive狀態(遇到違反安全策略的,會採起警告,容許經過)
setenforce 1 #將SELinux狀態修改成Enforcing狀態(遇到違反安全策略的,不容許經過)
複製代碼
打開文件: /etc/selinux/config 修改 SELINUX = disabled
重啓機器後生效,重啓機器命令:reboot
複製代碼
三臺機器都須要這麼作
在企業環境中,若是是真實的服務器,不是利用雲服務器,那麼咱們使用服務器以前須要進行ip的固定,否則服務器出現意外重啓,會致使咱們ip變更,集羣就不能正常啓動。 固定ip,兩種執行方案:
ls /etc/sysconfig/network-scripts/
複製代碼
vi /etc/sysconfig/network-scripts/ifcfg-enp*
# 啓用host-only網卡
cd /etc/sysconfig/network-scripts/
cp ifcfg-enp0s3 ifcfg-enp0s8
複製代碼
service network restart
複製代碼
三臺機器都須要這麼作
重點注意,配置主節點Namenode的時候,須要將localhost 兩行 註釋掉,否則會出現找不到hostname的問題。其餘節點能夠存在
vim /etc/hosts
[root@tidb1 network-scripts]# cat /etc/hosts
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.108.66 tidb1
192.168.108.67 tidb2
192.168.108.68 tidb3
複製代碼
老生常態,集羣之間須要經過ssh,互相通訊,那麼須要設置免登錄的狀況。 步驟以下:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
複製代碼
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys`
複製代碼
chmod 0600 ~/.ssh/authorized_keys
複製代碼
ssh-copy-id root@tidb2
ssh-copy-id root@tidb3
複製代碼
ssh tidb2
ssh tidb3
ssh tidb1
複製代碼
在每條機器上,都須要進行操做,實現免登錄,若是存在免登錄失敗
目錄權限的問題,解決。
sudo chmod 700 ~
sudo chmod 700 ~/.ssh
sudo chmod 600 ~/.ssh/authorized_keys
複製代碼
hadoop HA版本咱們須要使用zookeeper來實現,因此須要準備的軟件就有這樣三個了 hadoop ,zookeeper,jdk1.8版本。
1. 建立三個軟件的存儲位置
mkdir zookeeper
mkdir hadoop
mkdir java
2. 下載軟件
移動到相應的目錄下 下載軟件
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-3.1.1/hadoop-3.1.1-src.tar.gz
jdk 去oracle 網站進行下載再上傳到咱們服務器的目錄上。
3. 進行相應的解壓
tar -zxvf zookeeper-3.4.13.tar.gz
tar -zxvf hadoop-3.1.1-src.tar.gz
tar -zxvf jdk1.8.tar.gz
複製代碼
以上基礎內容都配置好以後,咱們就能夠開始進行程序的安裝了。首先在第一臺機器上進行配置好以後在經過rsync 進行同步發送過去
centos 上的安裝,每臺都須要進行安裝
rpm -qa | grep rsync 檢查是否安裝無哦rsync
yum install -y rsync 使用yum安裝rsync
複製代碼
cd /home/bigdata/java/jdk1.8
pwd 找到路徑信息
複製代碼
JAVA_HOME=/home/bigdata/java/jdk1.8
JRE_HOME=/home/bigdata/java/jdk1.8/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
複製代碼
tidb2:
rsync -avup /etc/profile root@tidb2:/etc/
tidb3:
rsync -avup /etc/profile root@tidb3:/etc/
複製代碼
三臺都執行
source /etc/profile
若是是使用的我的用戶須要執行
source ~/.bashrc
複製代碼
cd /home/bigdata/zookeeper/zookeeper-3.4.13
複製代碼
cd /home/bigdata/zookeeper/zookeeper-3.4.13/conf
cp zoo_sample.cfg zoo.cfg
mv zoo_sample.cfg bak_zoo_sample.cfg 備份文件
複製代碼
修改以前 建立dataDir 文件 mkdir -p /home/bigdata/zookeeper/zookeeper-3.4.13/tmp
在原先的基礎內容上增長server配置內容與配置dataDir文件內容
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
#修改的dataDir文件路徑,配置臨時文件路徑內容便可,配置的文件路徑須要提早建立好
# example sakes.
dataDir=/home/bigdata/zookeeper/zookeeper-3.4.13/tmp
# the port at which the clients will connect
clientPort=2181
# 配置server 幾臺機器就配置幾臺便可,注意server的數字,咱們在後續須要用到
server.1=tidb1:2888:3888
server.2=tidb2:2888:3888
server.3=tidb3:2888:3888
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purg
複製代碼
上面的基本配置信息內容以下:
clientPort=2181
server.serverid=host:tickpot:electionport 固定寫法
server:固定寫法
serverid:每一個服務器的指定ID(必須處於1-255之間,必須每一臺機器不能重複)
host:主機名
tickpot:心跳通訊端口
electionport:選舉端口
複製代碼
mkdir -p /home/bigdata/zookeeper/zookeeper-3.4.13/tmp
echo 1 > /home/bigdata/zookeeper/zookeeper-3.4.13/tmp/myid
複製代碼
rsync -avup /home/bigdata/zookeeper root@tibd2:/home/bigdata/
rsync -avup /home/bigdata/zookeeper root@tibd3:/home/bigdata/
複製代碼
tidb2:
vim /home/bigdata/zookeeper/zookeeper-3.4.13/tmp/myid 將1改成2
tidb3:
vim /home/bigdata/zookeeper/zookeeper-3.4.13/tmp/myid 將1改成3
複製代碼
JAVA_HOME=/home/bigdata/java/jdk1.8
JRE_HOME=/home/bigdata/java/jdk1.8/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
ZOOKEEPER_HOME=/home/bigdata/zookeeper/zookeeper-3.4.13
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$ZOOKEEPER_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH ZOOKEEPER_HOME
source /etc/profile
複製代碼
小黑板,三臺都須要執行
cd /home/bigdata/zookeeper/zookeeper-3.4.13/bin
執行 ./zkServer.sh start
檢查是否啓動
方式1 :
使用命令jps 檢查是否執行成功,jps 不存在的執行下安裝 檢查是否 有這個配置export PATH=$PATH:/usr/java/jdk1.8/bin
85286 QuorumPeerMain 表明執行成功
方式2:
./zkServer.sh status
[root@tidb1 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/bigdata/zookeeper/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: follower 表明是從節點
Mode: Leader 表明的是主節點
複製代碼
安裝過程當中咱們須要一些目錄文件進行存儲咱們的數據,日誌文件,數據存儲文件都是保存在不一樣的目錄中,須要提早準備好
複製代碼
每臺機器上三個硬盤,須要三個目錄進行建立
mkdir -p /media/data1/hdfs/data
mkdir -p /media/data2/hdfs/data
mkdir -p /media/data3/hdfs/data
複製代碼
mkdir -p /media/data1/hdfs/hdfsjournal
複製代碼
mkdir -p /media/data1/hdfs/name
複製代碼
編輯 hadoop中的hadoop-env.sh文件
vim /home/bigdata/hadoop/hadoop/etc/hadoop/hadoop-env.sh
配置 jdk環境 ,在這裏還能夠配置jvm內存大小等內容
export JAVA_HOME=/home/bigdata/java/jdk1.8
#export HADOOP_NAMENODE_OPTS=" -Xms1024m -Xmx1024m -XX:+UseParallelGC"
#export HADOOP_DATANODE_OPTS=" -Xms512m -Xmx512m"
#export HADOOP_LOG_DIR=/opt/data/logs/hadoop 配置日誌文件
複製代碼
vim /home/bigdata/hadoop/hadoop/etc/hadoop/core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!-- 制定hdfs的nameservice ,默認的連接地址 ,本身能夠自定義的-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster</value>
</property>
<!--臨時文件 存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/media/data1/hdfstmp</value>
</property>
<!--指定 zookeeper ,還能夠更多的設置超時時間等內容-->
<property>
<name>ha.zookeeper.quorum</name>
<value>tidb1:2181,tidb2:2181,tidb3:2181</value>
</property>
</configuration>
複製代碼
vim /home/bigdata/hadoop/hadoop/etc/hadoop/hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!--配置的 nameservice 的名字 ,須要與core-site.xml 中保持一致,而且利用其名稱與namenode 設置惟一標識-->
<property>
<name>dfs.nameservices</name>
<value>cluster</value>
</property>
<!--配置的權限問題-->
<property>
<name>dfs.permissions.enabled</name>
<value>false</varsync -avup hadoop-3.1.1 root@tidb2:/home/bigdata/hadoop/lue>
</property>
<!--配置cluster下面的namenode 名稱-->
<property>
<name>dfs.ha.namenodes.cluster</name>
<value>nn1,nn2</value>
</property>
<!--配置namenode的 地址與端口-->
<property>
<name>dfs.namenorsync -avup hadoop-3.1.1 root@tidb2:/home/bigdata/hadoop/de.rpc-address.cluster.nn1</name>
<value>tidb1:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster.nn2</name>
<value>tidb2:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster.nn1</name>
<value>tidb1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster.nn2</name>
<value>tidb2:50070</value>
</property>
<!-- journal namenode 同步namenode 的元數據共享存儲位置。也就是journal的列表信息->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://tidb1:8485;tidb2:8485;tidb3:8485/cluster</value>
</property>rsync -avup hadoop-3.1.1 root@tidb2:/home/bigdata/hadoop/
<!--配置高可用方案內容,失敗後自動切換的方式-->
<property>
<name>dfs.client.failover.proxy.provider.cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--ssh方案配置-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>hdfs-site.xml
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!--journalnode 的保存文件路徑-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/media/data1/hdfs/hdfsjournal</value>
</property>
<!--開啓NameNode失敗自動切換-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--namenode 文件路徑信息-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/media/data1/hdfs/name</value>
</property>
<!--datanode 數據保存路徑,配置多個數據盤-->
<property><property>
<name>dfs.namenode.name.dir</name>
<value>/media/data1/hdfs/name</value>
</property>
<name>dfs.datanode.data.dir</name>
<value>/media/data1/hdfs/data,
/media/data2/hdfs/data,
/media/data3/hdfs/data
</value>
</property>
<!--設置的副本數量,在程序彙總副本的係數是能夠更改的-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--開啓webhdfs接口訪問-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.journalnode.http-address</name>
<value>0.0.0.0:8480</value>
</property>
<property>
<name>dfs.journalnode.rpc-address</name>
<value>0.0.0.0:8485</value>
</property>
<!--配置 zookeeper-->
<property>
<name>ha.zookeeper.quorum</name>
<value>tidb1:2181,tidb2:2181,tidb3:2181</value>
</property>
</configuration>
複製代碼
vim /home/bigdata/hadoop/hadoop/etc/hadoop/mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!--指定mr 配置yarn信息-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 指定mapreduce jobhistory地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>tidb1:10020</value>
</property>
<!-- 任務歷史服務器的web地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>tidb1:19888</value> rsync -avup hadoop-3.1.1 root@tidb2:/home/bigdata/hadoop/
</property>
</configuration>
複製代碼
vim /home/bigdata/hadoop/hadoop/etc/hadoop/yarn-site.xm
<?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, softwarersync -avup hadoop-3.1.1 root@tidb2:/home/bigdata/hadoop/
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Site specific YARN configuration properties -->
<configuration>
<!--配置 namenode 的ha id namenode 節點上進行配置 ,可不配置-->
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value> rsync -avup hadoop-3.1.1 root@tidb2:/home/bigdata/hadoop/
</property>
<!-- Site specific YARN configuration properties -->
<!--啓用resourcemanager ha-->
<!--是否開啓RM ha,默認是開啓的-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--聲明兩臺resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>rmcluster</value>
</property>
<!--制定rm的名字-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!--指定rm的地址-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>tidb1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>tidb2</value>
</property>
<!--指定zookeeper集羣的地址--> rsync -avup hadoop-3.1.1 root@tidb2:/home/bigdata/hadoop/
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>tidb1:2181,tidb2:2181,tidb3:2181</value>
</property>
<!--啓用自動恢復,當任務進行一半,rm壞掉,就要啓動自動恢復,默認是false-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager的狀態信息存儲在zookeeper集羣,默認是存放在FileSystem裏面。-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
複製代碼
/home/bigdata/hadoop/hadoop/etc/hadoop/workers
#將數據節點加入到workers裏面,若是namenode與datanode 節點是分開的,在這裏 namenode的節點就不加入到這裏。
#沒有分開那麼就須要加入
tidb1
tidb2
tidb3
複製代碼
vim /home/bigdata/hadoop/hadoop/sbin/start-dfs.sh vim /home/bigdata/hadoop/hadoop/sbin/stop-dfs.sh
3.0版本之後須要增長如下內容
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root
複製代碼
vim /home/bigdata/hadoop/hadoop/sbin/start-yarn.sh vim /home/bigdata/hadoop/hadoop/sbin/stop-yarn.sh
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
複製代碼
rsync -avup hadoop-3.1.1 root@tidb2:/home/bigdata/hadoop/
rsync -avup hadoop-3.1.1 root@tidb3:/home/bigdata/hadoop/
同步完以後 若是配置的namenode的編號須要注意如下內容:
修改namenode上的id 編號,datanode 上的編號進行刪除,
複製代碼
上面的全部文件準備好以後,咱們開始進行啓動了。
Zookeeper->JournalNode->格式化NameNode->建立命名空間zkfs->NameNode->Datanode->ResourceManager->NodeManager
每臺進入到安裝的zookeeper目錄下
./zkServer.sh start
複製代碼
進入到hadoop的安裝目錄下 而後進到sbin 目錄下
./hadoop-daemon.sh start journalnode 啓動journalnode
複製代碼
hadoop namenode -format
複製代碼
同步的內容:配置hdfs-site.xml文件路徑下的內容
<property>
<name>dfs.namenode.name.dir</name>
<value>/media/data1/hdfs/name</value>
</property>
進行同步
rsync -avup current root@tidb2:/media/data1/hdfs/name/
rsync -avup current root@tidb3:/media/data1/hdfs/name/
複製代碼
小黑板:只能在namenode上進行格式化namdenode1
./hdfs zkfs -formatZK
複製代碼
./hadoop-daemon.sh stop journalnode
複製代碼
hadoop 目錄下的sbin目錄執行
./start-all.sh 所有啓動。
複製代碼
[root@tidb1 bin]# ./hdfs haadmin -getServiceState nn1
standby
[root@tidb1 bin]# ./hdfs haadmin -getServiceState nn2
active
複製代碼
http://192.168.108.66:50070 # 注意這個端口是自定義的,不是默認端口
http://192.168.108.67:50070
複製代碼