調度工具(ETL+任務流)


1.區別ETL作業調度工具和任務流調度工具

kettle是一個ETL工具,ETL(Extract-Transform-Load的縮寫,即數據抽取、轉換、裝載的過程)。
kettle中文名稱叫水壺,該項目的主程序員MATT 希望把各種數據放到一個壺里,然后以一種指定的格式流出。
所以他的重心是用於數據

oozie是一個工作流,Oozie工作流是放置在控制依賴DAG(有向無環圖 Direct Acyclic Graph)中的一組動作(例如,Hadoop的Map/Reduce作業、Pig作業等),其中指定了動作執行的順序。
oozie工作流中是有數據流動的,但是重心是在於工作流的定義。

二者雖然都有相關功能及數據的流動,但是其實用途是不一樣的。

2.ETL作業調度工具

2.1Sqoop調度工具

2.1.1列舉出所有數據庫

查看幫助

bin/sqoop help

列舉出所有linux上的數據庫

bin/sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password root

列舉出所有Window上的數據庫

bin/sqoop list-databases --connect jdbc:mysql://192.168.22.36:3306 --username root --password root

查看數據庫下的所有表

bin/sqoop list-tables --connect jdbc:mysql://localhost:3306/mysql --username root --password root

2.12導入數據庫表數據到HDFS

(1)確定mysql服務啟動正常

查詢控制端口和查詢進程來確定,一下兩種辦法可以確認mysql是否在啟動狀態

辦法1:查詢端口

$ netstat -tulpn

 

MySQL監控的TCP的3306端口,如果顯示3306,證明MySQL服務在運行中

辦法二:查詢進程

可以看見mysql的進程

ps -ef | grep mysqld

沒有指定數據導入到哪個目錄,默認是/user/root/表名

bin/sqoop import \
--connect jdbc:mysql://192.168.77.137/zhjy \
--password 123456 \
--username root \
--table zf_jygz_thjc \
--m 1 \
--fields-terminated-by '\t'

或是

bin/sqoop import \
--connect jdbc:mysql://192.168.77.137/zhjy \
--password 123456 \
--username root \
--table zf_jygz_thjc \
--m 5 \
--split-by ZF_BH(一般在設置-m>1時使用)
--fields-terminated-by '\t'

原因:

如果表中有主鍵,m的值可以設置大於1的值;如果沒有主鍵只能將m值設置成為1;或者要將m值大於1,需要使用--split-by指定一個字段

設置了-m 1 說明只有一個maptask執行數據導入,默認是4個maptask執行導入操作,但是必須指定一個列來作為划分依據

導入數據到指定目錄

在導入表數據到HDFS使用Sqoop導入工具,我們可以指定目標目錄。使用參數 --target-dir來指定導出目的地,使用參數—delete-target-dir來判斷導出目錄是否存在,如果存在就刪掉

bin/sqoop import \
--connect jdbc:mysql://192.168.77.137/zhjy \
--username root \
--password 123456 \
--delete-target-dir \   --如果目錄存在,將目錄刪除
--table zf_jygz_thjc \
--target-dir /user/zhjy \    --指定保存目錄
--m 1 \
--fields-terminated-by '\t'

查詢導入

bin/sqoop import \
--connect jdbc:mysql://192.168.72.133:3306/company \
--username root \
--password root \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from staff where id <=1 and $CONDITIONS;'

提示:must contain '$CONDITIONS' in WHERE clause。

where id <=1 匹配條件

$CONDITIONS:傳遞作用。

如果 query 后使用的是雙引號,則 $CONDITIONS前必須加轉義符,防止 shell 識別為自己的變量。

--query時不能使用--table一起使用

需要指定--target-dir路徑

導入到hdfs指定目錄並指定要求

bin/sqoop import \
--connect jdbc:mysql://192.168.72.133:3306/company \
--username root \
--password root\
#提高數據庫到hadoop的傳輸速度
--direct
--table staff \
--delete-target-dir \
#導入指定列,涉及到多列,用逗號分隔 --column id,sex \ --target-dir /user/company \ --num-mappers 1 \ #指定分隔符 --fields-terminated-by '\t' #指定導出存儲格式 --as-textfile #指定數據壓縮(壓縮,解壓縮方式) --compress --compression-codec org.apache.hadoop.io.compress.SnappyCodec

