datastage問題匯總

來源:互聯網
上載者:User

如果你使用Datastage7.5.x來做ETL,那麼建議你先看下一IBM官方公布的已修正的BUG,
http://www-01.ibm.com/support/docview.wss?uid=swg21438499
個人看法:DS的BUG真是多啊!
遇到問題了,先去修正的BUG列表看看的,說不定又是什麼BUG!

工作中用到了DS,也遇到了很多的問題,在此記錄一下!不對的地方請高手斧正!

1.DS所在的作業系統
這次項目(銀河ACRM)中DS採用的環境是借鑒了中投資料中心的經驗,所以就選擇了Red Hat Linux As 4 Update 8 x86_64 + Datastage 7.5.2.1。
後來,在解決問題的過程中從發行註記中發現這麼一句話“Windows/Linux platforms are only supported on Intel x86 32-bit Processor”,
經驗證:此次選擇了在Linux X86_64上安裝DS造成後續的一些問題!
以後安裝軟體,一定要看軟體的發行註記哦!如果適用於32bit的系統,那就別選擇64bit的作業系統了!
建議:Red Hat Linux As 4 Update 8 x86 + Datastage 7.5.2.1

2.complier的選擇
在32位系統中你不會遇到這個問題!
因為選擇了64位的系統,但是Datastage 7.5.2.1隻支援32位的系統,所以在環境變數中的編譯器部分做如下調整:
IBM官方給出的配置:
APT_COMPILEOPT:-O -fPIC -Wno-deprecated -c -m32
APT_COMPILER:g++32 -m32
APT_LINKER:g++32 -m32
APT_LINKOPT:-shared -32 -Wl,-Bsymbolic,--allow-shlib-undefined

我自己的配置:
APT_COMPILEOPT:-O -fPIC -Wno-deprecated -c
APT_COMPILER:g++32 -m32
APT_LINKER:g++32 -m32
APT_LINKOPT:-shared -Wl,-Bsymbolic,--allow-shlib-undefined

3.Oracle lib的選擇
因為是64位的作業系統,所以也就安裝了Oracle 10g的64位用戶端,在$ORACLE_HOME的目錄下就有了lib,lib32兩個目錄,
DS是使用lib32的,所以在$DSHOME/dsenv的LD_LIBRARY_PATH中添加$ORACLE_HOME/lib32.

4.Oracle字元集轉換的問題
在作業系統環境變數,DS環境變數中設定NLS_LANG,而且還要做字元集映射,
在/home/dsadm/Ascential/DataStage/PXEngine.752.1/etc/oracle_cs.txt 中增加:
GBK             ZHS16GBK
ZHS16GBK        GBK
第一列是DS內建的字元集,第二列是Oracle的字元集,依照這個說法那就不需要第二行了,這裡我還是加上了!

5.DS共用記憶體調優
在DS8.1之前的版本,命令SHMTEST只在Linux 32-bit上才有效,在Linux 64-bit上選入無限迴圈,IBM已在8.1中進行了修複!
BUG修複地址:http://www-01.ibm.com/support/docview.wss?rs=14&uid=swg1JR32113,此處不再摘錄!

6.DS串連到Oracle RAC
如果Oracle資料庫使用了RAC,曾經叫做(Oracle Parallel Server,OPS),用於資料幫浦的資料庫使用者在擁有其他許可權的同時,必須擁有訪問SYS.GV_$INSTANCE的許可權。
另外,還必須在Datastage Administrator中,添加Project的環境變數,APT_ORACLE_NO_OPS = 1。

7.DS中Oracle使用者的許可權問題
DS使用oracle時候要對以下視圖賦許可權
DBA_EXTENTS
DBA_DATA_FILES
DBA_TAB_PARTITONS
DBA_OBJECTS
ALL_PART_INDEXES
ALL_PART_TABLES
ALL_INDEXES
SYS.GV_$INSTANCE (Only if Oracle Parallel Server is used or RAC)
datastage內建的線上說明文檔上說明這一點,
We suggest that you create a role that has the appropriate SELECT privileges, as follows:
CREATE ROLE DSXE;
GRANT SELECT on sys.dba_extents to DSXE;
GRANT SELECT on sys.gv_$instance to DSXE;
GRANT SELECT on sys.dba_data_files to DSXE;
GRANT SELECT on sys.dba_tab_partitions to DSXE;
GRANT SELECT on sys.dba_objects to DSXE;
GRANT SELECT on sys.all_part_indexes to DSXE;
GRANT SELECT on sys.all_part_tables to DSXE;
GRANT SELECT on sys.all_indexes to DSXE;
Once the role is created, grant it to users who will run DataStage jobs, as follows:
GRANT DSXE to <oracle userid>;

8.DS啟動關閉
在datastage中使用uv -admin -stop關閉DS之前,要退出所有的用戶端串連,必須使用ps -ef| grep ds來查看串連到DS的進程,找到PID用kill命令殺掉,
或者在director中清除掉所有的串連,之後再使用uv -admin -stop來關閉DS,否則存在DS串連的情況下關閉DS,使用uv -admin -start啟動DS時,
可能無法啟動dsrpcd如果嘗試多次無法啟動dsrpcd,請參考文章“Linux環境下Datastage的dsrpc追蹤方法”;最後的辦法就是重啟機器!

