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=の部分を書き換えます。

%EM_RPM(
 FLOW=INTERMEDIATE, 
 PROJPATH=%NRBQUOTE(C:\Temp\RPM),
 PROJNAME=%NRBQUOTE(RPM),
 TASKID=efb7cb31-d183-4282-81d6-d938435074fd,
 DATA=&em_traindata, 
 VARIABLEDELTA=&em_vardelta, 
 TARGETLEVEL=,
    DECDATA=&em_decdata, 
    PRIOR=NONE, 
    DECISION=INVERSE, 
    EVENT=%NRBQUOTE()
    ,
    SCORE=WORK.TEST,
    SCOREOUT=WORK.SCORED_TEST
    );            

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

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

理解を深めるために、具体的にエラーを引き起こすコードを示します。このコードはEUCのテキストファイルをわざとUTF-8で読み取ってデータセット化し、SJISのエンコーディングで保存しています。
data data1(encoding='utf-8');
 length name $16;
 input name;
 cards;
与太郎
助六
正蔵
円楽
八雲
;;
run;

data _null_;
 set data1;
 file 'c:\temp\euc.txt' encoding='jeuc';
 put name;
run;

data data2(encoding='utf-8');
 infile 'c:\temp\euc.txt' encoding='jeuc';
 length name $16;
 input name;
run;

data data3(encoding='utf-8');
 infile 'c:\temp\euc.txt' encoding='utf-8';
 length name $16;
 input name;
run;

data data4(encoding='sjis');
 set data3(encoding='utf-8');
run;

エラーは、SJISのデータセットを出力するときに発生します。
362  data data1(encoding='utf-8');
363      length name $16;
364      input name;
365      cards;

NOTE: データセットWORK.DATA1は5オブザベーション、1変数です。
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.03 秒
      CPU時間            0.01 秒


371  ;;
372  run;
373
374  data _null_;
375      set data1;
376      file 'c:\temp\euc.txt' encoding='jeuc';
377      put name;
378  run;

NOTE: 出力ファイル'c:\temp\euc.txt' :
      ファイル名=c:\temp\euc.txt,
      レコードフォーマット=V,
      論理レコード長=65534,
      ファイルサイズ (バイト)=0,
      更新日時=2016年08月07日 13時28分31秒,
      作成日時=2016年08月07日 13時06分49秒

NOTE: 5レコードを出力ファイル'c:\temp\euc.txt'に書き込みました。
      最小レコード長は6です。
      最大レコード長は9です。
NOTE: データセットWORK.DATA1から5オブザベーションを読み込みました。
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.01 秒


379
380  data data2(encoding='utf-8');
381      infile 'c:\temp\euc.txt' encoding='jeuc';
382      length name $16;
383      input name;
384  run;

NOTE: 入力ファイル'c:\temp\euc.txt' :
      ファイル名=c:\temp\euc.txt,
      レコードフォーマット=V,
      論理レコード長=65534,
      ファイルサイズ (バイト)=32,
      更新日時=2016年08月07日 13時28分31秒,
      作成日時=2016年08月07日 13時06分49秒

NOTE: 5レコードを入力ファイル'c:\temp\euc.txt'から読み込みました。
      最小レコード長は6です。
      最大レコード長は9です。
NOTE: データセットWORK.DATA2は5オブザベーション、1変数です。
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.01 秒
      CPU時間            0.01 秒


385
386  data data3(encoding='utf-8');
387      infile 'c:\temp\euc.txt' encoding='utf-8';
388      length name $16;
389      input name;
390  run;

NOTE: 入力ファイル'c:\temp\euc.txt' :
      ファイル名=c:\temp\euc.txt,
      レコードフォーマット=V,
      論理レコード長=131068,
      ファイルサイズ (バイト)=32,
      更新日時=2016年08月07日 13時28分31秒,
      作成日時=2016年08月07日 13時06分49秒

NOTE: 5レコードを入力ファイル'c:\temp\euc.txt'から読み込みました。
      最小レコード長は4です。
      最大レコード長は6です。
NOTE: データセットWORK.DATA3は5オブザベーション、1変数です。
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.03 秒
      CPU時間            0.01 秒


391
392  data data4(encoding='sjis');
393      set data3(encoding='utf-8');
394  run;

NOTE: データファイルWORK.DATA4.DATAは別なホストにネイティブな形式が使用
      されているか、またはエンコーディングがセッションエンコーディ
      ングと一致していません。クロス環境データアクセスが使用される
      ため、追加のCPUリソースが必要となり、パフォーマンスが低下しま
      す。
ERROR: データセットWORK.DATA4のトランスコード時に文字データが一部損失
       しました。新しいエンコーディングで表せない文字がデータに含ま
       れていたか、またはトランスコード時に切り捨てが発生しました。

NOTE: DATAステップは異常終了しました。
NOTE: エラーが発生したため、このステップの処理を中止しました。
NOTE: データセットWORK.DATA3から3オブザベーションを読み込みました。
WARNING: データセットWORK.DATA4は未完成です。このステップは、
         2オブザベーション、1変数で停止しました。
WARNING: このステップを中止したため、データセットWORK.DATA4を置き換えて
         いません。
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.03 秒
      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");