數據導出儲存方式(數據存儲文件格式---( textfil parquet)--as-textfileImports data as plain text (default)--as-parquetfile Imports data to Parquet Files)

 

導入表數據子集到HDFS

bin/sqoop import \
--connect jdbc:mysql://172.16.43.67:3306/userdb \
--username root \
--password root \
--table emp_add \
--target-dir /sqoop/emp_add \
-m 1  \
--delete-target-dir \
--where "city = 'sec-bad'"

 

sqoop導入blob數據到hive

對於CLOB,如xml文本,sqoop可以遷移到Hive表,對應字段存儲為字符類型。
對於BLOB,如jpg圖片,sqoop無法直接遷移到Hive表,只能先遷移到HDFS路徑,然后再使用Hive命令加載到Hive表。遷移到HDFS后BLOB字段存儲為16進制形式。

bin/sqoop-import \
--connect jdbc:mysql://192.168.77.137:3306/zhjy \
--username root \
--password 123456 \
--table ceshi \
--columns "id,name,photo" \
--split-by id \
-m 4 \
--inline-lob-limit=16777126 \設置內聯的LOB對象的大小
--target-dir /user/hive/warehouse/ods.db/ceshi

 

2.1.3導入關系表到Hive

第一步:導入需要的jar包

將我們mysql表當中的數據直接導入到hive表中的話,我們需要將hive的一個叫做hive-exec-1.1.0-cdh5.14.0.jar的jar包拷貝到sqoop的lib目錄下

cp /export/servers/hive-1.1.0-cdh5.14.0/lib/hive-exec-1.1.0-cdh5.14.0.jar /export/servers/sqoop-1.4.6-cdh5.14.0/lib/

第二步:開始導入

day=`date -d "yesterday" +%Y%m%d`

sqoop import \        --導入數據
--connect jdbc:mysql://10.2.111.87:3306/ehl_apmp \        --連接url --username root \        --用戶名 --password root \        --密碼 --table zf_jygz_thjc \        --要導入的表 -m 1 \        --maptask
--hive-drop-import-delims \        --導入時刪除數據庫中特殊字符    
--hive-overwrite \        --覆蓋導入
--hive-import \        --導入到hive表中
--hive-database ods \        --導入到hive中哪個數據庫
--hive-table ods_zf_jygz_thjc \        --導入到hive中哪個表
--fields-terminated-by '\t' \        --字段分隔符
--lines-terminated-by '\n'         --指定行分隔符
--null-string '\\N' \        --字符串類型為null是代替字符
--null-non-string '\\N' \        --字非符串類型為null是的代替字符
--hive-partition-key day \        --hive表的分區字段
--hive-partition-value "$day"        --指定導入表的分區值

 

導入關系表到hive並自動創建hive

們也可以通過命令來將我們的mysql的表直接導入到hive表當中去

sqoop import --connect jdbc:mysql://10.2.111.87:3306/ehl_apmp \
--username root --password root \
--table $1 \
--hive-import \
--hive-database ods \
--create-hive-table \
--fields-terminated-by '\t' \
--null-string '\\N' \
--null-non-string '\\N' \
--split-by code \
-m 4

通過這個命令,我們可以直接將我們mysql表當中的數據以及表結構一起倒入到hive當中去

https://blog.csdn.net/holdbelief/article/details/79578723

2.1.4增量導入

--incremental<mode> 增量模式。

append id 是獲取一個某一列的某個值。

lastmodified “2016-12-15 15:47:35” 獲取某個時間后修改的所有數據

-append 附加模式

-merge-key id 合並模式

--check-column<column name> 用來指定一些列,可以去指定多個列;通常的是指定主鍵id

--last -value<last check column value> 從哪個值開始增量

==注意:增量導入的時候,一定不能加參數--delete-target-dir 否則會報錯==

