[PostgreSQL, Greenplum] 설치된 Packages, Docker Container Image, PL/Container Runtime ID 확인하는 PL/Python 사용자정의함수
Greenplum and PostgreSQL Database 2023. 4. 30. 22:56이번 포스팅에서는 Python의 popen() 메소드와 PL/Python 사용자 정의 함수를 사용하여
(1) Python 의 popen() 메소드 소개
(2) Greenplum DB에 설치된 Package 이름 리스트 확인
(3) Greenplum DB에 설치된 Docker Container Image 리스트 확인
(4) Greenplum DB에 등록된 PL/Container Runtime ID 확인
하는 방법을 소개하겠습니다.
(1) Python 의 popen() 메소드 소개
Python 메서드 popen() 은 시스템 명령어(command) 실행 결과를 가져올 때 사용합니다. popen() 메소드의 반환 값은 파이프에 연결된 열린 파일 객체이며, 모드가 'r'(기본값) 이면 읽기모드이고, 'w' 이면 쓰기모드입니다. Buffering 크기도 정수로 설정할 수 있습니다.
아래 예시는 Python의 os.popen() 메소드를 사용해 'ifconfig' command 를 실행하여 IP 주소를 확인해본 것입니다.
import os
ifconfig = os.popen('ifconfig')
ifconfig_info = ifconfig.read()
ifconfig.close()
print(ifconfig_info)
# lo0: flags=xxxx<UP,LOOPBACK,...
# options=xxxx<RXCSUM,TXCSUM,...
# inet xxxxxxx netmask 0xff000000
# inet6 ::xx prefixlen xxx
# inet6 fe80::xxxx prefixlen xx scopeid xx
# nd6 options=xxx<PERFORMNUD,DAD>
# gif0: flags=xxx<POINTOPOINT,MULTICAST> mtu 1280
# stf0: flags=0<> mtu xxxx
# en5: flags=xxx<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
# ether ac:de:48:00:11:22
# inet6 fe80::aede:48ff:fe00:1122%en5 prefixlen xx scopeid 0x4
# nd6 options=xxx<PERFORMNUD,DAD>
# media: autoselect (100baseTX <full-duplex>)
# status: active
# ap1: flags=xxxx<BROADCAST,SIMPLEX,MULTICAST> mtu xxxx
# options=xxx<CHANNEL_IO>
# ether aa:66:5a:20:77:d2
# media: autoselect
# ...
(2) Greenplum DB에 설치된 Package 이름 리스트 확인
아래 코드는 os.popen() 메소드로 'gppkg -q --all' 시스템 명령어(command)를 실행해서 Greenplum DB 에 설치된 Package 이름 리스트를 확인하는 PL/Python 사용자 정의 함수입니다. split() 후에 7번째 위치 이후의 값만 가져오면 됩니다.
--- UDF for getting all package's list on Greenplum DB
DROP FUNCTION IF EXISTS plpy_gppkg_info_func();
CREATE OR REPLACE FUNCTION plpy_gppkg_info_func()
RETURNS TABLE (LIST text)
AS $$
import os
process = os.popen('gppkg -q --all')
processed = process.read()
process.close()
# get only packages names
result = processed.split()[7:]
return result
$$ LANGUAGE 'plpythonu';
-- Run the UDF above
SELECT plpy_gppkg_info_func() AS gppkg_info;
--gppkg_info |
------------------------------------------+
--DataSciencePython-2.0.5 |
--DataScienceR-2.0.2 |
--plr-3.0.4 |
--plcontainer-2.1.5 |
--pivotal_greenplum_backup_restore-1.25.0 |
--madlib-1.20.0_1 |
(3) Greenplum DB에 설치된 Docker Container Image 리스트 확인
아래 코드는 os.popen() 메소드로 'plcontainer image-list' 시스템 명령어(command)를 실행해서 Greenplum DB 에 설치된 Docker Container Image 이름 리스트를 확인하는 PL/Python 사용자 정의 함수입니다. 줄바꿈 '\n' 구분자로 split() 하여서 결과값을 반환받았습니다.
---- UDF for displaying the installed Docker images on the local host use
DROP FUNCTION IF EXISTS plpy_container_imagelist_func();
CREATE OR REPLACE FUNCTION plpy_container_imagelist_func()
RETURNS TABLE (LIST text)
AS $$
import os
processed = os.popen('plcontainer image-list').read().split('\n')
return processed
$$ LANGUAGE 'plpythonu';
-- Run the UDF above
SELECT plpy_container_imagelist_func() AS container_image_info;
--container_image_info |
------------------------------------------------------------------------------------------+
--REPOSITORY TAG IMAGE ID CREATED SIZE |
--pivotaldata/plcontainer_python3_shared devel e4cda7f63158 20 months ago 6.71GB|
--pivotaldata/plcontainer_r_shared devel 3a2472dec133 3 years ago 1.19GB|
--pivotaldata/plcontainer_python_shared devel c94546182146 3 years ago 2.34GB|
-- |
(4) Greenplum DB에 등록된 PL/Container Runtime ID 확인
아래 코드는 os.popen() 메소드로 'plcontainer runtime-show' 시스템 명령어(command)를 실행해서 Greenplum DB 에 등록된 PL/Container Runtime ID 리스트를 확인하는 PL/Python 사용자 정의 함수입니다.
'plcontainer runtime-add -r plc_python3_shared -i' 이런식으로 Docker Container Image 정보를 PL/Container configuration file 에 추가 등록해준 정보를 'plcontainer runtime-show' 로 확인할 수 있습니다.
----- UDF for listing the names of the runtimes you created and added to the PL/Container XML file.
DROP FUNCTION IF EXISTS plpy_container_runtimeshow_func();
CREATE OR REPLACE FUNCTION plpy_container_runtimeshow_func()
RETURNS TABLE (LIST text)
AS $$
import os
processed = os.popen('plcontainer runtime-show').read().split('\n')
return processed
$$ LANGUAGE 'plpythonu';
-- Run the UDF above
SELECT plpy_container_runtimeshow_func() AS container_runtimeshow_info;
--PL/Container Runtime Configuration:
-----------------------------------------------------------
-- Runtime ID: plc_python3_shared
-- Linked Docker Image: pivotaldata/plcontainer_python3_shared:devel
-- Runtime Setting(s):
-- Shared Directory:
-- ---- Shared Directory From HOST '/usr/local/greenplum-db-6.22.1/bin/plcontainer_clients' to Container '/clientdir', access mode is 'ro'
-----------------------------------------------------------
--
-----------------------------------------------------------
-- Runtime ID: plc_r_shared
-- Linked Docker Image: pivotaldata/plcontainer_r_shared:devel
-- Runtime Setting(s):
-- Shared Directory:
-- ---- Shared Directory From HOST '/usr/local/greenplum-db-6.22.1/bin/plcontainer_clients' to Container '/clientdir', access mode is 'ro'
-----------------------------------------------------------
--
-----------------------------------------------------------
-- Runtime ID: plc_python_shared
-- Linked Docker Image: pivotaldata/plcontainer_python_shared:devel
-- Runtime Setting(s):
-- Shared Directory:
-- ---- Shared Directory From HOST '/usr/local/greenplum-db-6.22.1/bin/plcontainer_clients' to Container '/clientdir', access mode is 'ro'
-----------------------------------------------------------
이번 포스팅이 많은 도움이 되었기를 바랍니다.
행복한 데이터 과학자 되세요!