2016年8月24日水曜日

WIP Data Serverのエラーと再構成

トラブル対応のメモ書きです。
WIP(Web Infrastructture Platform) Data Serverが起動後にエラーを起こしていた事象にぶつかりました。sas.servers start だと問題なく起動できているように見えて、裏側ではエラーでていました。手掛かりないなか、同僚がPostgre DBの破損をみつけて復旧できました。

エラーのログは、/SAS/SAS_CONFIG/Lev1/WebInfrastructurePlatformDataServer/Logs/webinfdsvrc-日時.logあたりに出力されていました。

> WARNING:  could not write block 1530 of base/16384/8260301
>DETAIL:  Multiple failures --- write error might be permanent.
>ERROR:  xlog flush request 110/4CA5DF8C is not satisfied --- flushed only to 110/4C98BCE4
>CONTEXT:  writing block 1530 of relation base/16384/8260301

上のエラーメッセージは、「仕掛中トランザクションの物理ログ出力エラーと推測」とのことで、仕掛中トランザクションの物理ログを強制出力する、以下コマンドを実行して復旧しました。


/SAS/SAS_HOME/SASWebInfrastructurePlatformDataServer/9.4/bin/pg_resetxlog f /Lev1/WebInfrastructurePlatformDataServer/data

原因はSAS GridのCompute Nodeでサービスを起動したことらしい。これは私のオペミスだが、そもそもサービス起動/停止が壊れないような実装になっていて欲しい。

助かりました。

2016年8月15日月曜日

SAS University Edition

インストールしてみました、SAS University Edition。手間取ったのはPCのバイオスの設定ぐらいでした。BISOのメニューで、セキュリティの下にある仮想化のオプションをENABLEにするのに迷いました。のんびり使ってみます。


2016年8月7日日曜日

ローカルのサーバで、RPMのスコアリングを行う方法

デスクトップ版のEnterprise MinerとEnterprise GuideのRPMの組合せですが、スコアリングは、Metadata Serverに接続しないとできない仕様になっています。わざわざ筆を持ち換えて、Enterprise Minerに移るのは面倒です。

そんなときは、コードタスクでスコアのデータセット名を書き換えればスコアリングできます。RPMの「前回実行したコード」を表示してコードタスクにコピーして、SCORE=とSCOREOUT=の部分を書き換えます。

  1. %EM_RPM(  
  2.  FLOW=INTERMEDIATE,   
  3.  PROJPATH=%NRBQUOTE(C:\Temp\RPM),  
  4.  PROJNAME=%NRBQUOTE(RPM),  
  5.  TASKID=efb7cb31-d183-4282-81d6-d938435074fd,  
  6.  DATA=&em_traindata,   
  7.  VARIABLEDELTA=&em_vardelta,   
  8.  TARGETLEVEL=,  
  9.     DECDATA=&em_decdata,   
  10.     PRIOR=NONE,   
  11.     DECISION=INVERSE,   
  12.     EVENT=%NRBQUOTE()  
  13.     ,  
  14.     SCORE=WORK.TEST,  
  15.     SCOREOUT=WORK.SCORED_TEST  
  16.     );              

ERROR: トランスコード時に文字データが一部損失しました。

文字のエンコーディングで良くあるエラーですが、改めて問題を定義します。このエラーは、異なるエンコーディングへ文字が変換できなかったときに発生します。

理解を深めるために、具体的にエラーを引き起こすコードを示します。このコードはEUCのテキストファイルをわざとUTF-8で読み取ってデータセット化し、SJISのエンコーディングで保存しています。
  1. data data1(encoding='utf-8');  
  2.  length name $16;  
  3.  input name;  
  4.  cards;  
  5. 与太郎  
  6. 助六  
  7. 正蔵  
  8. 円楽  
  9. 八雲  
  10. ;;  
  11. run;  
  12.   
  13. data _null_;  
  14.  set data1;  
  15.  file 'c:\temp\euc.txt' encoding='jeuc';  
  16.  put name;  
  17. run;  
  18.   
  19. data data2(encoding='utf-8');  
  20.  infile 'c:\temp\euc.txt' encoding='jeuc';  
  21.  length name $16;  
  22.  input name;  
  23. run;  
  24.   
  25. data data3(encoding='utf-8');  
  26.  infile 'c:\temp\euc.txt' encoding='utf-8';  
  27.  length name $16;  
  28.  input name;  
  29. run;  
  30.   
  31. data data4(encoding='sjis');  
  32.  set data3(encoding='utf-8');  
  33. run;  
