일반적으로 사용하는, Shell(/bin/bash) 스크립트를 이용해서 Rscript 를 실행하는 방식에는 R의 처리 로직에서 발생하는 에러와 여러 상황에 대해 제어하는게 제한적입니다.
R의 처리 로직을 수월하게 제어하기 위해서, Rscript를 직접 실행하고 Rscript 내에서 R의 로직을 처리하는 방법이 있습니다.


# Shell 스크립트에서 Rscript 실행

#!/bin/bash

start_date=()
start_date_sec=()

if [ "$1" == "" ]; then
        echo "Invalid argument."
        echo "foamrt : [start date(YYYY-mm-dd)] [date count] [sleep time(sec)]"
        exit 1
fi

echo "start date : $1"
echo "date count : $2"
echo "sleep time : $3"

DATE="$1"
for ((i=0; i<$2; i++)); do
        NEXT_DATE1=$(date +"%Y%m%d" -d "$DATE + $i day")
        NEXT_DATE2=$(date +"%Y-%m-%d" -d "$DATE + $i day")

        start_date[$i]="$NEXT_DATE1"
        start_date_sec[$i]="$NEXT_DATE2"
done

echo "--- start_date list ---"
for ((i=0; i<$2; i++)); do
        echo "${start_date[$i]}"
done

read -p "continue [y/n]" yn
if [ $yn != "y" ]; then
        exit 1
fi

echo "--- start_date_sec list ---"
for ((i=0; i<$2; i++)); do
        echo "${start_date_sec[$i]}"
done

read -p "continue [y/n]" yn
if [ $yn != "y" ]; then
        exit 1
fi

# Execut Rscript
for ((i=0; i<$2; i++)); do
        STARTTIME=$(date +%s)

        Rscript test_rscript.r "${start_date_sec[$i]}" "${colct_anals_nm}" "${colct_a
nals_trget_date[$i]}" "${module_no}" "${module_nm}" "${hdfs_path}" "${instt_code}"


        echo "sleep.... $3"
        sleep $3

        ENDTIME=$(date +%s)
        echo "Working Time : $(($ENDTIME - $STARTTIME))sec."
        echo "Remaining Time : $((($ENDTIME - $STARTTIME) * ($2 - $i + 1) / 60 / 60)) hour"
        echo ""
done


# Rscript 를 실행하고, Rscript 내에서 R 로직 처리

> test_rscript.R 파일 내용
#!/usr/bin/Rscript
# 상단 Rscript 정의 부분

# 인자값을 받기 위해 arguments 정의
argv <- commandArgs(TRUE)
startDate <- as.Date.character(argv[1]) # 시작일자
dateCount <- as.numeric(argv[2]) # 시작일로부터 진행할 날의 수
sleepTime <- as.numeric(argv[3]) # 하나의 작업 종료후 대기 시간(초 단위)

# argument 입력값 출력
print("--------------------------------------")
print(paste("Start date : ", startDate))
print(paste("Date count : ", dateCount))
print(paste("Sleep time : ", sleepTime))
print("--------------------------------------")

# 진행일자를 담을 [리스트] 변수 초기화
start_date_list <- list()
start_date_sec_list <- list()

# dateCount 수만큼의 일자 리스트를 생성
DATE <- startDate
for(i in 1:dateCount){
    tmpI <- as.integer(ifelse(i==1, 0, i-1)) # i변수값 대입
    start_date_list[i] <- paste0((format(as.Date(DATE+tmpI), format="%Y%m%d"))) # yyyyMMdd 포맷으로 변환및 저장
    start_date_sec_list[i] <- paste0((format(as.Date(DATE+tmpI), format="%Y-%m-%d"))) # yyyy-MM-dd 포멧으로 변환및 저장
}

# 1) yyyyMMdd 형식의 일자 출력
for(i in start_date_list){
    print(i)
}

# 1) 사용자, 진행여부 입력
cat("continue [y/n] :")
is_yn <- readLines(con="stdin", 1)
if(is_yn != "y"){
    stop(paste("'", is_yn, "' is No Continue~!", sep=""))
}

# 2) yyyy-MM-dd 형식의 일자 출력
for(i in start_date_sec_list){
    print(i)
} 

# 2) 사용자, 진행여부 입력
cat("continue [y/n] :")
is_yn <- readLines(con="stdin", 1)
if(is_yn != "y"){
    stop(paste("'", is_yn, "' is No Continue~!", sep=""))
}  


