일반적으로 사용하는, 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. Article writing is also a exciteme... 레깅스룸 02 16,
  2. I like reading an article that can... 부산고구려 02 16,
  3. Asking questions are truly nice th... 해운대룸싸롱 02 15,
  4. Pretty! This was an extremely wond... 분당셔츠룸 02 15,
  5. Wonderful beat ! I would like to a... 레깅스룸가격 02 14,

Recent Trackbacks

  1. london relocation ltd london relocation ltd 16 02
  2. extract your knowledge extract your knowledge 16 02
  3. dog cart dog cart 15 02
  4. This Site This Site 15 02
  5. massive action massive action 15 02

Calendar

«   02 2020   »
            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

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 2846534 HIT
TODAY 96 HIT
YESTERDAY 544 HIT