第一種增量導入方式(不常用)

1.Append方式

使用場景:有個訂單表,里面每個訂單有一個唯一標識的自增列id,在關系型數據庫中以主鍵的形式存在。之前已經將id在0-1000之間的編號的訂單導入到HDFS 中;如果在產生新的訂單,此時我們只需指定incremental參數為append,--last-value參數為1000即可,表示只從id大於1000后開始導入。

(1)創建一個MySQL表

CREATE TABLE orders(
 o_id INT PRIMARY KEY AUTO_INCREMENT,
 o_name VARCHAR(255),
 o_price INT 
);
INSERT INTO orders(o_id,o_name,o_price) VALUES(1,'聯想',5000);
INSERT INTO orders(o_id,o_name,o_price) VALUES(2,'海爾',3000);
INSERT INTO orders(o_id,o_name,o_price) VALUES(3,'雷神',5000);
INSERT INTO orders(o_id,o_name,o_price) VALUES(4,'JACK JONES',800);
INSERT INTO orders(o_id,o_name,o_price) VALUES(5,'真維斯',200);

(2)創建一個hive表(表結構與mysql一致)

bin/sqoop import \ 
--connect jdbc:mysql://192.168.22.30:3306/userdb \
--username root \
--password root \
--table emp \
--target-dir /sqoop/increment \
--num-mappers 1 \
--incremental append \
--check-column id \
--last-value 1202

注意:

append 模式不支持寫入到hive表中

2.lastModify方式

此方式要求原有表有time字段,它能指定一個時間戳,讓sqoop把該時間戳之后的數據導入到HDFS;因為后續訂單可能狀體會變化,變化后time字段時間戳也會變化,此時sqoop依然會將相同狀態更改后的訂單導入HDFS,當然我們可以只當merge-key參數為order-id,表示將后續新的記錄和原有記錄合並。

# 將時間列大於等於閾值的數據增量導入HDFS

sqoop import \
  --connect jdbc:mysql://192.168.xxx.xxx:3316/testdb \
  --username root \
  --password transwarp \
  --query “select order_id, name from order_table where \$CONDITIONS” \
  --target-dir /user/root/order_all \ 
  --split-by id \
  -m 4  \
  --incremental lastmodified \
  --merge-key order_id \
  --check-column time \
  # remember this date !!!
  --last-value “2014-11-09 21:00:00

使用 lastmodified 方式導入數據,要指定增量數據是要 --append(追加)還是要 --merge-key(合並)last-value 指定的值是會包含於增量導入的數據中。

第二種增量導入方式(推薦)

==通過where條件選取數據更加精准==

yesterday=`date -d "yesterday" +%Y_%m_%d`
where="update_time >= \"${yesterday}""
day=`date -d "yesterday" +%Y-%m-%d`
sqoop import \        --導入數據
--connect jdbc:mysql://10.2.111.87:3306/ehl_apmp \        --連接url
--username root \        --用戶名
--password root \        --密碼
--table zf_jygz_thjc \        --要導入的表
-m 1 \        --maptask
--hive-drop-import-delims \        --導入時刪除數據庫中特殊字符    
--hive-overwrite \        --覆蓋導入
--hive-import \        --導入到hive表中
--hive-database ods \        --導入到hive中哪個數據庫
--hive-table ods_zf_jygz_thjc \        --導入到hive中哪個表
--fields-terminated-by '\t' \        --字段分隔符
--lines-terminated-by '\n'         --指定行分隔符
--columns 'zf_bh,zf_xm' \        --導入的字段(可選)
--where "${where}" \        --條件導入
--null-string '\\N' \        --字符串類型為null是代替字符
--null-non-string '\\N' \        --字非符串類型為null是的代替字符
--hive-partition-key day \        --hive表的分區字段
--hive-partition-value "$day"        --指定導入表的分區值

2.1.5從RDBMSHBase

bin/sqoop import 
--connect jdbc:mysql://192.168.22.30:3306/userdb \
--username root \
--password root \
--table emp \
--columns "id,name,sex" \
--column-family "info"
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_test" \
--split-by id \
--num-mappers 1