9.抽取速度慢的問題
Datastage 7.5.2 抽取Oracle資料太慢,檢查JOB日誌發現,JOB運行時檢查/home/dsadm/Ascential/DataStage/Configurations目錄下的default.apt檔案,
此檔案用於用於指定DS的節點,一般是每個CPU對應一個節點,而我的檔案中只有一個節點,依據CPU個數增加節點數,重啟DS。
在此抽取時,監控JOB發現多個節點同時使用,抽取速度劇增!

10.MS SQL SERVER中TEXT類型轉換
Datstage通過ODBC擷取MS SQL Server的資料時,將text類型欄位預設為Longvarchar,view data時出錯,將以在自訂SQL語句中使用convert將text轉化為varchar(4000),
並將欄位類型改為varchar,否則會出現錯誤:DSP.Open GCI $DSP.Open error -100.

11.DS抽取抽取Oracle資料時預設將空格轉換為NULL
Datastage 7.5.2.1中,DS中的Oracle Stage從Oracl抽取資料時,預設把空格轉換為NULL,即使將DS環境變數中的APT_ORACLE_PRESERVE_BLANKS設定為True也無濟於事。
經尋找,IBM官方認為這是個bug,建議升級打補丁.
補丁地址:http://www-01.ibm.com/support/docview.wss?rs=14&uid=swg1JR33670
打補丁之前,請備份DS的整個目錄,然後再打補丁!
我自己打補丁時,關閉了DS相關的所有進程,但是安裝提示有錯誤,讓去找系統管理員,但是查看/home/dsadm/Ascential/patches/patch_JR35216/log沒有發現錯誤。
安裝時的錯誤提示:
Upgrading the Stage ...
An error has occurred during DataStage initialization
Please contact the system administrator
Error code: 2   2
Done!
幸運的是重新啟動DS,一切正常,而且通過設定DS環境變數中的APT_ORACLE_PRESERVE_BLANKS,就可以控制空格向NULL的轉換了!
幸運是短暫的,打補丁之後,從ODBC抽取SQL Server資料的JOB報錯了,看樣子是因為補丁的問題!
錯誤資訊:
main_program: Fatal Error: Fatal: Shared library (drsenu.so) failed to load: errno = (2),
system message = (/home/dsadm/Ascential/DataStage/DSEngine/lib/drsenu.so: undefined symbol: DSCUVTextMark)
雖然打補丁之前有備份,恢複回去是沒有問題的,所以先想想辦法去解決的!
在網上找到了一個解決辦法,相同的錯誤,只是別人遇到的是$DSHOME/lib/dsdb2enu.so: undefined symbol: DSCUVTextMark,那就試一下的!
地址:http://www.docin.com/p-42820466.html
先備份$DSHOME/etc/operator.apt檔案,使用VI編輯該檔案,將dscapiop dscapiop 1修改為dscapiop @dscapiop 1,儲存退出!
關閉DS,重新啟動!不知道為什麼這麼幹!尋遍官方文檔都沒找到一點相關內容,網上給出的解決辦法,當前問題是解決了,但是依據是什麼呢?
會不會因此而產生其他的潛在問題?!
在這裡鄙視一下DS!

12.JOB排錯,開啟詳細日誌輸出
日誌提示有警告,可是不知道是哪個stage提示警告,那麼設定APT_DUMP_SCORE = TRUE,可以在log的警告資訊中看到stage名稱。
另外,還有一些選項用於log日誌輸出。
記憶體使用量情況,APT_PM_PLAYER_MEMORY = TRUE
CPU使用時間,APT_PM_PLAYER_TIMING = TRUE
資料幫浦條數,APT_RECORD_COUNTS = TRUE

13.DS效能調優
詳見官方文檔。
APT_DEFAULT_TRANSPORT_BLOCK_SIZE = 131072 改為 APT_DEFAULT_TRANSPORT_BLOCK_SIZE = 1048576
APT_BUFFER_MAXIMUM_MEMORY = 3145728 (3 MB) 改為 APT_BUFFER_MAXIMUM_MEMORY = 6291456 (6 MB)
APT_BUFFER_FREE_RUN = 0.5 改為 APT_BUFFER_FREE_RUN = 0.6

14.DS運行中發現的Oracle DB的問題
DS運行時,LOG日誌報錯,竟然都是TNS和ORA的錯誤,尤其是並行多個JOB時,有JOB失敗。
請尋求DBA協助,做資料庫的最佳化!

15.DS中對Oracle中特殊字元的處理(例如:# $)
DS_ENABLE_RESERVED_CHAR_CONVERT = TRUE 處理特殊字元#,$

16.Transformer stage中的substr功能
Transformer stage中的substr功能在抽取資料時,按字元對象截取字元,可是載入至目標庫時,是按位元組計算長度。
尤其是對含有中文的欄位截取時,有些中文字元的最後一個字元被截成了亂碼,在載入至目標表時報錯,
可以在/home/dsadm/Ascential/DataStage/Scratch檔案夾下bad檔案中找到出錯的資料條目。、
建議:
對於含有中文的欄位,目標表的欄位長度儘可能的與源表欄位長度一致。

17.從MS SQL Server 2005抽取資料至Oracle時,中文亂碼解決
NLS為GBK,view資料時正常,但是抽取至Oracle時,中文亂碼。
在Transformer中把中文欄位的extend都設定為unicode。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.