프로그램 관련/빅데이터(BigData)
Vertica ROS Container 관련 오류 및 설정
SeoHW
2018. 9. 20. 15:56
반응형
Vertica ROS Container 관련 오류 및 설정
java.sql.SQLTransientException: [Vertica][VJDBC](5065) ERROR: Too many ROS containers exist for the following projections:
public.DATASET_TABLE_super (limit = 11264, ROS files = 11264, DV files = 0, new files = 11)
at com.vertica.util.ServerErrorData.buildException(Unknown Source)
at com.vertica.dataengine.VQueryExecutor.readCopyStartResponse(Unknown Source)
at com.vertica.dataengine.VQueryExecutor.handleExecuteResponse(Unknown Source)
at com.vertica.dataengine.VQueryExecutor.execute(Unknown Source)
at com.vertica.jdbc.VerticaCopyStream.execute(Unknown Source)
Caused by: com.vertica.support.exceptions.TransientException: [Vertica][VJDBC](5065) ERROR: Too many ROS containers exist for the following projections:
public.DATASET_TABLE_super (limit = 11264, ROS files = 11264, DV files = 0, new files = 11)
Vertica에서 COPY 방식으로 데이터를 로드 할경우 ROS(Read Optimized Store - On Disk) 에 직접 데이터를 저장합니다.
Direct 입력시에 ROS Container가 생성되며, 해당 Container에 데이터를 로드합니다.
이 과정에서 Batch size 건수를 설정하면, 하나의 ROS Container에 설정한 Batch 건수 만큼만 저장을 합니다.
Batch size 수를 너무 적게 설정할 경우, ROS Container가 무분별하게 많이 생길 수 있습니다.
예를 들어,
1,000,000 만건의 로우를 COPY 할때 Batch size 100개로 설정하면, 1,000,000/100 = 10,000개의 ROS Container를 생성하게 됩니다.
# 특정 테이블의 ROS Container 조회
dbadmin=> select * from STORAGE_CONTAINERS where projection_name like '%DATASET_TABLE%';
-[ RECORD 1 ]-------+-------------------------------------------------
node_name | v_vmartdb_node0001
schema_name | public
projection_id | 45035996273822238
projection_name | DATASET_TABLE_super
storage_type | ROS
storage_oid | 45035996275015557
sal_storage_id | 02dff9215fa3b060135119b5ff6210ba00a000000013ff85
total_row_count | 100 << 저장된 로우 건수
deleted_row_count | 0
used_bytes | 2394
start_epoch | 39779
end_epoch | 39779
grouping | PROJECTION
segment_lower_bound | 0
segment_upper_bound | 4294967295
is_sorted | t
location_label |
delete_vector_count | 0
대량 데이터에 대해 Batch size를 너무 적게 지정한 경우, ContainersPerProjectionLimit 파라메터 설정값에 따라서 ROS Container 수가 초과될 경우 위와 같은 에러가 발생합니다.
대량의 데이터를 COPY Load 할때 Batch size를 지정할 경우에는 10,000건 이상 설정해가며 맞춰가는게 좋을것 같습니다.
ROS Container(ContainersPerProjectionLimit) 파라메터 값은 기본 1024개로 설정이 되어 있습니다.
# ContainersPerProjectionLimit 설정값 조회
SELECT *
FROM CONFIGURATION_PARAMETERS
WHERE parameter_name = 'ContainersPerProjectionLimit' ;
-[ RECORD 1 ]-----------------+---------------------------------------------------------------------------------------
node_name | ALL
parameter_name | ContainersPerProjectionLimit
current_value | 1024
restart_value | 1024
database_value | 1024
default_value | 1024
current_level | DEFAULT
restart_level | DEFAULT
is_mismatch | f
groups |
allowed_levels | NODE, DATABASE
superuser_only | f
change_under_support_guidance | t
change_requires_restart | f
description | Number of ROS containers that are allowed before new ROSs are prevented (ROS pushback)
# ContainersPerProjectionLimit 설정값 변경
SELECT SET_CONFIG_PARAMETER('ContainersPerProjectionLimit', 2048);
# 1초 간격으로 ROS Container 건수 증가량 조회
[dbadmin@dw ~]$ while true; do vsql -d Database -w password -At -c "select count(*) from STORAGE_CONTAINERS where projection_name like '%DATASET_TABLE%';"; sleep 1; done;
16
.
.
.
964
978
988
1002
1016
1024 -- 1024개가 되는 시점에 에러가 발생 (ERROR: Too many ROS containers exist)
여기서 발생할 수 있는 예외적인 상황은,
ROS Container 기본 설정 건수에 도달 하기전에 Tuple Mover가 Mergeout을 진행 한다면 ROS Container 수가 줄어들기 때문에, 우연히 에러를 피해 갈 수도 있습니다.
Mergeout은 여러개로 생성된 ROS Containers의 데이터를 소수의 ROS Container로 합치고 줄이는 작업을 합니다.
Mergeout의 기본 수행 주기는 600초(10분)입니다.
# MoveOut, MergeOut Interval 파라메터 정보 조회
SELECT *
FROM CONFIGURATION_PARAMETERS
WHERE parameter_name IN('MoveOutInterval', 'MergeOutInterval');
-[ RECORD 1 ]-----------------+-----------------------------------------------------------------------
node_name | ALL
parameter_name | MoveOutInterval
current_value | 300
restart_value | 300
database_value | 300
default_value | 300
current_level | DEFAULT
restart_level | DEFAULT
is_mismatch | f
groups |
allowed_levels | NODE, DATABASE
superuser_only | f
change_under_support_guidance | f
change_requires_restart | f
description | Interval between Tuple Mover checks for moveouts to perform (seconds)
-[ RECORD 2 ]-----------------+-----------------------------------------------------------------------
node_name | ALL
parameter_name | MergeOutInterval
current_value | 600
restart_value | 600
database_value | 600
default_value | 600
current_level | DEFAULT
restart_level | DEFAULT
is_mismatch | f
groups |
allowed_levels | NODE, DATABASE
superuser_only | f
change_under_support_guidance | f
change_requires_restart | f
description | Interval between Tuple Mover checks for mergeouts to perform (seconds)
# MoveOut, MergeOut Interval 설정값 조회
dbadmin=> SELECT GET_CONFIG_PARAMETER('MoveOutInterval');
GET_CONFIG_PARAMETER
----------------------
300
(1 row)
dbadmin=> SELECT GET_CONFIG_PARAMETER('MergeOutInterval');
GET_CONFIG_PARAMETER
----------------------
600
(1 row)
# MoveOut, MergeOut Interval 설정 변경
dbadmin=> SELECT SET_CONFIG_PARAMETER('MoveOutInterval', 60);
SET_CONFIG_PARAMETER
----------------------------
Parameter set successfully
(1 row)
dbadmin=> SELECT SET_CONFIG_PARAMETER('MergeOutInterval', 30);
SET_CONFIG_PARAMETER
----------------------------
Parameter set successfully
(1 row)
> ALTER 설정 동일 결과
ALTER DATABASE mydb SET MoveOutInterval = 60;
ALTER DATABASE mydb SET MergeOutInterval = 30;
반응형