Airflow 是一個 Airbnb 的 Workflow 開源項(xiàng)目,在Github 上已經(jīng)有超過兩千星。Airflow 使用 Python 寫的,支持 Python 2/3 兩個版本。 傳統(tǒng) Workflow 通常使用 Text Files (json, xml / etc) 來定義 DAG, 然后 Scheduler 解析這些 DAG 文件形成具體的 Task Object 執(zhí)行;Airflow 沒這么干,它直接用 Python 寫 DAG definition, 一下子突破了文本文件表達(dá)能力的局限,定義 DAG 變得簡單。 另外,Airflow 的權(quán)限設(shè)計、限流設(shè)計、以及 Hook/Plugin 的設(shè)計都挺有意思,功能性、擴(kuò)展性良好。當(dāng)然,項(xiàng)目里的代碼質(zhì)量感覺比較一般,很多地方函數(shù)名和實(shí)現(xiàn)不太一致,造成理解障礙;也有很多 Flag 和重復(fù)出現(xiàn)的定義,顯然是當(dāng)初沒有設(shè)計好、后面沒有精力 Refactor 轉(zhuǎn)而 Hack 的結(jié)果。但總體上,可讀性中上,系統(tǒng)的擴(kuò)展性非常好。
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、金寨網(wǎng)絡(luò)推廣、微信小程序定制開發(fā)、金寨網(wǎng)絡(luò)營銷、金寨企業(yè)策劃、金寨品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供金寨建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:jinyejixie.com
安裝依賴程序 ;
[root@node01 ~]# yum -y install zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel readline readline-devel openssl openssl-devel openssl-static xz lzma xz-devel sqlite sqlite-devel gdbm gdbm-devel tk tk-devel gcc
下載python ;
可以前往 https://www.python.org/ftp/python/查看Python各個版本,這里,我們選擇安裝Python-3.6.5.tgz版本。通過如下命令下載Python源碼壓縮包:[root@node01 ~]# wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
解壓Python源碼壓縮包 ;
[root@node01 ~]# tar -zxvf Python-3.6.5.tgz [root@node01 ~]# cd Python-3.6.5
安裝python ;
[root@node01 Python-3.6.5]# ./configure prefix=/usr/local/python3 [root@node01 Python-3.6.5]# make [root@node01 Python-3.6.5]# make install [root@node01 Python-3.6.5]# mv /usr/bin/python /usr/bin/python2 #將原來的執(zhí)行腳本改名備份 [root@node01 Python-3.6.5]# ln -s /usr/local/python3/bin/python3 /usr/bin/python #將新的python執(zhí)行腳本鏈接到命令路徑內(nèi) [root@node01 Python-3.6.5]# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip #將pip3鏈接到命令路徑內(nèi)
查看版本信息 ;
- 修改yum相關(guān)配置文件 ;
將以下兩個文件的開頭 #!/usr/bin/python 改成 #!/usr/bin/python2.7[root@node01 Python-3.6.5]# vim /usr/bin/yum [root@node01 Python-3.6.5]# vim /usr/libexec/urlgrabber-ext-down
默認(rèn)python 3.6.5 已經(jīng)自帶pip3 ,不需要再額外進(jìn)行安裝。
如果是python2.x 就需要進(jìn)行安裝pip 。
解壓MySQL軟件(文件大小六百多兆,官網(wǎng)直接下載免安裝)
[root@node01 ~]# tar zxvf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz [root@node01 ~]# mv mysql-5.7.28-linux-glibc2.12-x86_64 /opt/mysql [root@node01 ~]# cd /opt/mysql/
創(chuàng)建MySQL運(yùn)行需要的用戶跟組
[root@node01 mysql]# groupadd mysql [root@node01 mysql]# useradd -M -s /sbin/nologin -g mysql mysql
創(chuàng)建存放數(shù)據(jù)的目錄
[root@node01 mysql]# mkdir data [root@node01 mysql]# chown -R mysql:mysql *
編寫配置文件
vim /etc/my.cnf[client] port = 3306 socket = /opt/mysql/data/mysql.sock [mysqld] port = 3306 socket = /opt/mysql/data/mysql.sock basedir = /opt/mysql datadir = /opt/mysql/data user = mysql bind-address = 0.0.0.0 server-id = 1 init-connect = 'SET NAMES utf8' character-set-server = utf8
初始化數(shù)據(jù)庫
[root@node01 mysql]# bin/mysqld --initialize --basedir=/opt/mysql --datadir=/opt/mysql/data --user=mysql
將數(shù)據(jù)庫添加到服務(wù)內(nèi)
[root@node01 mysql]# cp support-files/mysql.server /etc/init.d/mysqld [root@node01 mysql]# cp /opt/mysql/bin/* /usr/sbin/ [root@node01 mysql]# chmod +x /etc/init.d/mysqld
- 添加開機(jī)自啟
[root@node01 mysql]# chkconfig --add mysqld [root@node01 mysql]# service mysqld start
登陸 MySQL, 密碼在之前初始化時有提示的
[root@mysql_node01 mysql]# mysql -uroot -p
修改root密碼,否則什么都做不了
mysql> alter user root@"localhost" identified by "123456"; Query OK, 0 rows affected (0.00 sec)
- 測試賬號是否可以增刪
mysql> create database abctest; Query OK, 1 row affected (0.00 sec)
mysql> use abctest;
Database changed
mysql> drop database abctest;
Query OK, 0 rows affected (0.00 sec)
> 12. 授權(quán)airflow用戶可被訪問 ;
```bash
mysql> grant all on *.* to 'airflow'@'%' identified by '123456a';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
創(chuàng)建airflow 要用的數(shù)據(jù)庫,庫名 airflow ;
mysql> create database airflow ; Query OK, 1 row affected (0.00 sec)
- 開啟timestamp ,數(shù)據(jù)更新時添加上當(dāng)前時間 ;
mysql> set @@global.explicit_defaults_for_timestamp=on; Query OK, 0 rows affected (0.00 sec)
解壓redis (如需下載請直接到官網(wǎng)進(jìn)行下載);
[root@node01 ~]# tar zxvf redis-5.0.0.tar.gz [root@node01 ~]# cd redis-5.0.0/
安裝redis ;
[root@node01 redis-5.0.0]# make && make test [root@node01 redis-5.0.0]# mkdir /usr/local/redis #創(chuàng)建redis運(yùn)行的目錄 [root@node01 redis-5.0.0]# cp redis.conf /usr/local/redis/ #復(fù)制配置文件到redis運(yùn)行目錄 [root@node01 redis-5.0.0]# cp src/redis-server /usr/sbin/ #復(fù)制redis-server程序 [root@node01 redis-5.0.0]# cp src/redis-cli /usr/sbin/ #復(fù)制redis-cli程序 [root@node01 redis-5.0.0]# cp src/redis-sentinel /usr/sbin/ #復(fù)制redis-sentinel 程序
編輯redis 配置文件
[root@node01 redis-5.0.0]# vim /usr/local/redis/redis.conf bind 0.0.0.0 #對外的綁定地址 daemonize yes #守護(hù)進(jìn)程 pidfile /usr/local/redis/redis_6379.pid #指定pid logfile "/usr/local/redis/redis.log" #指定log dir "/usr/local/redis" #指定家目錄 appendonly yes #開啟持久化
啟動redis ;
[root@node01 redis-5.0.0]# redis-server /usr/local/redis/redis.conf
- 連接redis 進(jìn)行測試
[root@node01 ~]# redis-cli 127.0.0.1:6379> keys * (empty list or set)
安裝rabbitmq跟erlang (程序直接到官網(wǎng)下載即可);
[root@node01 ~]# yum localinstall erlang-20.3-1.el7.centos.x86_64.rpm rabbitmq-server-3.7.5-1.el7.noarch.rpm -y
拷貝配置文件模板,然后修改配置文件(開啟默認(rèn)登錄用戶);
[root@node01 ~]# cp /usr/share/doc/rabbitmq-server-3.7.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config [root@node01 ~]# vim /etc/rabbitmq/rabbitmq.config
- 開啟管理插件,啟動程序 ;
[root@node01 ~]# rabbitmq-plugins enable rabbitmq_management #開啟管理插件 [root@node01 ~]# chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie #設(shè)置cookie 文件權(quán)限(否則無法啟動) [root@node01 ~]# systemctl start rabbitmq-server.service #啟動rabbitmq [root@node01 ~]# systemctl enable rabbitmq-server.service #添加開機(jī)自啟
打開管理頁面 http://ip:15672 ,使用默認(rèn)用戶guest ,密碼guest 進(jìn)入 ;
- 點(diǎn)擊admin -->> add a user ,添加用戶密碼并設(shè)置administrator 權(quán)限 ;
- 為admin用戶添加 虛擬目錄 / ;
單擊用戶admin
選擇對應(yīng)的Virtual Host ,單擊 Set permission 進(jìn)行設(shè)置 ;
重新查看,發(fā)現(xiàn)已經(jīng)設(shè)置成功 ;
將所有守護(hù)進(jìn)程運(yùn)行在同一臺機(jī)器上即可完成 airflow 的單結(jié)點(diǎn)部署,架構(gòu)如下圖所示
- 安裝依賴( airflow[mysql] 需要用到 );
[root@node01 ~]# yum install mariadb-devel MySQL-python -y [root@node01 ~]# mkdir /usr/local/mysql #創(chuàng)建目錄
[root@node01 ~]# find / -name mysql.h #查看mysql.h 發(fā)現(xiàn)有兩個,因?yàn)閚ode01有安裝MySQL,所以有兩個文件,在安裝airflow[mysql]時會調(diào)用/usr/local/mysql/include/mysql.h 文件
/usr/include/mysql/mysql.h
/opt/mysql/include/mysql.h
[root@node01 ~]# ln -s /opt/mysql /usr/local/mysql # 將MySQL安裝目錄鏈接到/usr/local/mysql
[root@node01 airflow]# ln -s /opt/mysql/lib/libmysqlclient.so.20 /usr/lib64/libmysqlclient.so.20
> 2. 添加環(huán)境變量
vim /etc/profile
export PATH=$PATH:/usr/local/python3/bin/
export AIRFLOW_HOME=~/airflow
> 3. 安裝airflow 及相關(guān)應(yīng)用 ;
[root@node01 ~]# pip install --upgrade pip #更新pip
[root@node01 ~]# pip install --upgrade setuptools #更新setuptools
[root@node01 ~]# pip install apache-airflow #安裝airflow 主程序
[root@node01 ~]# pip install apache-airflow[mysql] #安裝mysql連接器
[root@node01 ~]# pip install apache-airflow[celery] #安裝celery 連接器
[root@node01 ~]# pip install redis #安裝redis連接器
[root@node01 ~]# pip install --upgrade kombu #更新kombu (celery 需要最新的版本)
> 4. 初始化airflow 數(shù)據(jù)庫 ;
[root@node01 ~]# airflow initdb #或者可以只使用airflow 命令加載配置文件
> 5. 初始化完之后會產(chǎn)生airflow相關(guān)的一些文件,查看airflow目錄的內(nèi)容 ;
![在這里插入圖片描述](/upload/otherpic50/20191227093123311.png)
> 6. 修改配置文件 ;
vim /root/airflow/airflow.cfg
時區(qū)設(shè)置
default_timezone = Asia/Shanghai
不加載案例
load_examples = False
執(zhí)行webserver默認(rèn)啟動端口
web_server_port = 8080
使用的執(zhí)行器
executor = CeleryExecutor
設(shè)置消息的中間代理
broker_url = redis://192.168.255.16:6379/0
設(shè)定結(jié)果存儲后端 backend
當(dāng)然也可以使用 Redis :result_backend =redis://redis:Kingsoftcom_123@172.19.131.108:6379/1
result_backend = db+mysql://airflow:123456a@192.168.255.16:3306/airflow
數(shù)據(jù)庫連接
sql_alchemy_conn = mysql://airflow:123456a@192.168.255.16:3306/airflow
> 7. 開啟timestamp ,數(shù)據(jù)更新時添加上當(dāng)前時間 ;
mysql -uairflow -p
mysql> set @@global.explicit_defaults_for_timestamp=on;
Query OK, 0 rows affected (0.00 sec)
> 8. 重新生成數(shù)據(jù)庫文件 ;
airflow initdb
> 9. 啟動
[root@node01 airflow]# airflow webserver -p 8080 -D
[root@node01 airflow]# airflow scheduler -D
[root@node01 airflow]# airflow flower -D
[root@node01 airflow]# airflow worker -D #默認(rèn)啟動會報錯,因?yàn)閣orker不允許被ROOT用戶啟動
> 10. 設(shè)置worker 可以被root用戶啟動
> 在 /etc/profile 文件內(nèi)添加 export C_FORCE_ROOT=True 內(nèi)容 ,source /etc/profile 重新加載即可
> 11. 查看單節(jié)點(diǎn)是否已經(jīng)搭建好
> 分別打開http://192.168.255.11:8080 跟 http://192.168.255.11:5050 查看是否ok
![在這里插入圖片描述](/upload/otherpic50/20191227093149183.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dxajU0MDgyMTYx,size_16,color_FFFFFF,t_70)
![在這里插入圖片描述](/upload/otherpic50/20191227093156143.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dxajU0MDgyMTYx,size_16,color_FFFFFF,t_70)
### airflow 多節(jié)點(diǎn)(集群)部署
>   在穩(wěn)定性要求較高的場景,如金融交易系統(tǒng)中,一般采用集群、高可用的方式來部署。Apache Airflow 同樣支持集群、高可用的部署,airflow 的守護(hù)進(jìn)程可分布在多臺機(jī)器上運(yùn)行,架構(gòu)如下圖所示:
#### 架構(gòu)圖
![在這里插入圖片描述](/upload/otherpic50/20191227093258334.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dxajU0MDgyMTYx,size_16,color_FFFFFF,t_70)
##### 多節(jié)點(diǎn)好處
> 高可用
>   如果一個 worker 節(jié)點(diǎn)崩潰或離線時,集群仍可以被控制的,其他 worker 節(jié)點(diǎn)的任務(wù)仍會被執(zhí)行。
> 分布式
>   處理如果你的工作流中有一些內(nèi)存密集型的任務(wù),任務(wù)最好是分布在多臺機(jī)器上運(yùn)行以便得到更快的執(zhí)行。
#### 擴(kuò)展 worker 節(jié)點(diǎn)
##### 水平擴(kuò)展
>   你可以通過向集群中添加更多 worker 節(jié)點(diǎn)來水平地擴(kuò)展集群,并使這些新節(jié)點(diǎn)指向同一個元數(shù)據(jù)庫,從而分發(fā)處理過程。由于 worker 不需要在任何守護(hù)進(jìn)程注冊即可執(zhí)行任務(wù),因此所以 worker 節(jié)點(diǎn)可以在不停機(jī),不重啟服務(wù)下的情況進(jìn)行擴(kuò)展,也就是說可以隨時擴(kuò)展。
##### 垂直擴(kuò)展
>   你可以通過增加單個 worker 節(jié)點(diǎn)的守護(hù)進(jìn)程數(shù)來垂直擴(kuò)展集群。可以通過修改 airflow 的配置文件-{AIRFLOW_HOME}/airflow.cfg 中 celeryd_concurrency 的值來實(shí)現(xiàn),例如:
celeryd_concurrency = 30
> 您可以根據(jù)實(shí)際情況,如集群上運(yùn)行的任務(wù)性質(zhì),CPU 的內(nèi)核數(shù)量等,增加并發(fā)進(jìn)程的數(shù)量以滿足實(shí)際需求。
#### 擴(kuò)展 Master 節(jié)點(diǎn)(高可用)
>   您還可以向集群中添加更多主節(jié)點(diǎn),以擴(kuò)展主節(jié)點(diǎn)上運(yùn)行的服務(wù)。您可以擴(kuò)展 webserver 守護(hù)進(jìn)程,以防止太多的 HTTP 請求出現(xiàn)在一臺機(jī)器上,或者您想為 webserver 的服務(wù)提供更高的可用性。需要注意的一點(diǎn)是,每次只能運(yùn)行一個 scheduler 守護(hù)進(jìn)程。如果您有多個 scheduler 運(yùn)行,那么就有可能一個任務(wù)被執(zhí)行多次。這可能會導(dǎo)致您的工作流因重復(fù)運(yùn)行而出現(xiàn)一些問題。
>   下圖為擴(kuò)展 Master 節(jié)點(diǎn)的架構(gòu)圖:
![在這里插入圖片描述](/upload/otherpic50/20191227093318702.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dxajU0MDgyMTYx,size_16,color_FFFFFF,t_70)
>   看到這里,可能有人會問,scheduler 不能同時運(yùn)行兩個,那么運(yùn)行 scheduler 的節(jié)點(diǎn)一旦出了問題,任務(wù)不就完全不運(yùn)行了嗎?
>
>   答案: 這是個非常好的問題,不過已經(jīng)有解決方案了,我們可以在兩臺機(jī)器上部署 scheduler ,只運(yùn)行一臺機(jī)器上的 scheduler 守護(hù)進(jìn)程 ,一旦運(yùn)行 scheduler 守護(hù)進(jìn)程的機(jī)器出現(xiàn)故障,立刻啟動另一臺機(jī)器上的 scheduler 即可。我們可以借助第三方組件 airflow-scheduler-failover-controller 實(shí)現(xiàn) scheduler 的高可用。
>
>   兩臺master 都安裝并運(yùn)行 failover ,這樣才能實(shí)現(xiàn)真正的高可用
> 具體步驟如下所示:
> 1. 下載 failover
git clone https://github.com/teamclairvoyant/airflow-scheduler-failover-controller
> 2. 使用 pip 進(jìn)行安裝
cd airflow-scheduler-failover-controller
pip install -e .
> 3. 初始化 failover
scheduler_failover_controller init
> 注:初始化時,會向airflow.cfg中追加內(nèi)容,因此需要先安裝 airflow 并初始化。
> 4. 更改 failover 配置
scheduler_nodes_in_cluster= host1,host2
> 注:host name 可以通過scheduler_failover_controller get_current_host命令獲得
> 5. 配置安裝 failover 的機(jī)器之間的免密登錄,配置完成后,可以使用如下命令進(jìn)行驗(yàn)證:
scheduler_failover_controller test_connection
> 6. 啟動 failover
scheduler_failover_controller start
> 注意:在failover 監(jiān)控scheduler 時會出現(xiàn)無法啟動的情況,此時應(yīng)該修改 /root/airflow/airflow.cfg 的
airflow_scheduler_start_command = export AIRFLOW_HOME=/root/airflow;;nohup airflow scheduler >> ~/airflow/logs/scheduler.logs &
改為 airflow_scheduler_start_command = airflow scheduler -D
> 因此更健壯的架構(gòu)圖如下所示:
![在這里插入圖片描述](/upload/otherpic50/20191227093337590.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dxajU0MDgyMTYx,size_16,color_FFFFFF,t_70)
##### 隊(duì)列服務(wù)及元數(shù)據(jù)庫(Metestore)的高可用。
> 隊(duì)列服務(wù)取決于使用的消息隊(duì)列是否可以高用可部署,如 RabbitMQ 和 Redis。
>   RabbitMQ 集群并配置Mirrored模式見:http://blog.csdn.net/u010353408/article/details/77964190
> 元數(shù)據(jù)庫(Metestore) 取決于所使用的數(shù)據(jù)庫,如 Mysql 等。
>   Mysql 做主從備份見:http://blog.csdn.net/u010353408/article/details/77964157
#### airflow 集群部署的具體步驟
##### 前提條件
> 節(jié)點(diǎn)運(yùn)行的守護(hù)進(jìn)程如下:
* master1 運(yùn)行: webserver, scheduler
* master2運(yùn)行:webserver
* worker1運(yùn)行:worker
* worker2運(yùn)行:worker
> 隊(duì)列服務(wù)處于運(yùn)行中. (RabbitMQ, Redis, etc)
* 安裝 RabbitMQ 方法參見: http://site.clairvoyantsoft.com/installing-rabbitmq/
* 如果正在使用 RabbitMQ, 推薦 RabbitMQ 也做成高可用的集群部署,并為 RabbitMQ 實(shí)例配置負(fù)載均衡。
##### 步驟
> 1、 在所有需要運(yùn)行守護(hù)進(jìn)程的機(jī)器上安裝 Apache Airflow。
> 2、修改 {AIRFLOW_HOME}/airflow.cfg 文件,確保所有機(jī)器使用同一份配置文件。
> 1. 修改 Executor 為 CeleryExecutor
executor = CeleryExecutor
> 2. 指定元數(shù)據(jù)庫(metestore)
sql_alchemy_conn = mysql://{USERNAME}:{PASSWORD}@{MYSQL_HOST}:3306/airflow
> 3. 設(shè)置中間人(broker)
>   如果使用 RabbitMQ
broker_url = amqp://guest:guest@{RABBITMQ_HOST}:5672/
>   如果使用 Redis
broker_url = redis://{REDIS_HOST}:6379/0 #使用數(shù)據(jù)庫 0
> 4. 設(shè)定結(jié)果存儲后端 backend
celery_result_backend = db+mysql://{USERNAME}:{PASSWORD}@{MYSQL_HOST}:3306/airflow
#當(dāng)然您也可以使用 Redis :celery_result_backend =redis://{REDIS_HOST}:6379/1
> 3、在 master1 和 master2 上部署您的工作流(DAGs)。
> 4、在 master 1,初始 airflow 的元數(shù)據(jù)庫
$ airflow initdb
> 5、在 master1, 啟動相應(yīng)的守護(hù)進(jìn)程
$ airflow webserver
$ airflow scheduler
> 6、在 master2,啟動 Web Server
$ airflow webserver
> 7、在 worker1 和 worker2 啟動 worker
$ airflow worker
> 8、使用負(fù)載均衡處理 webserver
> 可以使用 nginx,AWS 等服務(wù)器處理 webserver 的負(fù)載均衡,所有均已集群或高可用部署,apache-airflow 系統(tǒng)已堅不可摧。
網(wǎng)頁名稱:AirFlow的安裝部署
網(wǎng)站網(wǎng)址:http://jinyejixie.com/article12/gdpcdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、域名注冊、標(biāo)簽優(yōu)化、服務(wù)器托管、網(wǎng)站建設(shè)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)