if(!is.na(startDate) && !is.na(dateCount)){
    # 1) 오류 카운트
    error_count <- 0
    finally_error_count <- 0
    
    # loop 변수 초기화
    i <- 1
    while(i <= dateCount){
        is_error <- FALSE # Finally에서 Main Error 체크를 위해 사용
        
        tryCatch({
            # 서브 스크립트에서 사용될 변수에 값 대입(character Type)
            start_date <- as.character(start_date_list[i])
            start_date_sec <- as.character(start_date_sec_list[i])
            
            # 포함될 R 스크립트 정의부분
            # -------------------------------------
            print(start_date_sec)
            # source("test_rscript.r") # r스크립트 로드
            # -------------------------------------
            i <- i + 1 # i값 증가
            
            # 2) 오류 카운트값 초기화
            error_count <- 0 
            finally_error_count <- 0
            
            Sys.sleep(ifelse(!is.na(sleepTime), sleepTime, 5)) # 대기시간, 기본 5초
        }, error = function(x) { 
            error_count <<- error_count + 1 # Error Count값 증가
            message("###############################################")
            message(paste("### Error >>", x))
            message(paste("### Error Count >>", error_count))
            message(paste("### Try again colct_anals_trget_date >>", start_date_sec_list[i]))
            message("###############################################")
            i <- i - 1 # Error 발생시 재시작을 위해 i값 감소
            # Sys.sleep(ifelse(!is.na(againTime), againTime, 30)) # 오류 발생후 재시도 대기 시간
            is_error <- TRUE
        }, finally = {
            tryCatch({
                # DB 연결 종료및 작업파일 처리
                
                # dbDisconnect(conn) # RDBMS
                # rhive.close() # Hive
            }, error=function(e){
                if(!is_error){
                    finally_error_count <<- finally_error_count + 1 # Error Count값 증가
                    message("###############################################")
                    message(paste("### Error >>", e))
                    message(paste("### Finally Error Count >>", finally_error_count))
                    message(paste("### Finally - Try again colct_anals_trget_date >>", start_date_sec_list[i]))
                    message("###############################################")
                    Sys.sleep(5)
                }
            }) # Finally - tryCatch End
        }) # Main - tryCatch End
    } # Loop End
    
    print(paste("### Success All jobs ###"))
}else{ # 스크립트 실행시 인자값 없을경우
    print("Invalid argument.")
    print("foamrt : [Start date(YYYY-mm-dd)] [Date count] [Sleep time(sec)]")
}


# Rscript 실행
[hdfs@rserver ~]$ ./test_rscript.R 2016-02-01 5 1
[1] "--------------------------------------"
[1] "Start date :  2016-02-01"
[1] "Date count :  5"
[1] "Sleep time :  1"

[1] "--------------------------------------"
[1] "20160201"
[1] "20160202"
[1] "20160203"
[1] "20160204"
[1] "20160205"
continue [y/n] :y
[1] "2016-02-01"
[1] "2016-02-02"
[1] "2016-02-03"
[1] "2016-02-04"
[1] "2016-02-05"
continue [y/n] :y
--------- Loop Start ---------------
[1] "20160201"
[1] "20160202"
[1] "20160203"
[1] "20160204"
[1] "20160205"
--------- Loop End ---------------




※ 위 내용은, 여러 자료를 참고하거나 제가 주관적으로 정리한 것입니다.
   잘못된 정보나 보완이 필요한 부분을, 댓글 또는 메일로 보내주시면 많은 도움이 되겠습니다.
02 21, 2016 11:37 02 21, 2016 11:37


Trackback URL : http://develop.sunshiny.co.kr/trackback/1051

Leave a comment

« Previous : 1 : ... 4 : 5 : 6 : 7 : 8 : 9 : 10 : 11 : 12 : ... 648 : Next »

Recent Posts

  1. HDFS - Python Encoding 오류 처리
  2. HP - Vertica ROS Container 관련 오류...
  3. HDFS - Hive 실행시 System Time 오류
  4. HP - Vertica 사용자 쿼리 이력 테이블...
  5. Client에서 HDFS 환경의 데이터 처리시...

Recent Comments

  1. 안녕하세요^^ 배그핵
  2. 안녕하세요^^ 도움이 되셨다니, 저... sunshiny
  3. 정말 큰 도움이 되었습니다.. 감사합... 사랑은
  4. 네, 안녕하세요. 댓글 남겨 주셔서... sunshiny
  5. 감사합니다 많은 도움 되었습니다!ㅎㅎ 프리시퀸스

Recent Trackbacks

  1. prefab steel buildings prefab steel buildings %M
  2. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   09 2019   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. 오라클 클럽
  4. API - Java
  5. Apache Hadoop API
  6. Apache Software Foundation
  7. HDFS 생태계 솔루션
  8. DNSBL - Spam Database Lookup
  9. Ready System
  10. Solaris Freeware
  11. Linux-Site
  12. 윈디하나의 솔라나라

Site Stats

TOTAL 2683570 HIT
TODAY 404 HIT
YESTERDAY 438 HIT