エラーは、SJISのデータセットを出力するときに発生します。
  1. 362  data data1(encoding='utf-8');  
  2. 363      length name $16;  
  3. 364      input name;  
  4. 365      cards;  
  5.   
  6. NOTE: データセットWORK.DATA1は5オブザベーション、1変数です。  
  7. NOTE: DATAステートメント処理(合計処理時間):  
  8.       処理時間           0.03 秒  
  9.       CPU時間            0.01 秒  
  10.   
  11.   
  12. 371  ;;  
  13. 372  run;  
  14. 373  
  15. 374  data _null_;  
  16. 375      set data1;  
  17. 376      file 'c:\temp\euc.txt' encoding='jeuc';  
  18. 377      put name;  
  19. 378  run;  
  20.   
  21. NOTE: 出力ファイル'c:\temp\euc.txt' :  
  22.       ファイル名=c:\temp\euc.txt,  
  23.       レコードフォーマット=V,  
  24.       論理レコード長=65534,  
  25.       ファイルサイズ (バイト)=0,  
  26.       更新日時=20160807日 132831秒,  
  27.       作成日時=20160807日 130649秒  
  28.   
  29. NOTE: 5レコードを出力ファイル'c:\temp\euc.txt'に書き込みました。  
  30.       最小レコード長は6です。  
  31.       最大レコード長は9です。  
  32. NOTE: データセットWORK.DATA1から5オブザベーションを読み込みました。  
  33. NOTE: DATAステートメント処理(合計処理時間):  
  34.       処理時間           0.01 秒  
  35.       CPU時間            0.01 秒  
  36.   
  37.   
  38. 379  
  39. 380  data data2(encoding='utf-8');  
  40. 381      infile 'c:\temp\euc.txt' encoding='jeuc';  
  41. 382      length name $16;  
  42. 383      input name;  
  43. 384  run;  
  44.   
  45. NOTE: 入力ファイル'c:\temp\euc.txt' :  
  46.       ファイル名=c:\temp\euc.txt,  
  47.       レコードフォーマット=V,  
  48.       論理レコード長=65534,  
  49.       ファイルサイズ (バイト)=32,  
  50.       更新日時=20160807日 132831秒,  
  51.       作成日時=20160807日 130649秒  
  52.   
  53. NOTE: 5レコードを入力ファイル'c:\temp\euc.txt'から読み込みました。  
  54.       最小レコード長は6です。  
  55.       最大レコード長は9です。  
  56. NOTE: データセットWORK.DATA2は5オブザベーション、1変数です。  
  57. NOTE: DATAステートメント処理(合計処理時間):  
  58.       処理時間           0.01 秒  
  59.       CPU時間            0.01 秒  
  60.   
  61.   
  62. 385  
  63. 386  data data3(encoding='utf-8');  
  64. 387      infile 'c:\temp\euc.txt' encoding='utf-8';  
  65. 388      length name $16;  
  66. 389      input name;  
  67. 390  run;  
  68.   
  69. NOTE: 入力ファイル'c:\temp\euc.txt' :  
  70.       ファイル名=c:\temp\euc.txt,  
  71.       レコードフォーマット=V,  
  72.       論理レコード長=131068,  
  73.       ファイルサイズ (バイト)=32,  
  74.       更新日時=20160807日 132831秒,  
  75.       作成日時=20160807日 130649秒  
  76.   
  77. NOTE: 5レコードを入力ファイル'c:\temp\euc.txt'から読み込みました。  
  78.       最小レコード長は4です。  
  79.       最大レコード長は6です。  
  80. NOTE: データセットWORK.DATA3は5オブザベーション、1変数です。  
  81. NOTE: DATAステートメント処理(合計処理時間):  
  82.       処理時間           0.03 秒  
  83.       CPU時間            0.01 秒  
  84.   
  85.   
  86. 391  
  87. 392  data data4(encoding='sjis');  
  88. 393      set data3(encoding='utf-8');  
  89. 394  run;  
  90.   
  91. NOTE: データファイルWORK.DATA4.DATAは別なホストにネイティブな形式が使用  
  92.       されているか、またはエンコーディングがセッションエンコーディ  
  93.       ングと一致していません。クロス環境データアクセスが使用される  
  94.       ため、追加のCPUリソースが必要となり、パフォーマンスが低下しま  
  95.       す。  
  96. ERROR: データセットWORK.DATA4のトランスコード時に文字データが一部損失  
  97.        しました。新しいエンコーディングで表せない文字がデータに含ま  
  98.        れていたか、またはトランスコード時に切り捨てが発生しました。  
  99.   
  100. NOTE: DATAステップは異常終了しました。  
  101. NOTE: エラーが発生したため、このステップの処理を中止しました。  
  102. NOTE: データセットWORK.DATA3から3オブザベーションを読み込みました。  
  103. WARNING: データセットWORK.DATA4は未完成です。このステップは、  
  104.          2オブザベーション、1変数で停止しました。  
  105. WARNING: このステップを中止したため、データセットWORK.DATA4を置き換えて  
  106.          いません。  
  107. NOTE: DATAステートメント処理(合計処理時間):  
  108.       処理時間           0.03 秒  
  109.       CPU時間            0.01 秒  

work.data3は以下のように文字化けしています。EUCのファイルをUTF-8で読み込んだときに文字化けを起こしています。これをSJISで保存しようとしてエラーになっています。


今回、仕事ではまったのが、SASのインストール、構成において途中でエンコーディングの設定を変えてこのエラーにぶつかりました。しかも、文字化けして格納されたのがPostgreのデータベースの中でした。ログファイルや、データセットの中を見ても見つからずにSOURCE, MPRINTで元データを探しまわり時間を費やしました。

教訓ですが、SASをインストした後にエンコーディングを変えてから、構成しましょう。SAS Environment Managerの設定で時間が掛かったのは、このエラーのためです。

2016年8月3日水曜日

SAS Metadata API

調べ物のメモです。
メターデータのAPIを使うと、ユーザのDescriptionやメールアドレスを設定できます。

rc = metadata_setattr("omsobj:Person?@Name='ogawan'","Desc", "hogehoge");