會報錯

原因:sqoop1.4.6 只支持 HBase1.0.1 之前的版本的自動創建 HBase 表的功能。

解決方案:手動創建 HBase 表

hbase> create 'hbase_staff','info'

2.1.6從HDFS到RDBMS

導出前,目標表必須存在與目標數據庫中

默認操作是將文件中的數據使用insert語句插入到表中

數據是在HDFS當中的如下目錄/sqoop/emp,數據內容如下

1201,gopal,manager,50000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
1202,manisha,Proof reader,50000,TP,2018-06-15 18:54:32.0,2018-06-17 20:26:08.0,1
1203,khalil,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
1204,prasanth,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 21:05:52.0,0
1205,kranthi,admin,20000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1

第一步:創建MySQL表

CREATE TABLE `emp_out` (
 `id` INT(11) DEFAULT NULL,
 `name` VARCHAR(100) DEFAULT NULL,
 `deg` VARCHAR(100) DEFAULT NULL,
 `salary` INT(11) DEFAULT NULL,
 `dept` VARCHAR(10) DEFAULT NULL,
 `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=utf8;

第二步:執行導出命令

通過export來實現數據的導出,將hdfs的數據導出到mysql當中去

全量導出

bin/sqoop export \
--connect jdbc:mysql://172.16.43.67:3306/userdb \
--username root \
--password admin \ --table emp_out \ --export-dir /sqoop/emp \
--columns id,name \(當文件數據與表結構一致時,可以不指定)
--input-fields-terminated-by ","

增量導出

bin/sqoop export \
--connect jdbc:mysql://192.168.77.137:3306/zhjy \
--username root \
--password 123456 \
--table emp_out \
--update-key id \
--update-mode allowinsert \(新增的數據被導出)
--export-dir '/user/hive/warehouse/ods_ceshi/part-m-00000' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
--input-fields-terminated-by ',' \
-m 1

 

 

更新導出

bin/sqoop export \
--connect jdbc:mysql://192.168.77.137:3306/zhjy \
--username root \
--password 123456 \
--table emp_out \
--update-key id \
--update-mode updateonly \(只能導出修改后的數據,不能導出新增的數據)
--export-dir '/user/hive/warehouse/ods_ceshi/part-m-00000' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
--input-fields-terminated-by ',' \
-m 1

 

總結:

參數介紹
--update-key 后面也可以接多個關鍵字列名,可以使用逗號隔開,Sqoop將會匹配多個關鍵字后再執行更新操作。
--export-dir 參數配合--table或者--call參數使用,指定了HDFS上需要將數據導入到MySQL中的文件集目錄。
--update-mode updateonly和allowinsert。 默認模式為updateonly,如果指定--update-mode模式為allowinsert,可以將目標數據庫中原來不存在的數據也導入到數據庫表中。即將存在的數據更新,不存在數據插入。

組合測試及說明
1、當指定update-key,且關系型數據庫表存在主鍵時:
   A、allowinsert模式時,為更新目標數據庫表存的內容,並且原來不存在的數據也導入到數據庫表;
   B、updateonly模式時,為更新目標數據庫表存的內容,並且原來不存在的數據也不導入到數據庫表;
   
2、當指定update-key,且關系型數據庫表不存在主鍵時:
   A、allowinsert模式時,為全部數據追加導入到數據庫表;
   B、updateonly模式時,為更新目標數據庫表存的內容,並且原來不存在的數據也不導入到數據庫表;

3、當不指定update-key,且關系型數據庫表存在主鍵時:
   A、allowinsert模式時,報主鍵沖突,數據無變化;
   B、updateonly模式時,報主鍵沖突,數據無變化;

4、當不指定update-key,且關系型數據庫表不存在主鍵時:
   A、allowinsert模式時,為全部數據追加導入到數據庫表;
   B、updateonly模式時,為全部數據追加導入到數據庫表;

 

實際案例:

(1)mysql批量導入hive

#!/bin/bash
source /etc/profile
num=0
list="table1 table2 table3"
for i in $list; do
   echo "$sum"
   echo "$i"
   echo "sqoop開始批量導入......"
   sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table person --hive-table db.$i --delete-target-dir  --hive-overwrite --hive-import &
   num=$(expr $num + 1)
   if [$sum -gt 4 ]; then
      {
         echo "等待批量任務完成"
         wait
         echo "開始下一批導入"
         num = 0
      }
   fi
done
echo "等待最后一批任務完成"
wait
echo "全部導入完成"

 

使用shell腳本:

#!/bin/sh
export SQOOP_HOME=/usr/share/sqoop-1.4.4
hostname="192.168.1.199"
user="root"
password="root"
database="test"
table="tags"
curr_max=0

function db_to_hive(){

   ${SQOOP_HOME}/bin/sqoop import 
   --connect jdbc:mysql://${hostname}/${database} \
   --username ${user} \
   --password ${password}  \
   --table ${table}   \
   --split-by docid \
   --hive-import \
   --hive-table lan.ding  
--fields-terminated-by '\t' --incremental  append  --check-column docid --last-value ${curr_max}   
   result=`mysql -h${hostname} -u${user} -p${password} ${database}<<EOF 
select max(docid) from ${table};
EOF`
curr_max=`echo $result |awk '{print $2}'`
}

if [ $# -eq 0 ];then
   while true
   do
     db_to_hive
     sleep 120
   done
   exit
fi

筆者目前用sqoop把mysql數據導入到Hive中,最后實現命令行導入,sqoop版本1.4.7,實現如下

sqoop job --import --connect jdbc:mysql://10.4.20.93:3303 \--username user \--password 123456 \--query "select user_name ,user_id,identype from users where $CONDITIONS" \--hive-import \--hive-database haibian_odbc \--hive-table users \--split-by id \--fields-terminated-by '\01' \--lines-terminated-by '\n' \--target-dir /user/hive/tmp/users \--hive-delims-replacement ' ' --incremental append \--check-column id \--last-value 0

最后需要把這個導入搞成job,每天定時去跑,實現數據的自動化增量導入,sqoop支持job的管理,可以把導入創建成job重復去跑,並且它會在metastore中記錄增值,每次執行增量導入之前去查詢

創建job命令如下

sqoop job --create users -- import --connect jdbc:mysql://10.4.20.93:3303 \--username user \--password 123456 \--query "select user_name ,user_id,identype from users where $CONDITIONS" \--hive-import \--hive-database haibian_odbc \--hive-table users \--split-by id \--fields-terminated-by '\01' \--lines-terminated-by '\n' \--target-dir /user/hive/tmp/users \--hive-delims-replacement ' ' --incremental append \--check-column id \--last-value 0

創建完job就可以去執行它了

sqoop job --exec users

可以把該指令設為Linux定時任務,或者用Azkaban定時去執行它

shell腳本循環遍歷日期,用於sqoop腳本

#! /bin/bash
first="$1"
second="$2"
while [ "$first" != "$second" ]
do
date=`date -d "$first" +"%Y-%m-%d"`
sqoop export \
--connect jdbc:mysql:// \
--username \
--password \
--table dwd_fact_front_orderinfo \
--export-dir /user/hive/warehouse/dwd.db/dwd_fact_front_orderinfo/day="$date" \
--input-null-non-string '\\N' \
--input-null-string '\\N' \
--input-fields-terminated-by "\t" \
--update-key id \
--update-mode allowinsert \
--m 1;
let first=`date -d "-1 days ago ${first}" +%Y%m%d`
done

Sqoop導出問題總結

hive導出​到MySQL時,date類型數據發生變化?

問題原因:時區設置問題,date -R查看服務器時間,show VARIABLES LIKE "%time_zone"查看Mysql時間,system並不表示中國的標准時間,要將時間設置為東八區

set global time_zone = '+08:00';
set time_zone = '+08:00';
flush privileges;

 

2.2Kettle調度工具

 

3.任務流調度工具

3.1調度工具對比

(1):對市面上最流行的兩種調度器,給出以下詳細對比,以供技術選型參考。總體來說,ooize相比azkaban是一個重量級的任務調度系統,功能全面,但配置使用也更復雜。如果可以不在意某些功能的缺失,輕量級調度器azkaban是很不錯的候選對象。

(2):功能:

  兩者均可以調度mapreduce,pig,java,腳本工作流任務;

  兩者均可以定時執行工作流任務; 

(3):工作流定義:

  Azkaban使用Properties文件定義工作流;

  Oozie使用XML文件定義工作流;

(4):工作流傳參:

  Azkaban支持直接傳參,例如${input};

  Oozie支持參數和EL表達式,例如${fs:dirSize(myInputDir)}; 

(5):定時執行:

  Azkaban的定時執行任務是基於時間的;

  Oozie的定時執行任務基於時間和輸入數據;

(6):資源管理:

  Azkaban有較嚴格的權限控制,如用戶對工作流進行讀/寫/執行等操作;

  Oozie暫無嚴格的權限控制;

(7):工作流執行:

  Azkaban有兩種運行模式,分別是solo server mode(executor server和web server部署在同一台節點)和multi server mode(executor server和web server可以部署在不同節點);

  Oozie作為工作流服務器運行,支持多用戶和多工作流;

(8):工作流管理:

  Azkaban支持瀏覽器以及ajax方式操作工作流;

  Oozie支持命令行、HTTP REST、Java API、瀏覽器操作工作流;

3.2 Azkaban調度工具

3.1.1啟動solo-server

cd  /export/servers/azkaban-solo-server-0.1.0-SNAPSHOT

bin/start-solo.sh

3.1.2瀏覽器頁面訪問

瀏覽器頁面訪問

http://node03:8081/ 

3.3 Oozie調度工具

使用Oozie時通常整合hue,用戶數據倉庫調度

3.3.1數倉流程說明

大致流程:
MySQL -> HDFS -> ODS -> DWD -> DWS -> ADS -> MySQL
 
具體流程:
1. MySQL業務通過Sqoop數據導入HDFS
2. 將HDFS數據導入Hive數倉ODS層
3. 將ODS數據簡單清洗寫入DWD層
4. 將DWD數據輕度匯總寫入DWS層寬表
5. 將DWS層數據統計結果寫入ADS層
6. 將ADS層數據通過Sqoop導出到MySQL匯總表

 

3.3.2創建工作流

1. 創建工作流

 

2. 編輯工作流

 

3. 上傳腳本

4. 添加文件

就是剛才選擇的腳本

 

5. 填寫參數

腳本里需要的參數,盡量設置為動態自動獲取,如 ${date}

第一步的參數是所有文件和當天日期,后面的只需要日期,最后一步是導出所有結果,相應填入

6. 依次添加后續任務

添加文件和設置相應參數

7. 保存,或者運行

8. 狀態提示

運行后會有狀態提示頁面,可以看到任務進度

9. 其他

點擊調度任務的頁面情況

定時調度

1. 創建定時計划(schedule)

2. 修改屬性

修改定時任務名和描述

3. 添加任務

添加需要定時調度的任務

4. 設置調度時間

5. Crontab高級語法模式

6. 參數設置

sm-workflow的參數都是寫死的,沒有設置動態,這里的下拉列表就不會有可選項。

設置參數

將sm-workflow的日期修改為 ${do_date},保存

 

進入定時計划sm-dw中,會看到有參數 do_date

填入相應參數,前一天日期

${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, ‘DAY’), ‘yyyyMMdd’)}

Oozie常用系統常量

 

當然,也可以通過這樣將參數傳入workflow任務中,代碼或者shell中需要的參數。

如,修改sm-workflow 中的 sqoop_import.sh,添加一個參數 ${num}。

編輯文件(需要登陸Hue的用戶有對HDFS操作的權限),修改shell中的一個值為參數,保存。

在workflow中,編輯添加參數 ${num} ,或者num=${num} 保存。

進入schedule中,可以看到添加的參數,編輯輸入相應參數即可。

Bundle

Bundle統一管理所有定時調度,階段划分:Bundle > Schedule > workflow

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM