通用類
CDM有哪些優勢?
| 優勢項 | 用戶自行開發 | CDM |
|---|---|---|
| 易使用 | 自行準備服務器資源,安裝配置必要的軟件并進行配置,等待時間長。 程序在讀寫兩端會根據數據源類型,使用不同的訪問接口,一般是數據源提供的對外接口,例如JDBC、原生API等,因此在開發腳本時需要依賴大量的庫、SDK等,開發管理成本較高。 | CDM提供了Web化的管理控制臺,通過Web頁實時開通服務。 用戶只需要通過可視化界面對數據源和遷移任務進行配置,服務會對數據源和任務進行全面的管理和維護,用戶只需關注數據遷移的具體邏輯,而不用關心環境等問題,極大降低了開發維護成本。 CDM還提供了REST API,支持第三方系統調用和集成。 |
| 實時監控 | 需要自行選型開發。 | 您可以使用云監控服務監控您的CDM集群,執行自動實時監控、告警和通知操作,幫助您更好地了解CDM集群的各項性能指標。 |
| 免運維 | 需要自行開發完善運維功能,自行保證系統可用性,尤其是告警及通知功能,否則只能人工值守。 | 使用CDM服務,用戶不需要維護服務器、虛擬機等資源。CDM的日志,監控和告警功能,有異常可以及時通知相關人員,避免7*24小時人工值守。 |
| 高效率 | 在遷移過程中,數據讀寫過程都是由一個單一任務完成的,受限于資源,整體性能較低,對于海量數據場景往往不能滿足要求。 | CDM任務基于分布式計算框架,自動將任務切分為獨立的子任務并行執行,能夠極大提高數據遷移的效率。針對Hive、HBase、MySQL、DWS(數據倉庫服務)數據源,使用高效的數據導入接口導入數據。 |
| 多種數據源支持 | 數據源類型繁雜,針對不同數據源開發不同的任務,腳本數量成千上萬。 | 支持數據庫、Hadoop、NoSQL、數據倉庫、文件等多種類型的數據源。 |
| 多種網絡環境支持 | 隨著云計算技術的發展,用戶數據可能存在于各種環境中,例如公有云、自建/托管IDC、混合場景等。在異構環境中進行數據遷移需要考慮網絡連通性等因素,給開發和維護都帶來較大難度。 | 無論數據是在用戶本地自建的IDC中(Internet Data Center,互聯網數據中心)、云服務中、第三方云中,或者使用ECS自建的數據庫或文件系統中,CDM均可幫助用戶輕松應對各種數據遷移場景,包括數據上云,云上數據交換,以及云上數據回流本地業務系統。 |
CDM有哪些安全防護?
CDM是一個(ge)完全托管的(de)服(fu)務,提(ti)供了(le)以下安(an)全防(fang)護(hu)能力(li)保護(hu)用戶數據安(an)全。
實例(li)隔(ge)離(li):CDM服(fu)務的(de)用戶只能使(shi)用自己創建(jian)的(de)實例(li),實例(li)和實例(li)之間是相互隔(ge)離(li)的(de),不可相互訪(fang)問。
系(xi)統加固(gu):CDM實例的操作(zuo)系(xi)統進行了特別的安(an)全加固(gu),攻擊者無法從Internet訪問(wen)CDM實例的操作(zuo)系(xi)統。
密(mi)鑰(yao)加密(mi):用戶在(zai)CDM上創建連接輸入的各種(zhong)數據(ju)源(yuan)的密(mi)鑰(yao),CDM均(jun)采用高強(qiang)度(du)加密(mi)算法保存在(zai)CDM數據(ju)庫(ku)。
無(wu)中間(jian)存儲(chu):數據在遷移(yi)的過(guo)程中,CDM只(zhi)處理數據映射和轉換,而不會存儲(chu)任何用戶數據或片段。
如何降低CDM使用成本?
如(ru)果是遷移公(gong)網的數據上云(yun),可以(yi)使(shi)用NAT網關服(fu)(fu)務,實(shi)現CDM服(fu)(fu)務與子網中的其他彈性云(yun)主機共享彈性IP,可以(yi)更(geng)經濟、更(geng)方便的通(tong)過Internet遷移本地數據中心或第三(san)方云(yun)上的數據。
具體操作如下:
假設已經創建好了CDM集群(qun)(無需為(wei)CDM集群(qun)綁(bang)定專用(yong)彈性IP),記錄(lu)下CDM集群(qun)所在的VPC和子(zi)網。
創(chuang)建NAT網關,注意選擇和CDM集群相同(tong)的VPC、子網。
創建完(wan)NAT網(wang)關后,回到NAT網(wang)關控制臺列表,單擊創建好(hao)的網(wang)關名稱,然后選擇(ze)“添加(jia)SNAT規則”。
選擇子(zi)網和(he)彈(dan)性IP,如(ru)果沒(mei)有(you)彈(dan)性IP,需(xu)要先(xian)申請一個。
完成之后,就可以到(dao)CDM控制臺(tai),通過Internet遷(qian)(qian)移(yi)公網的數(shu)據上云(yun)(yun)了(le)。例如:遷(qian)(qian)移(yi)本地(di)數(shu)據中心FTP服(fu)務器上的文(wen)件(jian)到(dao)OBS、遷(qian)(qian)移(yi)第三方云(yun)(yun)上關系型數(shu)據庫到(dao)云(yun)(yun)服(fu)務RDS。
說明如果用戶對本地數據源的訪問通道做了SSL加密,則CDM無法通過彈性IP連接數據源。
CDM集群是否支持升級操作?
不支持。
CDM集群目前(qian)暫(zan)不支持(chi)升級操(cao)作,如果需要使(shi)用(yong)高(gao)版本集群則需要重新創(chuang)建。
CDM遷移性能如何?
單個cdm.large規格實例理(li)論上可以支持1TB~8TB/天的數據遷移。
但在實際使(shi)用中,實際傳輸速(su)率受公網(wang)帶(dai)寬、集群規格、文件讀寫(xie)速(su)度、作業并(bing)發數設置、磁盤讀寫(xie)性(xing)能等因素影響。
CDM不同集群規格對應并發的作業數是多少?
CDM不同集群規格(ge)對應并發的(de)作業數如表下表所示。
| 產品規格 | cdm.large | cdm.xlarge | cdm.4xlarge |
|---|---|---|---|
| 規格 | 節點數量:1個 vCPUs/內存:8核16GB 基準/最大帶寬:0.8/3Gbit/s | 節點數量:1個 vCPUs/內存:16核32GB 基準/最大帶寬:4/10Gbit/s | 節點數量:1個 vCPUs/內存:64核128GB 基準/最大帶寬:36/40Gbit/s |
| 并發執行的作業數 | 30 | 100 | 300 |
包(bao)含但不限于以下(xia)情(qing)況,建議使用(yong)多個CDM集群(qun)進行業務分流:
作(zuo)為不同的用途,例如用于數據遷移作(zuo)業(ye),或作(zuo)為DataArts Studio管理中心連(lian)接代(dai)理。
給不同的業務部門使用,例如財務、網上(shang)商(shang)城等。
功能類
是否支持增量遷移?
CDM支持增量數據遷移(yi)。利用(yong)定時(shi)任務配置和時(shi)間宏變(bian)量函(han)數等參數,可(ke)支持以下場景的增量數據遷移(yi):
文件增量遷移
關系數據庫增量遷移
使用時間宏變量(liang)完成增量(liang)同步(bu)
HBase/CloudTable增量遷(qian)移
是否支持字段轉換?
支(zhi)持(chi),CDM支(zhi)持(chi)以下字段轉(zhuan)換器(qi):
脫敏
去前后空格
字符串反轉
字符串替換
表達式轉換
在創建(jian)表/文件遷移作(zuo)業的字(zi)段映(ying)射界(jie)面(mian),可(ke)新建(jian)字(zi)段轉換器,如圖下圖所示。

脫敏
隱藏(zang)字符串(chuan)中的關鍵信息(xi),例(li)如要將“12345678910”轉(zhuan)換為“123***8910”,則配置如下:
“起(qi)始保留長(chang)度”為(wei)“3”。
“結尾保留長度”為“4”。
“替換字(zi)符(fu)”為“”。
如下圖“字段脫(tuo)敏”:

去前后空格
自動去字符串前(qian)后的(de)空值,不(bu)需要配置(zhi)參數。
字符串反轉
自(zi)動反轉字符串,例如(ru)將“ABC”轉換為“CBA”,不需要配(pei)置參數。
字符串替換
替(ti)換字符(fu)串,需要用戶配置(zhi)被替(ti)換的對象(xiang),以及替(ti)換后的值。
表達式轉換
使用JSP表(biao)達(da)式(shi)語言(yan)(yan)(Expression Language)對當前字(zi)段或整(zheng)行(xing)數(shu)據進(jin)行(xing)轉換(huan)。JSP表(biao)達(da)式(shi)語言(yan)(yan)可以用來(lai)創建算術和邏輯(ji)表(biao)達(da)式(shi)。在表(biao)達(da)式(shi)內(nei)可以使用整(zheng)型數(shu),浮點數(shu),字(zi)符(fu)串,常量(liang)true、false和null。
表達(da)式支持以下兩個環(huan)境(jing)變量:
value:當前字段值。
row:當前行,數組(zu)類型。
表達式支持以下工具(ju)類:
StringUtils:字符串處(chu)理(li)類,參考Java SDK代碼的包結(jie)構“org.apache.commons.lang.StringUtils”。
DateUtils:日期工具類。
CommonUtils:公共工具(ju)類。
NumberUtils:字符串轉數(shu)值類。
HttpsUtils:讀取網(wang)絡(luo)文件(jian)類。
應用舉例:
如果當前字段為字符串類型,將字符串全部轉換為小寫,例如將“aBC”轉換為“abc”。
表達式:StringUtils.lowerCase(value)將當前字段的字符串全部轉為大寫。
表達式:StringUtils.upperCase(value)如果當前字段值為“yyyy-MM-dd”格式的日期字符串,需要截取年,例如字段值為“2017-12-01”,轉換后為“2017”。
表達(da)式:StringUtils.substringBefore(value,"-")如果當前字段值為數值類型,轉換后值為當前值的兩倍。
表達式:value*2如果當前字段值為“true”,轉換后為“Y”,其它值則轉換后為“N”。
表達式:value=="true"?"Y":"N"如果當前字段值為字符串類型,當為空時,轉換為“Default”,否則不轉換。
表達式:empty value? "Default":value如果想將日期字段格式從“2018/01/05 15:15:05”轉換為“2018-01-05 15:15:05”。
表達式:DateUtils.format(DateUtils.parseDate(value,"yyyy/MM/dd HH:mm:ss"),"yyyy-MM-dd HH:mm:ss")獲取一個36位的UUID(Universally Unique Identifier,通用唯一識別碼)。
表達式:CommonUtils.randomUUID()如果當前字段值為字符串類型,將首字母轉換為大寫,例如將“cat”轉換為“Cat”。
表達式:StringUtils.capitalize(value)如果當前字段值為字符串類型,將首字母轉換為小寫,例如將“Cat”轉換為“cat”。
表達式:StringUtils.uncapitalize(value)如果當前字段值為字符串類型,使用空格填充為指定長度,并且將字符串居中,當字符串長度不小于指定長度時不轉換,例如將“ab”轉換為長度為4的“ab”。
表(biao)達式:StringUtils.center(value,4)刪除字符串末尾的一個換行符(包括“\n”、“\r”或者“\r\n”),例如將“abc\r\n\r\n”轉換為“abc\r\n”。
表達(da)式:StringUtils.chomp(value)如果字符串中包含指定的字符串,則返回布爾值true,否則返回false。例如“abc”中包含“a”,則返回true。
表達式:StringUtils.contains(value,"a")如果字符串中包含指定字符串的任一字符,則返回布爾值true,否則返回false。例如“zzabyycdxx”中包含“z”或“a”任意一個,則返回true。
表達式:StringUtils.containsAny("value","za")如果字符串中不包含指定的所有字符,則返回布爾值true,包含任意一個字符則返回false。例如“abz”中包含“xyz”里的任意一個字符,則返回false。
表達式(shi):StringUtils.containsNone(value,"xyz")如果當前字符串只包含指定字符串中的字符,則返回布爾值true,包含任意一個其它字符則返回false。例如“abab”只包含“abc”中的字符,則返回true。
表達式(shi):StringUtils.containsOnly(value,"abc")如果字符串為空或null,則轉換為指定的字符串,否則不轉換。例如將空字符轉換為null。
表達式:StringUtils.defaultIfEmpty(value,null)如果字符串以指定的后綴結尾(包括大小寫),則返回布爾值true,否則返回false。例如“abcdef”后綴不為null,則返回false。
表達式:StringUtils.endsWith(value,null)如果字符串和指定的字符串完全一樣(包括大小寫),則返回布爾值true,否則返回false。例如比較字符串“abc”和“ABC”,則返回false。
表(biao)達式:StringUtils.equals(value,"ABC")從字符串中獲取指定字符串的第一個索引,沒有則返回整數-1。例如從“aabaabaa”中獲取“ab”的第一個索引1。
表達(da)式:StringUtils.indexOf(value,"ab")從字符串中獲取指定字符串的最后一個索引,沒有則返回整數-1。例如從“aFkyk”中獲取“k”的最后一個索引4。
表(biao)達式:StringUtils.lastIndexOf(value,"k")從字符串中指定的位置往后查找,獲取指定字符串的第一個索引,沒有則轉換為“-1”。例如“aabaabaa”中索引3的后面,第一個“b”的索引是5。
表達式:StringUtils.indexOf(value,"b",3)從字符串獲取指定字符串中任一字符的第一個索引,沒有則返回整數-1。例如從“zzabyycdxx”中獲取“z”或“a”的第一個索引0。
表達式:StringUtils.indexOfAny(value,"za")如果字符串僅包含Unicode字符,返回布爾值true,否則返回false。例如“ab2c”中包含非Unicode字符,返回false。
表達式:StringUtils.isAlpha(value)如果字符串僅包含Unicode字符或數字,返回布爾值true,否則返回false。例如“ab2c”中僅包含Unicode字符和數字,返回true。
表達式:StringUtils.isAlphanumeric(value)如果字符串僅包含Unicode字符、數字或空格,返回布爾值true,否則返回false。例如“ab2c”中僅包含Unicode字符和數字,返回true。
表達式:StringUtils.isAlphanumericSpace(value)如果字符串僅包含Unicode字符或空格,返回布爾值true,否則返回false。例如“ab2c”中包含Unicode字符和數字,返回false。
表達式:StringUtils.isAlphaSpace(value)如果字符串僅包含ASCII可打印字符,返回布爾值true,否則返回false。例如“!ab-c~”返回true。
表達式:StringUtils.isAsciiPrintable(value)如果字符串為空或null,返回布爾值true,否則返回false。
表達式:StringUtils.isEmpty(value)如果字符串中僅包含Unicode數字,返回布爾值true,否則返回false。
表達式:StringUtils.isNumeric(value)獲取字符串最左端的指定長度的字符,例如獲取“abc”最左端的2位字符“ab”。
表達(da)式:StringUtils.left(value,2)獲取字符串最右端的指定長度的字符,例如獲取“abc”最右端的2位字符“bc”。
表達式:StringUtils.right(value,2)將指定字符串拼接至當前字符串的左側,需同時指定拼接后的字符串長度,如果當前字符串長度不小于指定長度,則不轉換。例如將“yz”拼接到“bat”左側,拼接后長度為8,則轉換后為“yzyzybat”。
表達式:StringUtils.leftPad(value,8,"yz")將指定字符串拼接至當前字符串的右側,需同時指定拼接后的字符串長度,如果當前字符串長度不小于指定長度,則不轉換。例如將“yz”拼接到“bat”右側,拼接后長度為8,則轉換后為“batyzyzy”。
表(biao)達(da)式(shi):StringUtils.rightPad(value,8,"yz")如果當前字段為字符串類型,獲取當前字符串的長度,如果該字符串為null,則返回0。
表達式:StringUtils.length(value)如果當前字段為字符串類型,刪除其中所有的指定字符串,例如從“queued”中刪除“ue”,轉換后為“qd”。
表達式:StringUtils.remove(value,"ue")如果當前字段為字符串類型,移除當前字段末尾指定的子字符串。指定的子字符串若不在當前字段的末尾,則不轉換,例如移除當前字段“www.daliqc.cn”后的“.cn”。
表達式(shi):StringUtils.removeEnd(value,".com")如果當前字段為字符串類型,移除當前字段開頭指定的子字符串。指定的子字符串若不在當前字段的開頭,則不轉換,例如移除當前字段“www.daliqc.cn”前的“www.”。
表達式:StringUtils.removeStart(value,"www.")如果當前字段為字符串類型,替換當前字段中所有的指定字符串,例如將“aba”中的“a”用“z”替換,轉換后為“zbz”。
表達式:StringUtils.replace(value,"a","z")如果當前字段為字符串類型,一次替換字符串中的多個字符,例如將字符串“hello”中的“h”用“j”替換,“o”用“y”替換,轉換后為“jelly”。
表(biao)達式(shi):StringUtils.replaceChars(value,"ho","jy")如果字符串以指定的前綴開頭(區分大小寫),則返回布爾值true,否則返回false,例如當前字符串“abcdef”以“abc”開頭,則返回true。
表達(da)式:StringUtils.startsWith(value,"abc")如果當前字段為字符串類型,去除字段中所有指定的字符,例如去除“abcyx”中所有的“x”、“y”和“z”,轉換后為“abc”。
表達(da)式:StringUtils.strip(value,"xyz")如果當前字段為字符串類型,去除字段末尾所有指定的字符,例如去除當前字段末尾的所有空格。
表達式(shi):StringUtils.stripEnd(value,null)如果當前字段為字符串類型,去除字段開頭所有指定的字符,例如去除當前字段開頭的所有空格。
表(biao)達式:StringUtils.stripStart(value,null)如果當前字段為字符串類型,獲取字符串指定位置后(不包括指定位置的字符)的子字符串,指定位置如果為負數,則從末尾往前計算位置。例如獲取“abcde”第2個字符后的字符串,則轉換后為“cde”。
表(biao)達式(shi):StringUtils.substring(value,2)如果當前字段為字符串類型,獲取字符串指定區間的子字符串,區間位置如果為負數,則從末尾往前計算位置。例如獲取“abcde”第2個字符后、第5個字符前的字符串,則轉換后為“cd”。
表達式(shi):StringUtils.substring(value,2,5)如果當前字段為字符串類型,獲取當前字段里第一個指定字符后的子字符串。例如獲取“abcba”中第一個“b”之后的子字符串,轉換后為“cba”。
表(biao)達式:StringUtils.substringAfter(value,"b")如果當前字段為字符串類型,獲取當前字段里最后一個指定字符后的子字符串。例如獲取“abcba”中最后一個“b”之后的子字符串,轉換后為“a”。
表(biao)達(da)式(shi):StringUtils.substringAfterLast(value,"b")如果當前字段為字符串類型,獲取當前字段里第一個指定字符前的子字符串。例如獲取“abcba”中第一個“b”之前的子字符串,轉換后為“a”。
表達(da)式(shi):StringUtils.substringBefore(value,"b")如果當前字段為字符串類型,獲取當前字段里最后一個指定字符前的子字符串。例如獲取“abcba”中最后一個“b”之前的子字符串,轉換后為“abc”。
表達(da)式:StringUtils.substringBeforeLast(value,"b")如果當前字段為字符串類型,獲取嵌套在指定字符串之間的子字符串,沒有匹配的則返回null。例如獲取“tagabctag”中“tag”之間的子字符串,轉換后為“abc”。
表達式:StringUtils.substringBetween(value,"tag")如果當前字段為字符串類型,刪除當前字符串兩端的控制字符(char≤32),例如刪除字符串前后的空格。
表達式:StringUtils.trim(value)將當前字符串轉換為字節,如果轉換失敗,則返回0。
表達式:NumberUtils.toByte(value)將當前字符串轉換為字節,如果轉換失敗,則返回指定值,例如指定值配置為1。
表達式:NumberUtils.toByte(value,1)將當前字符串轉換為Double數值,如果轉換失敗,則返回0.0d。
表達式(shi):NumberUtils.toDouble(value)將當前字符串轉換為Double數值,如果轉換失敗,則返回指定值,例如指定值配置為1.1d。
表達式:NumberUtils.toDouble(value,1.1d)將當前字符串轉換為Float數值,如果轉換失敗,則返回0.0f。
表達式:NumberUtils.toFloat(value)將當前字符串轉換為Float數值,如果轉換失敗,則返回指定值,例如配置指定值為1.1f。
表達式(shi):NumberUtils.toFloat(value,1.1f)將當前字符串轉換為Int數值,如果轉換失敗,則返回0。
表(biao)達式:NumberUtils.toInt(value)將當前字符串轉換為Int數值,如果轉換失敗,則返回指定值,例如配置指定值為1。
表(biao)達式:NumberUtils.toInt(value,1)將字符串轉換為Long數值,如果轉換失敗,則返回0。
表(biao)達(da)式:NumberUtils.toLong(value)將當前字符串轉換為Long數值,如果轉換失敗,則返回指定值,例如配置指定值為1L。
表達式(shi):NumberUtils.toLong(value,1L)將字符串轉換為Short數值,如果轉換失敗,則返回0。
表達式:NumberUtils.toShort(value)將當前字符串轉換為Short數值,如果轉換失敗,則返回指定值,例如配置指定值為1。
表達(da)式:NumberUtils.toShort(value,1)將當前IP字符串轉換為Long數值,例如將“10.78.124.0”轉換為LONG數值是“172915712”。
表達式:CommonUtils.ipToLong(value)從網絡讀取一個IP與物理地址映射文件,并存放到Map集合,這里的URL是IP與地址映射文件存放地址,例如“//10.114.205.45:21203/sqoop/IpList.csv”。
表達式:HttpsUtils.downloadMap("url")將IP與地址映射對象緩存起來并指定一個key值用于檢索,例如“ipList”。
表達(da)式:CommonUtils.setCache("ipList",HttpsUtils.downloadMap("url"))取出緩存的IP與地址映射對象。
表(biao)達式(shi):CommonUtils.getCache("ipList")判斷是否有IP與地址映射緩存。
表(biao)達式:CommonUtils.cacheExists("ipList")根據指定的偏移類型(month/day/hour/minute/second)及偏移量(正數表示增加,負數表示減少),將指定格式的時間轉換為一個新時間,例如將“2019-05-21 12:00:00”增加8個小時。
表達(da)式(shi):DateUtils.getCurrentTimeByZone("yyyy-MM-dd HH:mm:ss",value, "hour", 8)
Hadoop類型的數據源進行數據遷移時,建議使用的組件版本有哪些?
建議使(shi)用(yong)的組件版本既(ji)可以(yi)作為(wei)(wei)目的端(duan)使(shi)用(yong),也可以(yi)作為(wei)(wei)源端(duan)使(shi)用(yong)詳見下表。
Hadoop類(lei)型 組件(jian) 說明 MRS/Apache/FusionInsight HD
Hive
暫不(bu)支持2.x版本,建(jian)議使用的版本:
l 1.2.X
l 3.1.X
HDFS
建(jian)議使(shi)用(yong)的版本:
l 2.8.X
l 3.1.X
Hbase
建議使用的版(ban)本:
l 2.1.X
l 1.3.X
數據源為Hive時支持哪些數據格式?
云數據遷移服(fu)務支持從Hive數據源讀寫的數據格式包括SequenceFile、TextFile、ORC、Parquet。
如有疑問,請聯系您的客戶經(jing)理(li),或致電天翼云官方(fang)客服(fu):400-810-9889。
是否支持同步作業到其他集群?
CDM雖然不支持直接(jie)在不同(tong)集群(qun)間遷移作業,但是通過批量(liang)導出、批量(liang)導入作業的功(gong)能,可(ke)以間接(jie)實現集群(qun)間的作業遷移,方法如下:
將CDM集群1中的所有作業批量導出,將作業的JSON文件保存到本地。
由于安(an)全原因,CDM導出(chu)作業(ye)時沒有導出(chu)連接密碼,連接密碼全部使用“Add password here”替換。在本地編輯JSON文件,將“Add password here”替換為對應(ying)連接的正確密碼。
將編輯(ji)好的(de)(de)JSON文件批(pi)量導入到(dao)CDM集群(qun)2,實(shi)現集群(qun)1和(he)集群(qun)2之(zhi)間的(de)(de)作業同步。
是否支持批量創建作業?
CDM可以通過批量導入的功能,實現批量創建作業,方(fang)法如下:
手動創建一個作業。
導出作業,將作業的JSON文件保存(cun)到本地。
編輯JSON文件,參考該作業的配置,在JSON文件中批量(liang)復(fu)制出(chu)更多作業。
將(jiang)JSON文件導入CDM集(ji)群,實現批量創建作業。
是否支持批量調度作業?
支持。
訪問DataArts Studio服(fu)務(wu)的數(shu)據開發模塊(kuai)。
在數(shu)據開(kai)發主界(jie)面的(de)左側(ce)導航欄(lan),選(xuan)擇(ze)“數(shu)據開(kai)發 > 作(zuo)業(ye)開(kai)發”,新建作(zuo)業(ye)。
拖動多個(ge)CDM Job節點至畫布,然后再編排作業。
如何備份CDM作業?
可以(yi),如果用戶長時間不需要使(shi)用CDM集群(qun),可以(yi)將CDM集群(qun)停掉或刪除來(lai)降低(di)成(cheng)本。
刪除前(qian),用戶可以先通過CDM的(de)批量(liang)導出功能,把(ba)所有作業(ye)(ye)腳(jiao)本保存(cun)到本地(di),僅(jin)在需要的(de)時(shi)候(hou)再重新創建(jian)集群(qun)、重新導入(ru)作業(ye)(ye),實現(xian)作業(ye)(ye)備份(fen)。
如果HANA集群只有部分節點和CDM集群網絡互通,應該如何配置連接?
如果HANA集群只有部(bu)分節(jie)點和CDM網絡互通,為確保(bao)CDM正常連接HANA集群,則需要進行如下(xia)配置:
關(guan)閉(bi)HANA集(ji)群的Statement Routing開(kai)關(guan)。但須(xu)注意,關(guan)閉(bi)Statement Routing,會增加(jia)配(pei)置節點(dian)的壓力。
新(xin)建HANA連接時,在高級屬(shu)性中添加屬(shu)性“distribution”,并將值置為“off”。
完成配置后,CDM即(ji)可正(zheng)常連接HANA集群。
如何使用Java調用CDM的Rest API創建數據遷移作業?
CDM提供了Rest API,可以通過程序調用實現自動化的作業創(chuang)建或(huo)執(zhi)行控制。
這(zhe)里以CDM遷移MySQL數(shu)據庫(ku)的表city1的數(shu)據到DWS的表city2為例,介紹如(ru)何使用Java調(diao)用CDM服(fu)務的REST API創建(jian)、啟(qi)動(dong)、查詢、刪除該CDM作業(ye)。
需要提前準(zhun)備以下(xia)數據:
云賬號的用(yong)戶(hu)名、賬號名和項目ID。
創建一(yi)個(ge)CDM集群,并(bing)獲取集群ID。
獲取方法:在集群管理界面(mian),單(dan)擊CDM集群名稱可(ke)查看集群ID,例如“c110beff-0f11-4e75-8b10-da7cd882b0ef”。
創建(jian)一(yi)個MySQL數(shu)據庫(ku)和(he)一(yi)個DWS數(shu)據庫(ku),并(bing)創建(jian)好表city1和(he)表city2,創表語(yu)句如下:
MySQL: create table city1(code varchar(10),name varchar(32)); insert into city1 values('NY','New York'); DWS: create table city2(code varchar(10),name varchar(32));在CDM集群(qun)下,創(chuang)建連接(jie)到MySQL的連接(jie),例如連接(jie)名稱為(wei)“mysqltestlink”。創(chuang)建連接(jie)到DWS的連接(jie),例如連接(jie)名稱為(wei)“dwstestlink”。
運(yun)行下述代碼,依(yi)賴(lai)HttpClient包,建議使用4.5版本。Maven配置如下:
<project> <modelVersion>4.0.0</modelVersion> <groupId>cdm</groupId> <artifactId>cdm-client</artifactId> <version>1</version> <dependencies> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5</version> </dependency> </dependencies> </project>
代碼示例
使(shi)用Java調用CDM服務的REST API創建(jian)、啟動(dong)、查詢、刪除CDM作業的代碼示例如下:
package cdmclient;
import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class CdmClient {
private final static String DOMAIN_NAME="云賬號名";
private final static String USER_NAME="云用戶名";
private final static String USER_PASSWORD="云用戶密碼";
private final static String PROJECT_ID="項目ID";
private final static String CLUSTER_ID="CDM集群ID";
private final static String JOB_NAME="作業名稱";
private final static String FROM_LINKNAME="源連接名稱";
private final static String TO_LINKNAME="目的連接名稱";
private final static String IAM_ENDPOINT="IAM的Endpoint";
private final static String CDM_ENDPOINT="CDM的Endpoint";
private CloseableHttpClient httpclient;
private String token;
public CdmClient() {
this.httpclient = createHttpClient();
this.token = login();
}
private CloseableHttpClient createHttpClient() {
CloseableHttpClient httpclient =HttpClients.createDefault();
return httpclient;
}
private String login(){
HttpPost httpPost = new HttpPost("//"+IAM_ENDPOINT+"/v3/auth/tokens");
String json =
"{\r\n"+
"\"auth\": {\r\n"+
"\"identity\": {\r\n"+
"\"methods\": [\"password\"],\r\n"+
"\"password\": {\r\n"+
"\"user\": {\r\n"+
"\"name\": \""+USER_NAME+"\",\r\n"+
"\"password\": \""+USER_PASSWORD+"\",\r\n"+
"\"domain\": {\r\n"+
"\"name\": \""+DOMAIN_NAME+"\"\r\n"+
"}\r\n"+
"}\r\n"+
"}\r\n"+
"},\r\n"+
"\"scope\": {\r\n"+
"\"project\": {\r\n"+
"\"name\": \"PROJECT_NAME\"\r\n"+
"}\r\n"+
"}\r\n"+
"}\r\n"+
"}\r\n";
try {
StringEntity s = new StringEntity(json);
s.setContentEncoding("UTF-8");
s.setContentType("application/json");
httpPost.setEntity(s);
CloseableHttpResponse response = httpclient.execute(httpPost);
Header tokenHeader = response.getFirstHeader("X-Subject-Token");
String token = tokenHeader.getValue();
System.out.println("Login successful");
return token;
} catch (Exception e) {
throw new RuntimeException("login failed.", e);
}
}
/*創建作業*/
public void createJob(){
HttpPost httpPost = new HttpPost("//"+CDM_ENDPOINT+"/cdm/v1.0/"+PROJECT_ID+"/clusters/"+CLUSTER_ID+"/cdm/job");
/**此處JSON信息比較復雜,可以先在作業管理界面上創建一個作業,然后單擊作業后的“作業JSON定義”,復制其中的JSON內容,格式化為Java字符串語法,然后粘貼到此處。
*JSON消息體中一般只需要替換連接名、導入和導出的表名、導入導出表的字段列表、源表中用于分區的字段。**/
String json =
"{\r\n"+
"\"jobs\": [\r\n"+
"{\r\n"+
"\"from-connector-name\": \"generic-jdbc-connector\",\r\n"+
"\"name\": \""+JOB_NAME+"\",\r\n"+
"\"to-connector-name\": \"generic-jdbc-connector\",\r\n"+
"\"driver-config-values\": {\r\n"+
"\"configs\": [\r\n"+
"{\r\n"+
"\"inputs\": [\r\n"+
"{\r\n"+
"\"name\": \"throttlingConfig.numExtractors\",\r\n"+
"\"value\": \"1\"\r\n"+
"}\r\n"+
"],\r\n"+
"\"validators\": [],\r\n"+
"\"type\": \"JOB\",\r\n"+
"\"id\": 30,\r\n"+
"\"name\": \"throttlingConfig\"\r\n"+
"}\r\n"+
"]\r\n"+
"},\r\n"+
"\"from-link-name\": \""+FROM_LINKNAME+"\",\r\n"+
"\"from-config-values\": {\r\n"+
"\"configs\": [\r\n"+
"{\r\n"+
"\"inputs\": [\r\n"+
"{\r\n"+
"\"name\": \"fromJobConfig.schemaName\",\r\n"+
"\"value\": \"sqoop\"\r\n"+
"},\r\n"+
"{\r\n"+
"\"name\": \"fromJobConfig.tableName\",\r\n"+
"\"value\": \"city1\"\r\n"+
"},\r\n"+
"{\r\n"+
"\"name\": \"fromJobConfig.columnList\",\r\n"+
"\"value\": \"code&name\"\r\n"+
"},\r\n"+
"{\r\n"+
"\"name\": \"fromJobConfig.partitionColumn\",\r\n"+
"\"value\": \"code\"\r\n"+
"}\r\n"+
"],\r\n"+
"\"validators\": [],\r\n"+
"\"type\": \"JOB\",\r\n"+
"\"id\": 7,\r\n"+
"\"name\": \"fromJobConfig\"\r\n"+
"}\r\n"+
"]\r\n"+
"},\r\n"+
"\"to-link-name\": \""+TO_LINKNAME+"\",\r\n"+
"\"to-config-values\": {\r\n"+
"\"configs\": [\r\n"+
"{\r\n"+
"\"inputs\": [\r\n"+
"{\r\n"+
"\"name\": \"toJobConfig.schemaName\",\r\n"+
"\"value\": \"sqoop\"\r\n"+
"},\r\n"+
"{\r\n"+
"\"name\": \"toJobConfig.tableName\",\r\n"+
"\"value\": \"city2\"\r\n"+
"},\r\n"+
"{\r\n"+
"\"name\": \"toJobConfig.columnList\",\r\n"+
"\"value\": \"code&name\"\r\n"+
"}, \r\n"+
"{\r\n"+
"\"name\": \"toJobConfig.shouldClearTable\",\r\n"+
"\"value\": \"true\"\r\n"+
"}\r\n"+
"],\r\n"+
"\"validators\": [],\r\n"+
"\"type\": \"JOB\",\r\n"+
"\"id\": 9,\r\n"+
"\"name\": \"toJobConfig\"\r\n"+
"}\r\n"+
"]\r\n"+
"}\r\n"+
"}\r\n"+
"]\r\n"+
"}\r\n";
try {
StringEntity s = new StringEntity(json);
s.setContentEncoding("UTF-8");
s.setContentType("application/json");
httpPost.setEntity(s);
httpPost.addHeader("X-Auth-Token", this.token);
httpPost.addHeader("X-Language", "en-us");
CloseableHttpResponse response = httpclient.execute(httpPost);
int status = response.getStatusLine().getStatusCode();
if(status == 200){
System.out.println("Create job successful.");
}else{
System.out.println("Create job failed.");
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.toString(entity));
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Create job failed.", e);
}
}
/*啟動作業*/
public void startJob(){
HttpPut httpPut = new HttpPut("//"+CDM_ENDPOINT+"/cdm/v1.0/"+PROJECT_ID+"/clusters/"+CLUSTER_ID+"/cdm/job/"+JOB_NAME+"/start");
String json = "";
try {
StringEntity s = new StringEntity(json);
s.setContentEncoding("UTF-8");
s.setContentType("application/json");
httpPut.setEntity(s);
httpPut.addHeader("X-Auth-Token", this.token);
httpPut.addHeader("X-Language", "en-us");
CloseableHttpResponse response = httpclient.execute(httpPut);
int status = response.getStatusLine().getStatusCode();
if(status == 200){
System.out.println("Start job successful.");
}else{
System.out.println("Start job failed.");
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.toString(entity));
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Start job failed.", e);
}
}
/*循環查詢作業運行狀態,直到作業運行結束。*/
public void getJobStatus(){
HttpGet httpGet = new HttpGet("//"+CDM_ENDPOINT+"/cdm/v1.0/"+PROJECT_ID+"/clusters/"+CLUSTER_ID+"/cdm/job/"+JOB_NAME+"/status");
try {
httpGet.addHeader("X-Auth-Token", this.token);
httpGet.addHeader("X-Language", "en-us");
boolean flag = true;
while(flag){
CloseableHttpResponse response = httpclient.execute(httpGet);
int status = response.getStatusLine().getStatusCode();
if(status == 200){
HttpEntity entity = response.getEntity();
String msg = EntityUtils.toString(entity);
if(msg.contains("\"status\":\"SUCCEEDED\"")){
System.out.println("Job succeeded");
break;
}else if (msg.contains("\"status\":\"FAILED\"")){
System.out.println("Job failed.");
break;
}else{
Thread.sleep(1000);
}
}else{
System.out.println("Get job status failed.");
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.toString(entity));
break;
}
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Get job status failed.", e);
}
}
/*刪除作業*/
public void deleteJob(){
HttpDelete httpDelte = new HttpDelete("//"+CDM_ENDPOINT+"/cdm/v1.0/"+PROJECT_ID+"/clusters/"+CLUSTER_ID+"/cdm/job/"+JOB_NAME);
try {
httpDelte.addHeader("X-Auth-Token", this.token);
httpDelte.addHeader("X-Language", "en-us");
CloseableHttpResponse response = httpclient.execute(httpDelte);
int status = response.getStatusLine().getStatusCode();
if(status == 200){
System.out.println("Delete job successful.");
}else{
System.out.println("Delete job failed.");
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.toString(entity));
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Delete job failed.", e);
}
}
/*關閉*/
public void close(){
try {
httpclient.close();
} catch (IOException e) {
throw new RuntimeException("Close failed.", e);
}
}
public static void main(String[] args){
CdmClient cdmClient = new CdmClient();
cdmClient.createJob();
cdmClient.startJob();
cdmClient.getJobStatus();
cdmClient.deleteJob();
cdmClient.close();
}
}如何將云下內網或第三方云上的私網與CDM連通?
很多(duo)企業(ye)會把(ba)關鍵數據源(yuan)建設在內網(wang),例(li)如(ru)數據庫(ku)、文件服(fu)務器(qi)等(deng)。由于(yu)CDM運(yun)行在云上,如(ru)果要通(tong)(tong)過CDM遷(qian)移內網(wang)數據到云上的(de)話,可以通(tong)(tong)過以下幾種方(fang)式(shi)連通(tong)(tong)內網(wang)和CDM的(de)網(wang)絡:
如(ru)果目標(biao)數據(ju)源為云(yun)(yun)(yun)下(xia)的數據(ju)庫,則需要通(tong)過公(gong)網(wang)或者專線打通(tong)網(wang)絡。通(tong)過公(gong)網(wang)互通(tong)時,需確保CDM集群已綁定EIP、CDM云(yun)(yun)(yun)上安全組出方向(xiang)放通(tong)云(yun)(yun)(yun)下(xia)數據(ju)源所(suo)在(zai)的主機、數據(ju)源所(suo)在(zai)的主機可(ke)以訪問(wen)公(gong)網(wang)且防火墻規則已開放連(lian)接(jie)端口。
在(zai)本地(di)數據中心和云服務VPC之間(jian)建立VPN通(tong)道。
通過NAT(網絡地址轉(zhuan)換(huan),Network
Address Translation)或端口(kou)轉發,以代(dai)理(li)的方(fang)式訪(fang)問。
這里重(zhong)點介紹如何通過端口轉發工(gong)具來(lai)實現訪問(wen)內部數據,流程如下(xia):
找一(yi)臺windows機器作(zuo)為網關,該(gai)機器必須可以直接(jie)訪(fang)問(wen)Internet,同(tong)時可以訪(fang)問(wen)內網。
在該機器上(shang)安裝端口(kou)映射(she)工具(IPOP)。
通過端口映射(she)(she)工具(IPOP)配置端口映射(she)(she)。
說明長時間將內網數據庫暴露在公網會有安全風險,遷移數據完成后,請及時停止端口映射。
場景描述
這里假設是將內網MySQL遷(qian)移到云(yun)服務DWS。
圖中的內網既(ji)可以(yi)是(shi)(shi)企業自(zi)己的數(shu)據中心,也可以(yi)是(shi)(shi)在第三方云的虛擬數(shu)據中心私網。
如下圖(tu)“網絡拓撲樣例”:

操作步驟
1.找一臺(tai)Windows機器(qi)(qi)(qi)作為網關機,該機器(qi)(qi)(qi)同時配置內網和外網IP。通過以(yi)下測試(shi)來確(que)保網關機器(qi)(qi)(qi)的服務(wu)要(yao)求:
a.在該機器上ping內(nei)網(wang)MySQL地址可以ping通(tong),例如:ping 192.168.1.8。
b.在另外一臺可上網的(de)機器上ping網關(guan)機的(de)公網地址可以ping通(tong),例如ping 202.xx.xx.10。
2.下載端口映射工(gong)具IPOP,在網關機上安裝(zhuang)IPOP。
3.運行端口(kou)映射(she)工具,選(xuan)擇“端口(kou)映射(she)”,如(ru)圖(tu)下圖(tu)配(pei)置端口(kou)映射(she)所示(shi)。
本地地址、本地端(duan)口(kou):配置為網(wang)關機的公(gong)網(wang)地址和端(duan)口(kou)(后續在(zai)CDM上(shang)創建MySQL連(lian)接時輸入這(zhe)個地址和端(duan)口(kou))。
映射地址、映射端口:配置為內網MySQL的地址和端口。

4.單(dan)擊(ji)“增加(jia)”,添(tian)加(jia)端口映射(she)關(guan)系。
5.單擊“開始(shi)映射”,這時才(cai)會真正開始(shi)映射,接收(shou)數據包。
至此,就可以在CDM上通過彈(dan)性IP讀取(qu)本地(di)內網MySQL的數據(ju),然后導入到云服(fu)務DWS中(zhong)。
說明1. CDM要訪問本地數據源(yuan),也必(bi)須給CDM集群配置EIP。
2. 一(yi)般云服(fu)務(wu)DWS默認也(ye)是(shi)只允(yun)許VPC內部(bu)訪問,創建CDM集(ji)群時,必須將CDM的VPC與DWS配置一致,且推薦在(zai)同一個(ge)內網(wang)和安全(quan)組(zu),如果不(bu)同,還(huan)需要配置允許(xu)兩個(ge)安全(quan)組(zu)之(zhi)間(jian)的(de)數據訪(fang)問。
3. 端口映射不(bu)僅可以用于遷(qian)移(yi)內網(wang)數據(ju)庫的(de)數據(ju),還(huan)可以遷(qian)移(yi)例(li)如SFTP服務器上(shang)的(de)數據。
4. Linux機器也(ye)可以通過(guo)IPTABLE實現端口映射(she)。
5. 內網(wang)中的(de)FTP通過端(duan)口映射到(dao)公網時(shi),需(xu)要(yao)檢查是(shi)否啟(qi)用了PASV模式。這種情(qing)況(kuang)下客戶端和服務端建立連接(jie)的(de)時候是走的(de)隨機端口,所(suo)以除了配(pei)置21端口(kou)映(ying)射(she)外,還(huan)需(xu)要配置PASV模式的(de)端(duan)口范(fan)圍映射,例如vsftp通過配置(zhi)pasv_min_port和pasv_max_port指定端口范(fan)圍。
CDM遷移作業的抽取并發數應該如何設置?
CDM遷移作業的(de)抽(chou)取并發數,與集群規格和表大(da)(da)小有關(guan)。并發抽(chou)取數取值范圍為1-300,若(ruo)配置過大(da)(da),則以隊列(lie)的(de)形式進行排隊。
建議(yi)每(mei)1CUs(1CUs=1核4G)配置為4,如下表(biao)“抽(chou)(chou)取并(bing)發數參考(kao)配置”所示,您也可(ke)(ke)以根據實際情況進(jin)行調整。另外(wai),每(mei)行數據大小為1MB以下的可(ke)(ke)以多(duo)并(bing)發抽(chou)(chou)取,超過1MB的建議(yi)單(dan)線程(cheng)抽(chou)(chou)取數據。
說明l 遷移的目的端為文件時,CDM不支持多并發,此時應配置為單進程抽取數據。l 單作業的抽取并發數,受到作業“配置管理”中所配置的“最大抽取并發數”影響。“最大抽取并發數”配置的是抽取并發總數。
| CDM集群規格 | vCPUs/內存 | 抽取并發數參考配置 |
|---|---|---|
| cdm.large | 8核16GB | 16 |
| cdm.xlarge | 16核32GB | 32 |
| cdm.4xlarge | 64核128GB | 128 |
CDM是否支持動態數據實時遷移功能?
不支持。
如果源端在遷移過程(cheng)中寫(xie)數(shu)據,可(ke)能會出現(xian)報錯。
故障處理類
問題描述
使用(yong)CDM從OBS導入數據(ju)到SQL Server時,作業(ye)運行失敗,錯誤提示為(wei):Unable to execute the SQL statement. Cause : 將截(jie)斷字符串或二進制數據(ju)。
原因分析
用戶OBS中的數(shu)(shu)據超出了SQL Server數(shu)(shu)據庫的字段長度(du)限(xian)制。
解決方法
在SQL Server數(shu)據庫中(zhong)建表時,將數(shu)據庫字段改(gai)大,長度不能小于源端OBS中(zhong)的數(shu)據長度。
Oracle遷移到DWS報錯ORA-01555
問題現象
使用CDM遷移Oracle數據(ju)至DWS,報(bao)錯圖下圖所示。

原因分析
數(shu)據遷移(yi),整表查(cha)詢且該表數(shu)據量大,那么查(cha)詢時(shi)間較(jiao)長。
查詢過程(cheng)中,其(qi)他用(yong)戶頻繁進行commit操作。
Oracel的(de)RBS(rollbackspace 回滾時使用的(de)表空(kong)間 )較小,造成(cheng)遷移任務(wu)沒有完成(cheng),源庫已更(geng)新,回滾超時。
建議與總結
調(diao)小每次(ci)查詢的數據量。
通過修改數(shu)據庫配置(zhi)調(diao)大Oracle的RBS。
MongoDB連接遷移失敗時如何處理?
在默(mo)認情況下,userAdmin角色(se)只具(ju)備對角色(se)和(he)用戶(hu)的(de)管理,不具(ju)備對庫的(de)讀(du)和(he)寫權(quan)限。
當用(yong)(yong)戶選擇MongoDB連(lian)(lian)接(jie)遷移失敗(bai)時,用(yong)(yong)戶需查(cha)看MongoDB連(lian)(lian)接(jie)中用(yong)(yong)戶的(de)權(quan)限(xian)信息(xi),確保對指定(ding)庫具備ReadWrite權(quan)限(xian)。
Hive遷移作業長時間卡住怎么辦?
為避免Hive遷移(yi)作業長時間卡住,可手動停止遷移(yi)作業后,通(tong)過(guo)編輯Hive連接增(zeng)加(jia)如下(xia)屬性設置(zhi):
屬性(xing)名稱:hive.server2.idle.operation.timeout
值:10m
如下圖所示

使用CDM遷移數據由于字段類型映射不匹配導致報錯怎么處理?
問題描述
MySQL遷(qian)移時報錯(cuo):Unable to connect to the database server. Cause: connect timed out.
原因分析
這種(zhong)情況是(shi)由于表數據量較大,并且源端(duan)通過where語句(ju)過濾,但(dan)并非索引列(lie)(lie),或列(lie)(lie)值不離散,查詢(xun)會全表掃描,導(dao)致(zhi)JDBC連(lian)接(jie)超(chao)時(shi)。例如圖(tu)“非索引列(lie)(lie)”所(suo)示c_date字(zi)段為非索引列(lie)(lie)。

解決方案
優先聯系DBA修改表結構,將需要過濾的列配置為索引列,然后重試。
如果(guo)由于數據不離(li)散,導致還是失敗請(qing)參考(kao)2~4,通過增大(da)JDBC超時時間(jian)解決。根據作業找到對應的MySQL連接名稱,查找連接信息。
如下圖圖連接信息
單擊“連接(jie)管理(li)”,在“操(cao)作”列中,單擊“連接(jie)”進(jin)行編輯(ji)。
如下圖連接

打(da)開高(gao)級屬性,在“連接屬性”中建議(yi)新(xin)增“connectTimeout”與“socketTimeout”參數及參數值(zhi),單擊“保存”。
如下圖編(bian)輯(ji)高級屬(shu)性:

創建了Hive到DWS類型的連接,進行CDM傳輸任務失敗時如何處理?
建議清(qing)空(kong)歷(li)史(shi)數(shu)(shu)據(ju)(ju)后(hou)再(zai)次嘗試該任務(wu)。在使用(yong)CDM遷移作業的時候(hou)需要配置清(qing)空(kong)歷(li)史(shi)數(shu)(shu)據(ju)(ju),然后(hou)再(zai)做遷移,可(ke)大大降低任務(wu)失(shi)敗的概率(lv)。
如何使用CDM服務將MySQL的數據導出成SQL文件,然后上傳到OBS桶?
CDM服務暫不支(zhi)持該操(cao)作(zuo)。
建(jian)議(yi)通過(guo)手(shou)動(dong)導出MySQL的數據文(wen)件(jian),然后(hou)在(zai)服務(wu)器上開(kai)啟SFTP服務(wu),然后(hou)新建(jian)CDM作業,源端(duan)是SFTP協議(yi),目的端(duan)是OBS,將文(wen)件(jian)傳過(guo)去。
如何處理CDM從OBS遷移數據到DLI出現遷移中斷失敗的問題?
此類作業問題表現為配(pei)置(zhi)了臟(zang)數據寫入,但并無(wu)臟(zang)數據。
這種情況下需要調低并發任務數,即可避免此類問(wen)題。
如何處理CDM連接器報錯“配置項 [linkConfig.iamAuth] 不存在”?
此問題歸因為:客戶證書過期。
客戶證書過(guo)期,需要完成更新(xin)證書操作,完成后重新(xin)配置(zhi)連接器即可。
創建數據連接時報錯“配置項[linkConfig.createBackendLinks]不存在”或創建作業時報錯“配置項 [throttlingConfig.concurrentSubJobs] 不存在”怎么辦?
當同時存(cun)在(zai)多個不同版(ban)本(ben)的集(ji)(ji)群,先在(zai)低版(ban)本(ben)CDM集(ji)(ji)群創建數據(ju)連接或保存(cun)作業時后,再進入(ru)高版(ban)本(ben)CDM集(ji)(ji)群時,會偶現此類故障。
需手(shou)動清理(li)瀏覽器緩存,即可避(bi)免此類問題(ti)。
新建MRS Hive連接時,提示:CORE_0031:Connect time out. (Cdm.0523) 怎么解決?
新(xin)建MRS Hive連接時,提示無(wu)法下載配置文(wen)件,實際是用(yong)戶權限不足。建議您新(xin)建一個(ge)業務用(yong)戶,給對應(ying)的權限后重試(shi)即可。
如(ru)果要(yao)創(chuang)建(jian)MRS安全集群的數據(ju)(ju)連(lian)(lian)接(jie),不能使(shi)用(yong)(yong)admin用(yong)(yong)戶(hu)。因為(wei)admin用(yong)(yong)戶(hu)是默認(ren)的管理頁面用(yong)(yong)戶(hu),這個(ge)用(yong)(yong)戶(hu)無(wu)法作為(wei)安全集群的認(ren)證用(yong)(yong)戶(hu)來使(shi)用(yong)(yong)。您可以創(chuang)建(jian)一(yi)個(ge)新的MRS用(yong)(yong)戶(hu),然后在(zai)創(chuang)建(jian)MRS數據(ju)(ju)連(lian)(lian)接(jie)時,“用(yong)(yong)戶(hu)名(ming)”和(he)“密碼”填寫(xie)為(wei)新建(jian)的MRS用(yong)(yong)戶(hu)及(ji)其密碼。
說明l 如果CDM集群為2.9.0版本及之后版本,且MRS集群為3.1.0及之后版本,則所創建的用戶至少需具備Manager_viewer的角色權限才能在CDM創建連接;如果需要對MRS組件的庫、表、列進行操作,還需要參考MRS文檔添加對應組件的庫、表、列操作權限。l 如果CDM集群為2.9.0之前的版本,或MRS集群為3.1.0之前的版本,則所創建的用戶需要具備Manager_administrator或System_administrator權限,才能在CDM創建連接。l 僅具備Manager_tenant或Manager_auditor權限,無法創建連接。
遷移時已選擇表不存在時自動創表,提示“CDM not support auto create empty table with no column”怎么處理?
這是(shi)由于數據(ju)庫(ku)表名中(zhong)含有特殊字符導(dao)致(zhi)識別出語(yu)法錯(cuo)誤(wu),按數據(ju)庫(ku)對象(xiang)命名規則(ze)重(zhong)新(xin)命名后恢復(fu)正常。
例如,DWS數據倉(cang)庫(ku)中的數據表命名需(xu)要滿足(zu)以下(xia)約(yue)束:長(chang)度不超過63個(ge)字(zi)符(fu),以字(zi)母(mu)(mu)或下(xia)劃(hua)線開頭,中間字(zi)符(fu)可以是字(zi)母(mu)(mu)、數字(zi)、下(xia)劃(hua)線、$、#。
創建Oracle關系型數據庫遷移作業時,無法獲取模式名怎么處理?
這是由(you)于可能上(shang)傳了(le)暫不支持的最新ORACLE_8驅動(如Oracle Database 21c (21.3) drivers)。
解決此問(wen)題,推薦使用(yong)Oracle Database 12c中的ojdbc8.jar驅動。