데이터 크기가 작다면 Python이나 R로 데이터를 로딩해서 직접 동일 간격 구간별 집계를 한다든지, 변수별 히스토그램이나 박스 그래프, 막대그래프를 그릴 수 있을 것입니다. 하지만 데이터 크기가 로컬 컴퓨터의 메모리 한계를 벗어날 정도로 크다면 그때는 DB에서 SQL로 집계를 한 후, 집계 결과만을 Python이나 R로 가져와서 시각화를 하는 방법을 생각해볼 수 있습니다. 

이번 포스팅에서는 

(1) Greenplum DB, PostgreSQL DB의 width_bucket() SQL 함수를 사용하여 동일 간격 범위별로 관측치 개수를 세어보고, 

(2) Python에서 width_bucket() SQL Query를 재사용하기 쉽게 사용자 정의 함수(user defined function)을 정의하여, 

(3) Python으로 DB connect하여 GPDB에서 집계한 결과로 막대 그래프 그리는 방법

을 소개하겠습니다. 

먼저, 예제로 사용할 간단한 houses (세금, 화장실 개수, 욕실 개수, 가격, 크기) 데이터를 DBeaver나 PGadmin IV 등의 DB tool을 사용해서 테이블을 생성하고 insert into 해보겠습니다. 

DROP TABLE IF EXISTS houses;

CREATE TABLE houses (id INT, tax INT, bedroom INT, bath FLOAT, price INT,

            size INT, lot INT);

INSERT INTO houses VALUES

  (1 ,  590 ,       2 ,    1 ,  50000 ,  770 , 22100),

  (2 , 1050 ,       3 ,    2 ,  85000 , 1410 , 12000),

  (3 ,   20 ,       3 ,    1 ,  22500 , 1060 ,  3500),

  (4 ,  870 ,       2 ,    2 ,  90000 , 1300 , 17500),

  (5 , 1320 ,       3 ,    2 , 133000 , 1500 , 30000),

  (6 , 1350 ,       2 ,    1 ,  90500 ,  820 , 25700),

  (7 , 2790 ,       3 ,  2.5 , 260000 , 2130 , 25000),

  (8 ,  680 ,       2 ,    1 , 142500 , 1170 , 22000),

  (9 , 1840 ,       3 ,    2 , 160000 , 1500 , 19000),

 (10 , 3680 ,       4 ,    2 , 240000 , 2790 , 20000),

 (11 , 1660 ,       3 ,    1 ,  87000 , 1030 , 17500),

 (12 , 1620 ,       3 ,    2 , 118600 , 1250 , 20000),

 (13 , 3100 ,       3 ,    2 , 140000 , 1760 , 38000),

 (14 , 2070 ,       2 ,    3 , 148000 , 1550 , 14000),

 (15 ,  650 ,       3 ,  1.5 ,  65000 , 1450 , 12000);


SELECT * FROM houses;



1. Greenplum DB, PostgreSQL DB의 width_bucket() SQL 함수를 사용하여 
    동일 간격 범위별로 관측치 개수를 세기


houses 테이블에서 가격(price) 변수의 최소값은 $22,500, 평균은 $122,140, 최대값은 $260,000 이군요. 

SELECT 

min(price) AS min_val,  

avg(price) AS mean,

max(price) AS max_val

FROM houses


위에서는 SQL문의 min(), avg(), max() 함수를 써서 이들 통계량을 구했는데요, 경우에 따라서는 동일 간격의 범위/ 구간별로 관측치가 몇 개 있는지를 구해보고 싶은 경우가 있습니다. (<- 히스토그램으로 시각화를 하죠)  SQL 문으로 하려면 width_bucket() 함수를 사용하면 case when 문을 길게 쓰지 않고도 간편하게 '동일 간격 범위의 bucket 별로 관측치를 집계'할 수 있습니다. 

houses 테이블의 price 칼럼에 대해 5개의 동일 간격(즉, 4개의 cutting line을 사용)의 bucket별로 관측치를 세어(count) 보겠습니다. width_bucket(변수, 시작 값, 끝 값, cutting line 개수) 의 순서로 arguments를 넣어주면 되며, 이렇게 만든 bucket 별로 count(*) 하고, GROUP BY bucket 으로 그룹별 묶어주면 됩니다. 

SELECT 

width_bucket(price, 22500, 260000, 4) AS bucket, 

count(*) AS cnt

FROM houses

GROUP BY bucket

ORDER BY bucket;


그런데, 위의 집계 결과를 보면 각 bucket의 구간이 어떻게 되는지 표만 봐서는 알 수 없어서 좀 갑갑한 면이 있습니다. 그래서 이번에는 각 bucket의 구간의 시작(from_val)과 끝(to_val)의 값을 같이 볼 수 있도록 해보겠습니다. 그리고 width_bucket(변수, 시작 값, 끝 값, cutting line 개수) 에서 '시작 값(starting point)'과 '끝 값(ending point)'을 수작업으로 직접 입력해주는 것이 아니라 해당 변수의 최소값과 최대값을 min(), max() 함수로 구해서 자동으로 입력해줄 수 있도록 with clause SQL문을 사용해서 짜보겠습니다. 

WITH stats AS (

SELECT 

min(price) AS min_val

max(price) AS max_val

FROM houses

), bucket_tbl AS (

SELECT 

width_bucket(price, min_val, max_val, 4) AS bucket, 

count(*) AS cnt

FROM houses, stats

GROUP BY bucket

ORDER BY bucket

)

SELECT 

bucket, 

min_val + (bucket-1)*min_val AS from_val, 

min_val + bucket*min_val AS to_val, 

cnt

FROM stats, bucket_tbl;



처음보다 훨씬 보기에 좋아졌습니다. 그렇지요?! 

여기까지 짜보았으니 이제 슬슬 더 욕심이 나기 시작합니다. DB에서 SQL로 bucket 별 관측치 개수를 집계할 결과를 Python이나 R로 가져와서 시각화를 해보면 더 가독성이 좋아질텐데....., 위의 SQL문을 사용자 정의 함수로 만들어서 table이름, 변수이름, bucket 개수 입력값만 바꾸어주면 알아서 집계를 해주면 더 편할텐데.... 하는 욕심 말이지요. 

그래서, Python으로 Greenplum 이나 PoesgreSQL DB에 connect하여 위의 width_bucket() SQL문을 사용자 정의 함수로 만들고, DB에서 집계한 결과를 pandas의 DataFrame.plot.bar() 함수로 시각화해보겠습니다. 



2. Python에서 width_bucket() SQL Query를 재사용하기 쉽게
    사용자 정의 함수(user defined function)을 정의


여기서부터는 Jupyter Notebook이나 Spyder 와 같은 Python IDE에서 진행하면 됩니다. (저는 Jupyter Notebook을 사용하였습니다)

아래 Python 코드는 psycopg2 라이브러리를 사용해서 Greenplum DB 혹은 PostgreSQL DB에 접속하고, Query문을 받아서 실행시킨 후에, 그 결과를 pandas DataFrame으로 반환하는 사용자 정의 함수 read_sql() 함수를 정의한 것입니다. 


import pandas as pd

import matplotlib as plt

%matplotlib inline


# UDF for GPDB connection and Querying, Save to pandas DataFrame

def read_sql(query):

     import pandas as pd

     import psycopg2 as pg


    # DB Connection (put it with yours)

     conn = pg.connect(host='localhost', 

                       port='5432', 

                       dbname='postgres', 

                       user='postgres', 

                       password='postgres')

     # Get a DataFrame

     result = pd.read_sql(query, conn)

     conn.close()

     return result 





위에서 정의한 read_sql() 사용자 정의함수를 사용해서 5개 bucket 별로 관측치 개수를 집계한 SQL query문을 날려보겠습니다. SQL query문은 따옴표 3개 (""" sql query syntax """) 안에 써주면 됩니다. read_sql() 사용자 정의 함수가 잘 작동하는군요. 

 


 query = """

    WITH stats AS (

        SELECT 

            min(price) AS min_val, 

            max(price) AS max_val

        FROM houses

    ), bucket_tbl AS (

        SELECT 

        width_bucket(price, min_val, max_val, 4) AS bucket, 

        count(*) AS cnt

    FROM houses, stats

    GROUP BY bucket

    ORDER BY bucket

    )

    SELECT

        'price' AS column,

        bucket, 

        min_val + (bucket-1)*min_val AS range_low, 

        min_val + bucket*min_val AS range_high, 

        cnt

    FROM stats, bucket_tbl;

"""


rng_bucket = read_sql(query)

rng_bucket

columnbucketrange_lowrange_highcnt
0price122500450003
1price245000675007
2price367500900003
3price4900001125001
4price51125001350001




이제 위의 구슬들을 잘 꿰어서 진주 목걸이를 만들 차례가 되었습니다. Python의 format() 문을 접목하여 동일 간격 bucket 별로 관측치 개수를 집계하는 SQL query 문의 테이블 이름(tbl_nm), 변수 이름(var_nm), bucket 개수(bucket_num) 의 3개 인자를 받는 Python 사용자 정의 함수 rng_bucket(tbl_nm, var_nm, bucket_num)를 만들어보겠습니다. 


def rng_bucket(tbl_nm, var_nm, bucket_num=10):

    

    query = """

    WITH stats AS (

        SELECT 

            min({var_nm}) AS min_val, 

            max({var_nm}) AS max_val

        FROM {tbl_nm}

    ), bucket_tbl AS (

        SELECT 

        width_bucket({var_nm}, min_val, max_val, ({bucket_num}-1)) AS bucket, 

        count(*) AS cnt

    FROM {tbl_nm}, stats

    GROUP BY bucket

    ORDER BY bucket

    )

    SELECT 

        '{var_nm}' AS column,

        bucket, 

        min_val + (bucket-1)*min_val AS range_low, 

        min_val + bucket*min_val AS range_high, 

        cnt

    FROM stats, bucket_tbl

    ORDER BY bucket

    """.format(tbl_nm = tbl_nm, 

              var_nm = var_nm, 

              bucket_num = bucket_num)

    

    rng_bucket = read_sql(query)

    

    return rng_bucket;

 



목걸이로 다 꿰었으니 이제 rng_bucket() 사용자 정의 함수에 'price' 변수에 대해 bucket 개수를 5개, 10개로 넣어서 실행시켜 보고, 변수 이름을 'price' 대신 'tax'를 넣어서도 실행시켜 보겠습니다. 


rng_bucket('houses', 'price', 5)

columnbucketrange_lowrange_highcnt
0price122500450003
1price245000675007
2price367500900003
3price4900001125001
4price51125001350001

 

rng_bucket('houses', 'price', 10)

columnbucketrange_lowrange_highcnt
0price122500450001
1price245000675002
2price367500900004
3price4900001125001
4price51125001350004
5price61350001575001
6price92025002250001
7price102250002475001


rng_bucket('houses', 'tax', 5)

columnbucketrange_lowrange_highcnt
0tax120405
1tax240606
2tax360801
3tax4801002
4tax51001201


잘 동작하는군요! ^^


 3. Python으로 DB connect하여 GPDB에서 집계한 결과로 막대 그래프 그리기

마지막으로, pandas DataFrame으로 반환받은 세금(tax) 변수의 5개 bucket 별 집계 결과를 pandas 막대그래프(bar graph)로 그려보겠습니다. 


tax_bucket = rng_bucket('houses', 'price', 5)

ax = tax_bucket.plot.bar(x='bucket', y='cnt', rot=0)



요약하자면, 데이터 사이즈가 수백 테라바이트, 수 페타바이트급이면 Greenplum, PostgreSQL DB에서 집계하시구요, 결과는 Python이나 R로 시각화해서 보세요. 자주 쓰는 코드라면 사용자 정의 함수를 만들어놓고 재사용하시구요. 


많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. :-)


Posted by R Friend R_Friend

댓글을 달아 주세요

이번 포스팅에서는 Greenplum DB, Postgresql 에서 테이블을 생성한 후에 SQL로 데이터 전처리하는 몇 가지 방법을 소개하겠습니다. 

예제로 사용할 간단한 고객 정보 테이블을 생성하고, 행 번호, 고객번호, 이름, 나이, 성별, 지역, 등록일 값을 입력해보겠습니다. 


DROP TABLE IF EXISTS public.cust;

CREATE TABLE public.cust (

seq_num integer

, cust_id text not null

, name text not null

, age integer

, gender text

, region text

, regist_date date

);


INSERT INTO public.cust VALUES 

(1, 'A001', 'choi', 25, 'M', 'seoul', '2018-01-25'), 

(2, 'A002', 'kang', 30, 'F', 'Busan', '2019-02-08'), 

(3, 'A003', 'lee', 29, NULL, 'seoul', '2018-05-30'), 

(4, 'B001', 'kim', 35, 'F', 'seoul', '2018-12-22'), 

(5, 'B002', 'sung', 34, 'M', 'busan', '2019-02-19'),

(6, 'B003', 'park', NULL, NULL, 'SEOUL', '2019-03-15');


SELECT * FROM public.cust ORDER BY seq_num;



위의 테이블에서 

(1) 고객ID(cust_id) 문자열의 첫 번째 문자열을 가져다가 group 칼럼 만들기
    : SUBSTRING(cust_id, 1, 1) AS group

(2) group별로 seq_num 순서에 따라 행 번호 부여하기
    : ROW_NUMBER() OVER(PARTITION BY SUBSTRING(cust_id, 1, 1) ORDER BY seq_num) AS grp_num

(3) 나이(age) 결측값을 전체 평균 값으로 채우기 
    : COALESCE(age, AVG(age) OVER())::INTEGER AS age

(4) 성별(gender) 결측값을 "Unknown" 값으로 채우기 
    : COALESCE(gender, 'Unknown') AS gender

(5) 지역(region) 대문자를 소문자로 바꾸기 
    : LOWER(region) AS region

(6) 이름(name)이 'choi', 'park', 'lee', 'kim'은 그대로 두고, 그 외는 'others'로 바꾸어서 name_2 칼럼 만들기
    : CASE WHEN name IN ('choi', 'park', 'lee', 'kim') THEN name ELSE 'others' END AS name_2

-- substring of id's first character
-- insert row number
-- fill missing value of 'age' with average
-- fill missing value of 'gender' with 'Unknown'
-- convert upper letter into lower letter
-- if name IN ('choi', 'park', 'lee', 'kim') then name, else 'other'


DROP TABLE IF EXISTS public.cust_preprocessed CASCADE;

CREATE TABLE public.cust_preprocessed AS 

(

SELECT 

seq_num, 

cust_id, 

SUBSTRING(cust_id, 1, 1) AS group, 

ROW_NUMBER() OVER(PARTITION BY SUBSTRING(cust_id, 1, 1) ORDER BY seq_num) AS grp_num, 

COALESCE("age", AVG(age) OVER())::INTEGER AS "age", 

COALESCE(gender, 'Unknown') AS gender,

LOWER(region) AS region, 

name, 

CASE WHEN name IN ('choi', 'park', 'lee', 'kim') THEN name

ELSE 'others' END AS name_2, 

regist_date

FROM public.cust

ORDER BY cust_id

) DISTRIBUTED RANDOMLY;

SELECT * FROM public.cust_preprocessed ORDER BY seq_num;



다음으로 날짜 형식의 데이터에서 년(year), 월(month), 일(day), 현재 날짜(now), 입력 날짜로 부터 현재 날짜까지의 소요 일(day until now)을 계산해보겠습니다. 

(7) 등록 날짜에서 년(year) 정보 추출
  : EXTRACT (YEAR FROM regist_date)::int AS year

(8) 등록 날짜에서 월(month) 정보 추출
  : EXTRACT (MONTH FROM regist_date)::int AS month

(9) 등록 날짜에서 일(day) 정보 추출
  : EXTRACT (DAY FROM regist_date)::int AS day

(10) 현재 날짜 자동 입력
  : now()::DATE

(11) 이전 등록 날짜에서 현재까지의 소요 일 계산
  : AGE(regist_date) AS time_from_regist

 -- extract year, month, day from regist_date

DROP TABLE IF EXISTS public.cust_date CASCADE;

CREATE TABLE public.cust_date AS 

(

SELECT *, 

EXTRACT (YEAR FROM regist_date)::int AS year, 

EXTRACT (MONTH FROM regist_date)::int AS month, 

EXTRACT (DAY FROM regist_date)::int AS day, 

now()::DATE,

AGE(regist_date) AS time_from_regist

FROM public.cust_preprocessed

ORDER BY cust_id

) DISTRIBUTED RANDOMLY;

SELECT 

seq_num, regist_date, year, month, day, 

now, time_from_regist 

FROM public.cust_date 

ORDER BY seq_num;




많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. :-)


Posted by R Friend R_Friend

댓글을 달아 주세요

Greemplum DB로 데이터 분석을 하려고 할때 처음에 하는 일이 분석에 필요한 데이터를 Greenplum DB에 schema, table 생성하고 데이터를 table에 upload하는 입니다. 이번 포스팅에서는 외부의 데이터를 Greenplum Database Table에 업로드하는 5가지 방법을 소개하겠습니다. 


[ Greenplum DB에 외부 데이터를 upload하는 5가지 방법 ]

1. CREATE EXTERNAL TABLE 후 => CREATE TABLE

2. COPY table_name FROM directory DELIMITER

3. INSERT INTO VALUES ()

4. DB tool인 DBeaver Import Wizard (or pgAdmin IV)

5. Python pandas DataFrame.to_sql() 함수 사용


예제로 사용할 데이터는 UC Irvine Machine Learning Repository 에 있는 abalone 데이터셋입니다. 
( * source: http://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data )

전복(abalone)의 성별, 길이, 반지름, 높이, 전체 무게, 내장을 뺀 후의 무게, 내장 무게, 껍질 무게, 고리 (+1.5를 하면 나이가 됨) 변수로 구성된 데이터셋입니다. Toy project로 나이 예측이나 성장정도 분류 문제에 종종 등장하곤 하는 데이터셋입니다. 

Attribute information:

   Given is the attribute name, attribute type, the measurement unit and a
   brief description.  The number of rings is the value to predict: either
   as a continuous value or as a classification problem.

	Name		Data Type	Meas.	Description
	----		---------	-----	-----------
	Sex		nominal			M, F, and I (infant)
	Length		continuous	mm	Longest shell measurement
	Diameter	continuous	mm	perpendicular to length
	Height		continuous	mm	with meat in shell
	Whole weight	continuous	grams	whole abalone
	Shucked weight	continuous	grams	weight of meat
	Viscera weight	continuous	grams	gut weight (after bleeding)
	Shell weight	continuous	grams	after being dried
	Rings		integer			+1.5 gives the age in years

   Statistics for numeric domains:

		Length	Diam	Height	Whole	Shucked	Viscera	Shell	Rings
	Min	0.075	0.055	0.000	0.002	0.001	0.001	0.002	    1
	Max	0.815	0.650	1.130	2.826	1.488	0.760	1.005	   29
	Mean	0.524	0.408	0.140	0.829	0.359	0.181	0.239	9.934
	SD	0.120	0.099	0.042	0.490	0.222	0.110	0.139	3.224 

Correl 0.557 0.575 0.557 0.540 0.421 0.504 0.628 1.0 




  1. CREATE EXTERNAL TABLE => CREATE TABLE

먼저 web 상에 올라가 있는 데이터를 url을 이용하여 external table로 만들고, 그 다음에 create table을 해서 Greenplum DB에 넣는 방법부터 소개하겠습니다. web에 있는 데이터 불러올 때나 하둡에 있는 데이터를 GPDB에 올릴 때는 이 방법에 제일 편리한거 같습니다. 


-- (1) Create an external web table

DROP EXTERNAL TABLE IF EXISTS public.abalone_external;

CREATE EXTERNAL WEB TABLE public.abalone_external(

sex text 

, length float8

, diameter float8

, height float8

, whole_weight float8

, shucked_weight float8

, viscera_weight float8

, shell_weight float8

, rings integer -- target variable to predict

) location('http://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data') 

format 'CSV' 

(null as '?');


--Create a table at Greenplum Database from an external table

DROP TABLE IF EXISTS public.abalone;

CREATE TABLE public.abalone AS

SELECT * FROM public.abalone_external

DISTRIBUTED BY (sex);


SELECT * FROM public.abalone LIMIT 10;

 



  2. COPY table_name FROM directory DELIMITER

두번째 방법은 데이터를 csv나 text 파일로 다운로드를 한 후에 => psql로 \COPY 문을 사용해서 Greenplum DB에 데이터를 업로드하는 방법입니다. 만약 회사 보안 상 외부 website url에서 external table로 가져올 수 없는 경우에 유용하게 사용할 수 있는 방법입니다. 파일 다운로드 한 경로에 가서 pwd 로 경로 확인한 후에 FROM 뒤에 데이터를 가져올 경로를 입력하시면 됩니다. 


-- (2) COPY

DROP TABLE IF EXISTS public.abalone;

CREATE TABLE public.abalone(

sex text 

, length float8

, diameter float8

, height float8

, whole_weight float8

, shucked_weight float8

, viscera_weight float8

, shell_weight float8

, rings integer

) DISTRIBUTED BY (sex);


COPY public.abalone (sex, length, diameter, height, whole_weight, shucked_weight, viscera_weight, shell_weight, rings) 

FROM '/Users/ihongdon/Downloads/abalone.data.txt' DELIMITER ',' CSV;

 



  3. INSERT INTO VALUES ()

입력해야 할 데이터 개수가 몇 개 안되는 경우, 혹은 기존 table에 소수의 데이터를 추가하는 경우에 간단하게 사용할 수 있는 방법이 insert into values() 입니다. tutorial 만들거나 교육용 샘플 데이터 만들 때 주로 사용하곤 하는 방법입니다. (반면, 데이터 개수가 많아지면 아무래도 사용하기에 좀 꺼려지는 방법입니다. -_-;)

create table에서 만든 칼럼과 동일한 순서로 데이터를 삽입할 때는 칼럼 이름을 생략해도 됩니다. 


-- (3)INSERT INTO VALUES()

DROP TABLE IF EXISTS public.abalone;

CREATE TABLE public.abalone(

sex text 

, length float8

, diameter float8

, height float8

, whole_weight float8

, shucked_weight float8

, viscera_weight float8

, shell_weight float8

, rings integer

) DISTRIBUTED BY (sex);


INSERT INTO public.abalone 

(sex, length, diameter, height, whole_weight, shucked_weight, viscera_weight, shell_weight, rings) 

VALUES 

('M',0.455,0.365,0.095,0.514,0.2245,0.101,0.15,15), 

('M',0.35,0.265,0.09,0.2255,0.0995,0.0485,0.07,7), 

('F',0.53,0.42,0.135,0.677,0.2565,0.1415,0.21,9), 

('M',0.44,0.365,0.125,0.516,0.2155,0.114,0.155,10), 

('I',0.33,0.255,0.08,0.205,0.0895,0.0395,0.055,7), 

('I',0.425,0.3,0.095,0.3515,0.141,0.0775,0.12,8), 

('F',0.53,0.415,0.15,0.7775,0.237,0.1415,0.33,20), 
('F',0.545,0.425,0.125,0.768,0.294,0.1495,0.26,16); 




  4. DB tool인 DBeaver Import Wizard 사용

csv나 text 파일로 다운로드 해놓은 데이터셋이 있는 경우, DB tool인 DBeaver나 pgAdmin IV의 Import Wizard를 사용하는 방법도 매우 편리합니다. 


-- (4) DBeaver tool's Import Wizard

DROP TABLE IF EXISTS public.abalone;

CREATE TABLE public.abalone(

sex text 

, "length" float8

, "diameter" float8

, "height" float8

, whole_weight float8

, shucked_weight float8

, viscera_weight float8

, shell_weight float8

, rings integer

) DISTRIBUTED BY (sex);



(1) DBeaver tool의 좌측 Database Navigator > DB > Schema > Tables > abalone 테이블에 '마우스 오른쪽' 클릭 > 'Import Data' 선택


(2) Data Transfer 창에서 'CSV' (Import from CSV file(s)) 선택

 

3. Input files 의 Source name 선택 > 탐색기 창이 나타나면 데이터셋이 저장되어 있는 경로로 가서 데이터셋 선택 > Open 단추 클릭 > Next 단추 클릭


4. Data Transfer: Preview data import 에서 데이터셋이 맞게 들어가 있는건지 미리보기로 확인


5. Data Transfer: Settings 화면 > Next 단추 클릭


6. Data Transfer: Confirm 창에서 최종 확인 후, 맞으면 'Finish' 단추 클릭


7. Data Transfer: Data transfer completed (소요 시간, 초)



  5. Python pandas DataFrame.to_sql() 함수 사용

파일 사이즈가 분석 환경의 메모리 한계 내에서 감당할만한 수준인 경우, Python pandas의 read_csv() 함수로 데이터를 읽어들여서 DataFrame으로 만든 다음에, pandas의 to_sql() 함수를 사용하여 Greenplum DB에 pandas DataFrame을 insert할 수 있습니다. 저는 분석할 때 대부분의 경우 Python이나 R을 GPDB와 연동(connect)에서 사용하는데요, Python이나 R의 분석결과를 다시 GPDB에 집어넣을 때 사용하는 방법입니다. 

(Greenplum Database에 Python 연동하는 방법은 https://rfriend.tistory.com/251 , https://rfriend.tistory.com/379 를 참고하세요)


# Importing data from website using pandas read_csv() function

abalone_data_url = "https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data"

abalone_columns = ( 'sex', 'length', 'diameter', 'height', 'whole_weight', 'shucked_weight', 'viscera_weight', 'shell_weight', 'rings')

df_abalone = pd.read_csv(abalone_data_url, names=abalone_columns)

 df_abalone.info()

<class 'pandas.core.frame.DataFrame'> RangeIndex: 4177 entries, 0 to 4176 Data columns (total 9 columns): sex 4177 non-null object length 4177 non-null float64 diameter 4177 non-null float64 height 4177 non-null float64 whole_weight 4177 non-null float64 shucked_weight 4177 non-null float64 viscera_weight 4177 non-null float64 shell_weight 4177 non-null float64 rings 4177 non-null int64 dtypes: float64(7), int64(1), object(1) memory usage: 293.8+ KB


# export to Greenplum DB using pandas df.to_sql() function

df_abalone.to_sql( 'abalone', conn, schema='public', if_exists='replace', index=True, index_label='id', chunksize=10000)



많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. 


Posted by R Friend R_Friend

댓글을 달아 주세요

이번 포스팅에서는 Greenplum Database, Postgresql Database에 사용할 수 있는 오픈소스 Database Tool인 DBeaver 설치, 사용법을 소개하겠습니다. 

그동안 PostgreSQL tool인 pgAdmin4 를 썼는데요, DBeaver가 더 나은 것 같아서 갈아 탔습니다. 

DBeaver는 PostgreSQL, Greenplum DB 외에도 MySQL, MariaDB, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Derby 등의 Database에도 사용할 수 있으므로 활용도가 매우 높습니다. 물론 오픈소스니깐 공짜로 그냥 설치해서 사용하면 됩니다. 

* 출처: https://dbeaver.io/


  1, Mac OSX 에 DBeaver Community Edition (ver 5.3.5) 설치하기

저는 Brew 를 이용해서 설치했습니다. 

1. 터미널을 엽니다. 

2. Brew 가 설치되어 있지 않으면 아래의 스크립트를 그대로 실행시키고, 맥북의 비밀번호를 입력해주세요. 만약 Brew 를 이미 설치하셨다면 2번은 건너뛰고 3번만 실행시키면 됩니다.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null ; brew install caskroom/cask/brew-cask 2> /dev/null 

3. 터미널 창에 brew cask install dbeaver-community  를 실행합니다. 

MacBook-Pro:~ user$ brew cask install dbeaver-community

Updating Homebrew...

==> Auto-updated Homebrew!

Updated 1 tap (homebrew/core).

==> New Formulae

cafeobj                 gnunet                  homeassistant-cli       re-flex                 sd                      v2ray-plugin

gloo-ctl                h3                      i386-elf-grub           riff                    serve

==> Updated Formulae

git                               cdogs-sdl                           gcc                                 nwchem

kubernetes-helm                   cfengine                            gdk-pixbuf                          odpi

pcre                               cflow                               geckodriver                         offlineimap

abcde                               cfr-decompiler                      gecode                              ohcount

abcmidi                             cglm                                geocode-glib                        openssl@1.1

activemq-cpp                        chakra                              gerbil-scheme                       paket

aescrypt-packetizer                 check_postgres                      get_iplayer                         pandoc

afflib                              checkstyle                          git-lfs                             pandoc-citeproc

afio                                chkrootkit                          gitlab-runner                       parallel

agedu                               cli53                               glslang                             passenger

algernon                            click                               gnu-tar                             pdftoedn

amqp-cpp                            closure-compiler                    go                                  petsc

angular-cli                         cmark-gfm                           godep                               petsc-complex

annie                               cocoapods                           golang-migrate                      pgweb

ansible                             cointop                             gomplate                            phoronix-test-suite

apache-arrow                        collector-sidecar                   goreleaser                          php@7.1

apache-arrow-glib                   commandbox                          grafana                             picard-tools

apache-flink                        conan                               grpc                                planck

app-engine-java                     configen                            gwyddion                            plank

apt-dater                           confluent-oss                       gx                                  pmd

arangodb                            consul-template                     gx-go                               ponyc

aravis                              convox                              handbrake                           pre-commit

arm-linux-gnueabihf-binutils        coturn                              helmfile                            presto

armadillo                           couchdb                             hub                                 primesieve

arpack                              cpprestsdk                          i386-elf-binutils                   prometheus

artifactory                         cproto                              ibex                                protobuf

asciidoctorj                        crc32c                              imagemagick                         protobuf-c

asio                                cryptominisat                       ipfs                                protobuf-swift

ask-cli                             cryptopp                            jdupes                              protoc-gen-go

atkmm                               cscope                              jenkins                             pulumi

ats2-postiats                       csfml                               jhipster                            redis@4.0

auditbeat                           cython                              joplin                              rhash

aurora                              czmq                                kibana@5.6                          rust

autogen                             darcs                               kitchen-sync                        sbcl

avfs                                dartsim                             kompose                             sfml

aws-sdk-cpp                         davix                               kops                                shadowsocks-libev

awscli                              dcd                                 kube-ps1                            shellz

axel                                ddrescue                            kubeprod                            ship

azure-cli                           deark                               kubernetes-cli                      siege

azure-storage-cpp                   debianutils                         kustomize                           simutrans

babeld                              deja-gnu                            lcov                                singular

babl                                deployer                            ldc                                 skaffold

backupninja                         dhex                                lean-cli                            sn0int

bacula-fd                           dialog                              leiningen                           solr

balena-cli                          diffoscope                          libgweather                         spotbugs

batik                               diffstat                            libheif                             sqlmap

bazel                               digdag                              libphonenumber                      step

bee                                 dita-ot                             libpulsar                           supersonic

befunge93                           django-completion                   libqalculate                        svgo

bettercap                           docfx                               librealsense                        swagger-codegen

bgpstream                           docker                              libsecret                           swagger-codegen@2

bibtexconv                          docker-completion                   libtensorflow                       swiftformat

bigloo                              dovecot                             libxlsxwriter                       swiftlint

binaryen                            dpkg                                linkerd                             terragrunt

bind                                draco                               liquibase                           tgui

bindfs                              dscanner                            lmod                                thors-serializer

bit                                 dub                                 logtalk                             tippecanoe

blastem                             duck                                lzlib                               tmux-xpanes

bluetoothconnector                  dwdiff                              maxwell                             topgrade

bmake                               dwm                                 mesa                                typescript

boxes                               dyld-headers                        metricbeat                          unrar

brew-php-switcher                   dynamips                            minio-mc                            vagrant-completion

bro                                 eccodes                             mkl-dnn                             vault

buildifier                          elasticsearch                       mosh                                wabt

burp                                elasticsearch@5.6                   mosquitto                           wtf

bwm-ng                              elektra                             mysql@5.6                           xmrig

bzt                                 emscripten                          ncompress                           xtensor

c-blosc                             erlang@20                           nginx                               yara

caffe                               eslint                              nifi                                ydcv

calabash                            exploitdb                           node                                yle-dl

calcurse                            fabio                               node-build                          you-get

calicoctl                           flake8                              node@10                             youtube-dl

carrot2                             fn                                  node@6                              zbackup

cassandra@2.1                       frugal                              node@8

cassandra@2.2                       fx                                  ntopng

cdk                                 gambit-scheme                       numpy


==> Tapping homebrew/cask

Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask'...

remote: Enumerating objects: 4086, done.

remote: Counting objects: 100% (4086/4086), done.

remote: Compressing objects: 100% (4075/4075), done.

remote: Total 4086 (delta 24), reused 442 (delta 8), pack-reused 0

Receiving objects: 100% (4086/4086), 1.31 MiB | 593.00 KiB/s, done.

Resolving deltas: 100% (24/24), done.

Tapped 1 command and 3985 casks (4,093 files, 4.2MB).

==> Caveats

dbeaver-community requires Java 8+. You can install the latest version with


  brew cask install java


==> Satisfying dependencies

==> Downloading https://github.com/dbeaver/dbeaver/releases/download/5.3.5/dbeaver-ce-5.3.5-macos.dmg

==> Downloading from https://github-production-release-asset-2e65be.s3.amazonaws.com/44662669/a1006c00-3315-11e9-84bc-679ab5a9b0aa?X-Amz-Algor

######################################################################## 100.0%

==> Verifying SHA-256 checksum for Cask 'dbeaver-community'.

==> Installing Cask dbeaver-community

==> Creating Caskroom at /usr/local/Caskroom

==> We'll set permissions properly so we won't need sudo in the future.

Password:

==> Moving App 'DBeaver.app' to '/Applications/DBeaver.app'.

🍺  dbeaver-community was successfully installed!

MacBook-Pro:~ user$ 



  2. Java JDK 설치 하기

Java JDK 가 설치되어 있지 않으면 'Java JDK를 설치하세요'라는 메시지가 뜹니다. (JDK가 설치되어 있다면 2번은 건너뛰면 됩니다)

java 설치 여부 및 버전은 아래처럼 java -version 으로 터미널에서 확인해볼 수 있습니다. 저는 Java 가 없으니 설치가 필요(requesting install)하다고 메시지가 나오네요. 

MacBook-Pro:~ user$ java -version

No Java runtime present, requesting install.


Oracle 의 아래 주소에서 macOS용 jdk-11.0.2_osx_x64_bin.dmg 파일을 다운로드 받았습니다. 

[다운로드 주소]

https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html


Linux, macOS, Windows 중에서 자신의 OS에 맞는 것을 선택해서 다운로드 하면 됩니다. 이때 Oracle License Agreement 를 accept 한다고 체크를 해주어야 합니다. 


jdk-11.0.2_osx-x64.dmg 파일이 다운로드 완료되면 아이콘을 더블 클릭해서 설치 애플리케이션을 시작합니다. 가운데 아이콘을 클릭한 다음에 '계속' 단추를 누르면서 설치를 합니다. 맥북 비밀번호 입력하라는 창이 뜨면 비밀번호를 입력해주면 설치가 완료됩니다. 



JDK가 잘 설치되었는지 java -version으로 확인해보겠습니다.

MacBook-Pro:~ user$ java -version

java version "11.0.2" 2019-01-15 LTS

Java(TM) SE Runtime Environment 18.9 (build 11.0.2+9-LTS)

Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.2+9-LTS, mixed mode) 



  3. Docker로 Greenplum DB 설치하고 실행하기

자세한 내용은 아래의 블로그 포스팅과 Docker Hub를 참고하시기 바랍니다. 

==>  https://rfriend.tistory.com/379

==> https://hub.docker.com/r/hdlee2u/gpdb-analytics

(터미널 사용)

## Docker 이미지 내려 받기

$ docker pull hdlee2u/gpdb-analytics

## Docker 이미지 확인 하기

$ docker images

REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE

hdlee2u/gpdb-analytics  latest           3be773a1a7e1        About a minute ago   4.93GB

## Docker 이미지를 실행/ 5432를 기본 포트로, ssh를 2022포트를 사용하여 접근 가능하도록 Docker 컨테이너 생성

$ docker run -i -d -p 5432:5432 -p 28080:28080 --name gpdb-ds --hostname mdw hdlee2u/gpdb-analytics /usr/sbin/sshd -D


## Docker 컨테이너 목록 확인

$ docker ps

CONTAINER ID    IMAGE                   COMMAND                   CREATED             STATUS              PORTS                   NAMES

7518fd48450a        575a7d45999d        "/bin/bash"              1 minute ago         Up 6 hours                  0.0.0.0:5432->5432/tcp, 0.0.0.0:28080->28080/tcp   gpdb-ds


## Start GPDB and Use psql

$ docker exec -it gpdb-ds /bin/bash

[root@mdw /]# su - gpadmin

[gpadmin@mdw ~]$ gpstart -a



  4. DBeaver 실행하고, Greenplum DB 연결 설정하기 (GPDB connect)

맥북의 Launchpad에서 DBeaver 아이콘을 클릭하면 아래와 같은 DBeaver가 실행됩니다. 'Select your database' 화면창에서 'PostgreSQL'을 선택하고 '다음(Next)'을 선택합니다. 


Connection Settings 화면이 나오면 (3번에서 소개한 docker image 로 Greenplum DB를 론칭한 경우) 

 - Host: localhost

 - Database: gpadmin

 - User: gpadmin

 - Password: pivotal

 - Port: 5432

로 입력해주세요. 만약 다른 환경의 Greenplum DB를 사용하고 있다면 그에 맞게 Host, Database, User, Password를 설정해주면 됩니다. 


Greenplum Database에 DBeaver tool이 제대로 연결이 되면 아래 화면처럼 왼쪽 분할면에 Database, Schema, Tables 네비게이터가 나타나고, 테이블을 하나 선택하면 오른쪽는 Data 셋을 Grid나 Text 형태로 볼 수 있습니다. 

(테이블의 데이터 사이즈가 엄청 큰 경우에는 테이블을 클릭해서 Data 보기를 하지 마시기 바랍니다. DB가 다운되어서 DB관리자에게 요주의 인물로 찍히는 수가 있습니다. SQL Editor 창에서 select 문으로 limit  걸어서 조회하시기 바랍니다.)


SQL Editor 는 상단 메뉴에서 'SQL Editor'를 선택하거나, 또는 상단 메뉴바에서 '말아놓은 종이모양 아이콘'을 클릭하면 됩니다. 


SQL select 문을 쓸 때 from 절의 테이블 이름은 좌측 분할면의 Navigator 창에서 해당 테이블을 마우스로 드래그 & 드랍해서 SQL Editor의 from 절 다음에 가져다 놓으면 schmema_name.table_name 이 자동으로 써지므로 편리하게 이용할 수 있습니다. 

SQL Editor에 쓴 SQL query를 실행할 때는 'control(^) + enter' 를 누르거나, SQL Editor 창의 세모 (아래 화면 캡쳐의 빨간색 부분) 아이콘을 누르면 됩니다. 


이상으로 DBeaver 설치 및 DBeaver를 Greenplum Database에 연결하고 DB, Schema, Table 보기 및 Query 실행하는 방법에 대해서 알아보았습니다. 


많은 도움이 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. 


Posted by R Friend R_Friend

댓글을 달아 주세요

도커 컨터이너를 잘 사용하다가 컴퓨터를 껐다가 다시 켜고서 docker start 를 다시 하면 포트가 이미 할당되어 있다(port is already allocated) 면서 에러가 발생하는 경우가 있습니다. 


저의 경우, 도커로 Greenplum Database + MADlib + PL/R + PL/Python 설치되어 있는 gpdb-ds 도커 컨터이너를 실행하려고 하니 아래와 같은 에러 메시지가 떴습니다. 


(추측컨데, docker를 정상적으로 종료하지 않고 그냥 컴퓨터를 막 꺼버린 경우에 이런 에러가 발생하는거 아닌가 싶습니다.)



Last login: Wed Sep 19 21:29:53 on ttys002

ihongdon-ui-MacBook-Pro:~ ihongdon$ docker ps -a

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                      PORTS                   NAMES

a0452a877e8c        hdlee2u/gpdb-analytics   "/usr/sbin/sshd -D"      4 weeks ago         Exited (128) 8 days ago                             gpdb-ds

a041b74fa56f        wordpress                "docker-entrypoint.s…"   9 months ago        Exited (128) 9 months ago   0.0.0.0:32769->80/tcp   wordpress

39aabe32259a        mysql:5.7                "docker-entrypoint.s…"   9 months ago        Exited (0) 9 months ago                             wordpressdb

5019a3411cc0        ubuntu:16.04             "/bin/bash"              9 months ago        Exited (0) 6 weeks ago                              my_ubuntu

ihongdon-ui-MacBook-Pro:~ ihongdon$ 

ihongdon-ui-MacBook-Pro:~ ihongdon$ 

ihongdon-ui-MacBook-Pro:~ ihongdon$ docker start gpdb-ds


Error response from daemon: driver failed programming external connectivity on endpoint gpdb-ds (d519c381360008f0ac0e8d756e97aeb0538075ee1b7e35862a0eaedf887181f1): Error starting userland proxy: Bind for 0.0.0.0:5432 failed: port is already allocated

 






이번 포스팅에서는 도커를 사용할 때 "포트가 이미 할당되어 있어서 연결에 실패했습니다 (port is already allocated)" 에러가  발생했을 때 대처 방법을 소개하겠습니다. 



(1) 5432 포트가 사용 중인지 여부 확인하기 : sudo lsof -i :5432


port 번호는 docker run 할 때 할당했던 port 번호를 입력해주세요. 저는 5432 로 했었기에 5432 입력했습니다.



ihongdon-ui-MacBook-Pro:~ ihongdon$ sudo lsof -i :5432

Password:

COMMAND  PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME

postgres  93 postgres    4u  IPv6 0x92aed4eef954d8e1      0t0  TCP *:postgresql (LISTEN)

postgres  93 postgres    5u  IPv4 0x92aed4eef9554549      0t0  TCP *:postgresql (LISTEN)

ihongdon-ui-MacBook-Pro:~ ihongdon$ 

 



postgresql 두 개가 5432 port 를 점유하고 있네요. 




(2) 이미 할당된 port 죽이기 : sudo kill -15 93



ihongdon-ui-MacBook-Pro:~ ihongdon$ 

ihongdon-ui-MacBook-Pro:~ ihongdon$ sudo kill -15 93

ihongdon-ui-MacBook-Pro:~ ihongdon$ 

 


 죽여, 살려 하니깐 좀 말이 과격한데요, ^^; 원치 않게 자리를 점하고 있던 좀비 port를 죽였습니다(kill). 



(1)번에서 했던 방법으로 5432 번호에 할당된 port를 조회해 볼까요? 아무것도 없네요. 



ihongdon-ui-MacBook-Pro:~ ihongdon$ sudo lsof -i :5432

ihongdon-ui-MacBook-Pro:~ ihongdon$ 

 




(3) 도커 컨터이너 시작하기 : docker start container_name



ihongdon-ui-MacBook-Pro:~ ihongdon$ docker start gpdb-ds

gpdb-ds

ihongdon-ui-MacBook-Pro:~ ihongdon$ 

ihongdon-ui-MacBook-Pro:~ ihongdon$ 

ihongdon-ui-MacBook-Pro:~ ihongdon$ docker ps -a

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                      PORTS                                              NAMES

a0452a877e8c        hdlee2u/gpdb-analytics   "/usr/sbin/sshd -D"      4 weeks ago         Up 6 seconds                0.0.0.0:5432->5432/tcp, 0.0.0.0:28080->28080/tcp   gpdb-ds

a041b74fa56f        wordpress                "docker-entrypoint.s…"   9 months ago        Exited (128) 9 months ago   0.0.0.0:32769->80/tcp                              wordpress

39aabe32259a        mysql:5.7                "docker-entrypoint.s…"   9 months ago        Exited (0) 9 months ago                                                        wordpressdb

5019a3411cc0        ubuntu:16.04             "/bin/bash"              9 months ago        Exited (0) 6 weeks ago                                                         my_ubuntu

ihongdon-ui-MacBook-Pro:~ ihongdon$ 

ihongdon-ui-MacBook-Pro:~ ihongdon$ 

ihongdon-ui-MacBook-Pro:~ ihongdon$ docker exec -it gpdb-ds /bin/bash

[root@mdw /]# 

[root@mdw /]# 

[root@mdw /]# su gpadmin

[gpadmin@mdw /]$ 

[gpadmin@mdw /]$ 

[gpadmin@mdw /]$ gpstart -a

20180924:13:03:26:000040 gpstart:mdw:gpadmin-[INFO]:-Starting gpstart with args: -a

20180924:13:03:26:000040 gpstart:mdw:gpadmin-[INFO]:-Gathering information and validating the environment...

20180924:13:03:26:000040 gpstart:mdw:gpadmin-[INFO]:-Greenplum Binary Version: 'postgres (Greenplum Database) 5.10.2 build commit:b3c02f3acd880e2d676dacea36be015e4a3826d4'

20180924:13:03:26:000040 gpstart:mdw:gpadmin-[INFO]:-Greenplum Catalog Version: '301705051'

20180924:13:03:26:000040 gpstart:mdw:gpadmin-[WARNING]:-postmaster.pid file exists on Master, checking if recovery startup required

20180924:13:03:26:000040 gpstart:mdw:gpadmin-[INFO]:-Commencing recovery startup checks

20180924:13:03:26:000040 gpstart:mdw:gpadmin-[INFO]:-Have lock file /tmp/.s.PGSQL.5432 but no process running on port 5432

20180924:13:03:26:000040 gpstart:mdw:gpadmin-[INFO]:-No Master instance process, entering recovery startup mode

20180924:13:03:26:000040 gpstart:mdw:gpadmin-[INFO]:-Clearing Master instance lock files

20180924:13:03:26:000040 gpstart:mdw:gpadmin-[INFO]:-Clearing Master instance pid file

20180924:13:03:26:000040 gpstart:mdw:gpadmin-[INFO]:-Starting Master instance in admin mode

20180924:13:03:27:000040 gpstart:mdw:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information

20180924:13:03:27:000040 gpstart:mdw:gpadmin-[INFO]:-Obtaining Segment details from master...

20180924:13:03:27:000040 gpstart:mdw:gpadmin-[INFO]:-Setting new master era

20180924:13:03:27:000040 gpstart:mdw:gpadmin-[INFO]:-Commencing forced instance shutdown

20180924:13:03:29:000040 gpstart:mdw:gpadmin-[INFO]:-Starting Master instance in admin mode

20180924:13:03:30:000040 gpstart:mdw:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information

20180924:13:03:30:000040 gpstart:mdw:gpadmin-[INFO]:-Obtaining Segment details from master...

20180924:13:03:30:000040 gpstart:mdw:gpadmin-[INFO]:-Setting new master era

20180924:13:03:30:000040 gpstart:mdw:gpadmin-[INFO]:-Master Started...

20180924:13:03:30:000040 gpstart:mdw:gpadmin-[INFO]:-Shutting down master

20180924:13:03:31:000040 gpstart:mdw:gpadmin-[INFO]:-Commencing parallel segment instance startup, please wait...

.. 

20180924:13:03:33:000040 gpstart:mdw:gpadmin-[INFO]:-Process results...

20180924:13:03:33:000040 gpstart:mdw:gpadmin-[INFO]:-----------------------------------------------------

20180924:13:03:33:000040 gpstart:mdw:gpadmin-[INFO]:-   Successful segment starts                                            = 2

20180924:13:03:33:000040 gpstart:mdw:gpadmin-[INFO]:-   Failed segment starts                                                = 0

20180924:13:03:33:000040 gpstart:mdw:gpadmin-[INFO]:-   Skipped segment starts (segments are marked down in configuration)   = 0

20180924:13:03:33:000040 gpstart:mdw:gpadmin-[INFO]:-----------------------------------------------------

20180924:13:03:33:000040 gpstart:mdw:gpadmin-[INFO]:-Successfully started 2 of 2 segment instances 

20180924:13:03:33:000040 gpstart:mdw:gpadmin-[INFO]:-----------------------------------------------------

20180924:13:03:33:000040 gpstart:mdw:gpadmin-[INFO]:-Starting Master instance mdw directory /data/master/gpseg-1 

20180924:13:03:34:000040 gpstart:mdw:gpadmin-[INFO]:-Command pg_ctl reports Master mdw instance active

20180924:13:03:34:000040 gpstart:mdw:gpadmin-[INFO]:-No standby master configured.  skipping...

20180924:13:03:34:000040 gpstart:mdw:gpadmin-[INFO]:-Database successfully started

[gpadmin@mdw /]$ 

[gpadmin@mdw /]$  




다시 잘 실행되네요. ^^


많은 도움이 되었기를 바랍니다. 


---------------


도커 컨테이터로 Greenplum Database + MADlib + PL/R + PL/Python 사용환경을 간단하게 구성하고 싶은 분은 http://rfriend.tistory.com/379 포스팅을 참고하세요. 10분만 투자하면 됩니다. 


Posted by R Friend R_Friend

댓글을 달아 주세요

이번 포스팅에서는 Greenplum DB, Postgresql DB에서 중복된 관측치(duplicated observations, duplicated rows)가 있을 경우에 제일 처음나 제일 마지막의 관측치 하나만 남겨놓고 나머지 중복 관측치들은 삭제하여 유일한 관측치만 남기는 2가지 방법을 소개하겠습니다. 


(방법 1) 원래의 테이블에서 중복된 관측치들 중에서 하나만 남기고 나머지 중복된 관측치들은 삭제하기

            : DELETE FROM original_table


(방법 2) 중복된 관측치들중에서 하나씩만 가져와서 새로운 테이블 만들고, 원래의 테이블은 제거(drop)하기

            : CREATE TABLE new_table & DROP TABLE original_table






  (방법 1) 원래의 테이블에서 중복된 관측치들 중에서 하나만 남기고 나머지 중복된 관측치들은 삭제하기

            : DELETE FROM original_table


Greenplum Database에 중복된 관측치가 들어있는 간단한 예제 테이블을 만들어보겠습니다. 'name'과 'price'의 두 개 변수를 기준으로 해서 중복 여부를 판단하여 중복된 관측치를 제거하는 예제입니다. 



drop table if exists prod_master;

create table prod_master (

id int not null

, name text not null

, price real not null

) distributed randomly;


insert into prod_master values 

(1, 'a', 1000)

, (2, 'a', 1000)

, (3, 'a', 1000)

, (4, 'b', 2000)

, (5, 'b', 2000)

, (6, 'c', 3000)

, (7, 'c', 3000);


select * from prod_master;

 





이제 DELETE query를 사용하여 중복된 관측치 중에서 첫번째 것만 남기고 나머지 중복된 관측치들은 제거해보겠습니다. DELETE 문은 'DELETE FROM table_name WHERE [conditio];' 의 형태로 사용합니다. 


이때 주의할 점은 sub query로 row_number() over (partition by ) 라는 window function을 사용해야만 중복된 관측치들 중에서 각각의 "첫번째 관측치"를 남겨놓을 수 있다는 것입니다 (아래 query의 빨간색 부분).  자칫 잘못하면 중복이 된 값은 하나도 남김없이 모조리 삭제하는 실수를 범할 수 있으니 조심하시기 바랍니다. 



delete from prod_master where id in (

select id 

from 

(select id, 

row_number() over (partition by name, price order by id) as row_num 

from prod_master) a

where a.row_num > 1

);

 


[Messages]

DELETE 4 Query returned successfully in 177 msec



select * from prod_master;






혹시 중복된 관측치들 중에서 "가장 앞에 있는"(위의 예시) 관측치 대신에 "가장 뒤에 있는" 관측치를 남기고 나머지 중복된 관측치는 제거하고 싶다면 row_number() over() 의 window function 에서 order by id desc 를 사용해주면 됩니다. 



--- Create a sample table

drop table if exists prod_master;

create table prod_master (

id int not null

, name text not null

, price real not null

) distributed randomly;


insert into prod_master values 

(1, 'a', 1000)

, (2, 'a', 1000)

, (3, 'a', 1000)

, (4, 'b', 2000)

, (5, 'b', 2000)

, (6, 'c', 3000)

, (7, 'c', 3000);



---- keep the last observation in case of duplication

delete from prod_master where id in (

select id 

from 

(select id, 

row_number() over (partition by name, price order by id desc) as row_num 

from prod_master) a

where a.row_num > 1

);


select * from prod_master;


 



위의 방법 1은 원래의 테이블을 그대로 유지한 상태에서 중복된 관측치를 삭제하므로, 새로운 테이블을 만들거나 기존 테이블을 삭제할 필요가 없습니다만, 대용량 데이터를 대상으로 다수의 중복된 관측치를 제거해야 하는 경우 (아래의 방법2 대비 상대적으로) 속도가 느리다는 단점이 있습니다.  대용량 데이터의 경우 빠른 속도로 중복처리하려면 아래의 '방법2'를 고려해보길 권합니다. ('Messages'에 나오는 실행 속도를 비교해보면 아래의 '방법2'가 빠른 것을 알 수 있습니다. 지금 예제야 관측치 7개짜리의 간단한 예제인지라 177 msec vs. 118 msec로 밀리세컨 단위 차이라고 무시할 수도 있겠지만, 데이터가 대용량이 되면 차이가 무시할 수 없게 커질 수 있습니다.)




  (방법 2) 중복된 관측치들중에서 하나씩만 가져와서 새로운 테이블 만들고, 원래의 테이블은 제거하기

            : CREATE TABLE new_table & DROP TABLE original_table


 

--- Create a sample table

drop table if exists prod_master;

create table prod_master (

id int not null

, name text not null

, price real not null

distributed randomly;


insert into prod_master values 

(1, 'a', 1000)

, (2, 'a', 1000)

, (3, 'a', 1000)

, (4, 'b', 2000)

, (5, 'b', 2000)

, (6, 'c', 3000)

, (7, 'c', 3000);


---- keep the first observation in case of duplication by creating a new table

drop table if exists prod_master_unique;

create table prod_master_unique as (

select * from prod_master 

where id NOT IN (

select id

from 

(select id, 

row_number() over (partition by name, price order by id) as row_num 

from prod_master) a

where a.row_num > 1)

) distributed randomly;




[Messages]

SELECT 3 Query returned successfully in 118 msec.

 



select * from prod_master_unique order by id;





-- Drop the original table to save disk storage

drop table prod_master;

 




 많은 도움이 되었기를 바랍니다. 


Posted by R Friend R_Friend

댓글을 달아 주세요

이번 포스팅에서는 도커 허브(Docker Hub)에서 Greenplum Database(이하 GPDB)에 MADlib, PL/R, PL/Python이 설치된 Docker Image를 내려받아 분석 환경을 구성하는 방법을 소개하겠습니다. 


이번 포스팅에서 소개하는 gpdb-analytics 도커 이미지는 개인이 집이나 회사에서 GPDB로 MADlib, PL/R, PL/Python 사용하면서 테스트해보고 공부할 때 간편하게 사용할 수 있는 용도로 만든 것입니다. 



[사전 준비] Dokcer Install


Docker Image를 이용하여 GPDB+분석툴을 설치할 것이므로, 먼저 Docker Hub (https://hub.docker.com/)에서 회원가입을 하고, https://www.docker.com/products/docker-desktop 사이트에서 자신의 OS에 맞는 Docker를 다운로드 받아 설치하시기 바랍니다. 




단, Windows OS 사용자의 경우는 (1) Windows 10 Professional or Enterprise 64-bit 의 경우 'Docker CE for Windows'를 다운받아 설치하시구요, 그 이전 버전 혹은 Home Edition 버전 Windows OS 이용하시는 분의 경우는 'Docker Toolbox'를 다운로드 받아서 설치하시기 바랍니다. 





[ Docker Hub에서 gpdb-analytics 도커 이미지 내려받아서 GPDB 분석 환경 구성하기 ]


1. Docker Hub에서 gpdb-analytics 도커 이미지 내려받기 (docker pull)





(터미널 사용)

## Docker 이미지 내려 받기

$ docker pull hdlee2u/gpdb-analytics

## Docker 이미지 확인 하기

$ docker images

REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
centos                     7                   d123f4e55e12        9 months ago        197MB
hdlee2u/gpdb-base        latest              bfe4e63b8e81         2 years ago           1.17GB

hdlee2u/gpdb-analytics  latest           3be773a1a7e1        About a minute ago   4.93GB

 




2. 도커 이미지를 실행하여 Docker Container 를 생성하고, GPDB 분석 환경 시작하기



## Docker 이미지를 실행/ 5432 기본 포트로, ssh 2022포트를 사용하여 접근 가능하도록 Docker 컨테이너 생성

docker run -i -d -p 5432:5432 -p 28080:28080 --name gpdb-ds --hostname mdw hdlee2u/gpdb-analytics /usr/sbin/sshd -D


## Docker 컨테이너 목록 확인

$ docker ps

CONTAINER ID    IMAGE                   COMMAND                   CREATED             STATUS              PORTS                   NAMES

7518fd48450a        575a7d45999d        "/bin/bash"              1 minute ago         Up 6 hours                  0.0.0.0:5432->5432/tcp, 0.0.0.0:28080->28080/tcp   gpdb-ds



## Start GPDB and Use psql


$ docker exec -it gpdb-ds /bin/bash

[root@mdw /]# su - gpadmin
[gpadmin@mdw ~]$ gpstart -a

20180821:04:45:08:000043 gpstart:mdw:gpadmin-[INFO]:-Starting gpstart with args: -a
20180821:04:45:08:000043 gpstart:mdw:gpadmin-[INFO]:-Gathering information and validating the environment...
20180821:04:45:08:000043 gpstart:mdw:gpadmin-[INFO]:-Greenplum Binary Version: 'postgres (Greenplum Database) 5.10.2 build commit:b3c02f3acd880e2d676dacea36be015e4a3826d4'
20180821:04:45:08:000043 gpstart:mdw:gpadmin-[INFO]:-Greenplum Catalog Version: '301705051'
20180821:04:45:08:000043 gpstart:mdw:gpadmin-[WARNING]:-postmaster.pid file exists on Master, checking if recovery startup required
20180821:04:45:08:000043 gpstart:mdw:gpadmin-[INFO]:-Commencing recovery startup checks
20180821:04:45:08:000043 gpstart:mdw:gpadmin-[INFO]:-Have lock file /tmp/.s.PGSQL.5432 but no process running on port 5432
20180821:04:45:08:000043 gpstart:mdw:gpadmin-[INFO]:-No Master instance process, entering recovery startup mode
20180821:04:45:08:000043 gpstart:mdw:gpadmin-[INFO]:-Clearing Master instance lock files
20180821:04:45:08:000043 gpstart:mdw:gpadmin-[INFO]:-Clearing Master instance pid file
20180821:04:45:08:000043 gpstart:mdw:gpadmin-[INFO]:-Starting Master instance in admin mode
20180821:04:45:10:000043 gpstart:mdw:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information
20180821:04:45:10:000043 gpstart:mdw:gpadmin-[INFO]:-Obtaining Segment details from master...
20180821:04:45:10:000043 gpstart:mdw:gpadmin-[INFO]:-Setting new master era
20180821:04:45:10:000043 gpstart:mdw:gpadmin-[INFO]:-Commencing forced instance shutdown
20180821:04:45:12:000043 gpstart:mdw:gpadmin-[INFO]:-Starting Master instance in admin mode
20180821:04:45:13:000043 gpstart:mdw:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information
20180821:04:45:13:000043 gpstart:mdw:gpadmin-[INFO]:-Obtaining Segment details from master...
20180821:04:45:13:000043 gpstart:mdw:gpadmin-[INFO]:-Setting new master era
20180821:04:45:13:000043 gpstart:mdw:gpadmin-[INFO]:-Master Started...
20180821:04:45:13:000043 gpstart:mdw:gpadmin-[INFO]:-Shutting down master
20180821:04:45:14:000043 gpstart:mdw:gpadmin-[INFO]:-Commencing parallel segment instance startup, please wait...
...
20180821:04:45:17:000043 gpstart:mdw:gpadmin-[INFO]:-Process results...
20180821:04:45:17:000043 gpstart:mdw:gpadmin-[INFO]:-----------------------------------------------------
20180821:04:45:17:000043 gpstart:mdw:gpadmin-[INFO]:-   Successful segment starts                                            = 2
20180821:04:45:17:000043 gpstart:mdw:gpadmin-[INFO]:-   Failed segment starts                                                = 0
20180821:04:45:17:000043 gpstart:mdw:gpadmin-[INFO]:-   Skipped segment starts (segments are marked down in configuration)   = 0
20180821:04:45:17:000043 gpstart:mdw:gpadmin-[INFO]:-----------------------------------------------------
20180821:04:45:17:000043 gpstart:mdw:gpadmin-[INFO]:-Successfully started 2 of 2 segment instances
20180821:04:45:17:000043 gpstart:mdw:gpadmin-[INFO]:-----------------------------------------------------
20180821:04:45:17:000043 gpstart:mdw:gpadmin-[INFO]:-Starting Master instance mdw directory /data/master/gpseg-1
20180821:04:45:18:000043 gpstart:mdw:gpadmin-[INFO]:-Command pg_ctl reports Master mdw instance active
20180821:04:45:18:000043 gpstart:mdw:gpadmin-[INFO]:-No standby master configured.  skipping...
20180821:04:45:18:000043 gpstart:mdw:gpadmin-[INFO]:-Database successfully started
[gpadmin@mdw ~]$
[gpadmin@mdw ~]$

[gpadmin@mdw ~]$ psql
psql (8.3.23)
Type "help" for help.

gpadmin=# \dn
List of schemas
Name | Owner
--------------------+---------
gp_toolkit | gpadmin
information_schema | gpadmin
madlib | gpadmin
pg_aoseg | gpadmin
pg_bitmapindex | gpadmin
pg_catalog | gpadmin
pg_toast | gpadmin
public | gpadmin
(8 rows)

gpadmin=# \q




3. PGAdmin IV 로 GPDB 연결하기


GPDB 5.x 버전에서 SQL Query를 할 때 PGAdmin IV 를 사용합니다. (GPDB 5.x 버전에서는 PGAdmin III 는 작동하지 않으며, 반대로 GPDB 4.x 버전에서는 PGAdmin IV가 작동하지 않고 대신 PGAdmin III만 작동합니다)


PGAdmin IV 는 https://www.pgadmin.org/download/ 에서 다운로드 하여 설치하면 됩니다. 


  • Host : localhost
  • Port : 5432
  • Maintenance DB : gpadmin
  • Username : gpadmin
  • Password : pivotal
  • Group: Servers
  • Ternel port: 22






4. Jupyter Notebook으로 GPDB 연결하기


4-0. Python 2.7 version의 Anaconda 설치


https://www.anaconda.com/download 에서 자신의 OS에 맞는 Python 2.7 version의 Anaconda를 설치합니다. GPDB 5.x 버전은 Python 2.7 version을 지원합니다. 




Anaconda를 설치하였으면, Anaconda Navigator를 실행한 후 base(root) 환경(즉, python 2.7)에서 'Jupyter Notebook'의 Launch 단추를 눌러서 Jupyter Notebook을 실행합니다. 





터미널을 이용해서 가상환경을 조회, 선택하고 Jupyter Notebook을 실행할 수도 있습니다. 




# 가상 환경 리스트 조회

$ conda env list

 

# 가상 환경 선택 (가상환경 리스트에서 python 2.7 버전 선택, windows의 경우: activate env_name)

$ source activate env_name


# Jupyter Notebook 실행

$ jupyter notebook






4-1. pip install 로 추가로 필요한 Python 패키지 설치하기



(터미널에서)

$ pip install --upgrade pip


$ pip install psycopg2

$ pip install sqlalchemy

$ pip install sql_magic

$ pip install math

$ pip install textwrap

$ pip install os

$ pip install Ipython


$ pip install ipywidgets

$ jupyter nbextension enable --py widgetsnbextension

$ pip install pygraphviz





4-2.  Jupyter Notebook에서 DB Connection 설정하기

4-2-1. Python packages importing



# Common modules

import numpy as np

import pandas as pd

from pandas import DataFrame

from pandas import Series

import sklearn

import math

import textwrap as tw


# For DB Connecton

import psycopg2

from sqlalchemy import create_engine

import sql_magic


# For reproducibility

np.random.seed(2622)


# Directory

import os

 



4-2-2. Visualization Parms Setup



import matplotlib as mpl

import matplotlib.pyplot as plt

import seaborn as sns


# To draw plots in jupyter notebook

#%matplotlib inline

%pylab inline


from pylab import rcParams

rcParams['figure.figsize'] = 12, 8

rcParams['axes.labelsize'] = 14

rcParams['xtick.labelsize'] = 12

rcParams['ytick.labelsize'] = 12


pd.set_option('display.max_columns', None)

pd.set_option('display.max_colwidth', 1000)


# Display

import ipywidgets as widgets

import IPython.display as ipd

from IPython.display import display


# interpret string as markdown

def printmd(string):

    ipd.display(ipd.Markdown(string))


# seaborn style

sns.set(style="darkgrid")




4-2-3. Greenplum Database Connection Setup



# put your own GPDB information

user = 'gpadmin'

password = 'pivotal'

host = 'localhost'

db = 'gpadmin'


connection_string = "postgresql://{user}:{password}@{host}/{db}".\

    format(user=user, 

           password=password, 

           host=host, 

           db=db)

    

conn = psycopg2.connect(connection_string)

cur = conn.cursor()

conn.autocommit = True




# helper function

def query_gpdb(query): 


    cur.execute(query)


    colnames = [desc[0] for desc in cur.description]

    return DataFrame(cur.fetchall(), columns=colnames)

 




4-2-4. sql_magic Setup

https://github.com/pivotal-legacy/sql_magic

sql_magic is Jupyter magic for writing SQL to interact with Greenplum/PostgreSQL database, Hive and Spark. Query results are saved directly to a Pandas dataframe.



# sql_magic package and ext sql_magic to query GPDB

%load_ext sql_magic

#%reload_ext sql_magic


%config SQL.conn_name = 'postgres_engine'


# '%execsql' for sql execution, 

# '%read_sql' for reading table as a DataFrame format

from IPython.core.magic import (register_line_magic, register_cell_magic, register_line_cell_magic)

@register_cell_magic

def execsql(line, cell):

       _ = postgres_engine.execute(cell)

       return

 




드디어 GPDB를 개인 컴퓨터에서 테스트, 공부용으로 간편하게(? ^^;) 설치하여 보았습니다. 수고 많으셨습니다. 




Jupyter Notebook 에서 sql 매직 언어로 DB를 조회할 수 있습니다. 


# GPDB 버전 확인

%read_sql select version();



# GPDB instance 확인 (하나의 서버에 1개 master, 2개 segment가 설치된 경우임)

%read_sql select * from pg_catalog.gp_segment_configuration 



# MADlib version 확인

%read_sql select madlib.version();



# PL/Languages 확인


sql query가 두 줄 이상일 경우 %%read_sql 처럼 % 두개를 앞에 써줍니다. (sql query 가 한 줄일 경우 %read_sql)

%%read_sql 

select * 

    from pg_catalog.pg_language;



# Table 생성

%%execsql

drop table if exists tmp;

create table tmp (

    id int, 

    var1 varchar(10)

    );




5. Docker Container 중단, 재시작, 작동 중인 컨테이너 목록 확인



## Docker  컨테이너 중단, 재시작, 목록 확인

$ docker stop gpdb-ds

$ docker start gpdb-ds

$ docker ps

CONTAINER ID    IMAGE                   COMMAND                   CREATED             STATUS              PORTS                   NAMES
7518fd48450a        575a7d45999d        "/bin/bash"              2 minutes ago         Up 6 hours                  0.0.0.0:5432->5432/tcp, 0.0.0.0:28080->28080/tcp   gpdb-ds

 



많은 도움이 되었기를 바랍니다. 



---------------

혹시 아래와 같은 에러가 발생하는 경우 http://rfriend.tistory.com/396 포스팅을 참고하세요. 



Error response from daemon: driver failed programming external connectivity on endpoint gpdb-ds (d519c381360008f0ac0e8d756e97aeb0538075ee1b7e35862a0eaedf887181f1): Error starting userland proxy: Bind for 0.0.0.0:5432 failed: port is already allocated

Error: failed to start containers: gpdb-ds 





Posted by R Friend R_Friend

댓글을 달아 주세요

이번 포스팅에서는 기본 Greenplum Database (이하 GPDB) 도커 이미지를 내려받아서, 그 위에 대용량 데이터 통계분석, 기계학습에 활용하는 MADlib, PL/R, PL/Python을 설치한 Docker Image 만든 후, Docker Hub에 올리는 일련의 절차에 대해서 소개하겠습니다. 


이번 포스팅은 도커로 GPDB 기반 분석 환경을 구성하는 절차로서, 데이터 엔지니어링에 관심있으신 분에게 도움이 될 것 같습니다. 혹시 데이터 분석으로 바로 넘어가고 싶은 분은 다음번 포스팅(http://rfriend.tistory.com/379)을 참고하시면 되며, 이번 포스팅을 skip 하여도 아무런 문제 없이 도커를 사용하여 GPDB 기반 분석 환경을 바로 바로 이용하실 수 있습니다. 



[ GPDB 기본 도커 이미지에 MADlib, PL/R, PL/Python 설치 후 gpdb-analytics 도커 이미지 새로 만들어서 Docker Hub에 올리기 절차 ]






0. Dokcer Hub 회원 가입 및 Docker Desktop 다운로드/설치




Windows OS 사용자의 경우 자신의 Windows 버전에 맞게 'Docker CE for Windows' 혹은 'Docker Toolbox'를 다운로드 받아 설치하면 됩니다. 





1. Docker Hub에서 기본 GPDB 이미지를 pull 해서 사용하기

 

<터미널 사용>

1-1.docker image download



docker pull hdlee2u/gpdb-base

docker images

REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE

centos                  7                   d123f4e55e12        9 months ago        197MB

hdlee2u/gpdb-base      latest              bfe4e63b8e81        2 years ago         1.17GB

 




1-2.docker image
실행/ 5432를 기본 포트로, ,ssh2022포트를 사용하여 접근 가능하도록 docker 이미지 실행 



docker run -i -d -p 5432:5432 -p 2022:22 --name gpdb  hdlee2u/gpdb-base

docker ps -a

 




1-3.docker image
중단, 시작 후 동작 상태 확인 



docker stop gpdb

docker start gpdb

docker ps

CONTAINER ID    IMAGE                   COMMAND                   CREATED             STATUS              PORTS                   NAMES

4e6b947be0d6    hdlee2u/gpdb-base   "/bin/sh -c 'echo \"1…"   29 hours ago        Up 3 hours        0.0.0.0:5432->5432/tcp, 0.0.0.0:2022->22/tcp   gpdb

ihongdon-ui-MacBook-Pro:~ ihongdon$

 




2. Docker GPDBMADlib 설치하기

 

2-1. GPDB version 확인 (PGAdmin III 에서)



# select version()

 

PostgreSQL 8.2.15 (Greenplum Database 4.3.7.1 build 1) on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.4.2 compiled on Jan 21 2016 15:51:02

 




2-2.Pivotal Network(https://network.pivotal.io)
에서 MADlib 다운로드 (회원가입 필요) 


Pivotal Greenplum Releases: 4.3.18.0 버전 카테고리에서

>> Greenplum Advanced Analytics 선택

>> MADlib 1.12 다운로드

(https://network.pivotal.io/products/pivotal-gpdb/#/releases/8538/file_groups/764)

 






2-3. MADlib downloads 한 파일을 docker로 복사



cd Downloads/

ls

madlib-1.12-gp4.3-rhel5-x86_64.tar.gz

 



docker exec -i -t gpdb /bin/bash

[root@4e6b947be0d6 ~]# mkdir /setup

 

[참고파일 옮길 때

[root@4e6b947be0d6 ~]# mv mad* /setup/

 




2-4. docker container 내부의 /bin/bash 프로세스 실행 후, MADlib 파일을 Docker GPDB에 복사하기

 

다른 터미널의 Downloads 경로에서


docker cp madlib-1.12-gp4.3-rhel5-x86_64.tar.gz gpdb:/setup/



[root@4e6b947be0d6 ~]# chown -R gpadmin:gpadmin /setup

[root@4e6b947be0d6 ~]# cd /setup

[root@4e6b947be0d6 setup]# ls -la

total 7492

drwxr-xr-x 2 gpadmin gpadmin    4096 Aug  8 07:44 .

drwxr-xr-x 1 root    root       4096 Aug  8 07:44 ..

-rw-r--r-- 1 gpadmin gpadmin 3932160 Aug  8 05:10 madlib-1.12-gp4.3-rhel5-x86_64.tar

-rw-r--r-- 1 gpadmin gpadmin 3728292 Aug 29  2017 madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg

 




2-5. 권한 부여

 


[root@4e6b947be0d6 ~]# chown -R gpadmin:gpadmin /setup

[root@4e6b947be0d6 ~]# cd /setup

[root@4e6b947be0d6 setup]# ls -la

total 7492

drwxr-xr-x 2 gpadmin gpadmin    4096 Aug  8 07:44 .

drwxr-xr-x 1 root    root       4096 Aug  8 07:44 ..

-rw-r--r-- 1 gpadmin gpadmin 3932160 Aug  8 05:10 madlib-1.12-gp4.3-rhel5-x86_64.tar

-rw-r--r-- 1 gpadmin gpadmin 3728292 Aug 29  2017 madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg

 




2-6. MADlib 압축 풀고 설치하기



[root@4e6b947be0d6 setup]# su - gpadmin

-bash-4.1$ cd /setup

-bash-4.1$ ls -la

total 7492

drwxr-xr-x 2 gpadmin gpadmin    4096 Aug  8 07:44 .

drwxr-xr-x 1 root    root       4096 Aug  8 07:44 ..

-rw-r--r-- 1 gpadmin gpadmin 3932160 Aug  8 05:10 madlib-1.12-gp4.3-rhel5-x86_64.tar

 

-bash-4.1$ tar xf madlib-1.12-gp4.3-rhel5-x86_64.tar

-bash-4.1$ ls -la

total 7692

drwxr-xr-x 2 gpadmin gpadmin    4096 Aug  8 07:45 .

drwxr-xr-x 1 root    root       4096 Aug  8 07:44 ..

-rw-r--r-- 1 gpadmin gpadmin 3932160 Aug  8 05:10 madlib-1.12-gp4.3-rhel5-x86_64.tar

-rw-r--r-- 1 gpadmin gpadmin 3728292 Aug 29  2017 madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg

-rw-r--r-- 1 gpadmin gpadmin  135530 Aug 29  2017 open_source_license_MADlib_1.12_GA.txt

-rw-r--r-- 1 gpadmin gpadmin   51900 Aug 29  2017 ReleaseNotes.txt

 

-bash-4.1$ gppkg -i madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg

20180808:07:47:11:000512 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Starting gppkg with args: -i madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg

20180808:07:47:11:000512 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Installing package madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg

20180808:07:47:11:000512 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Validating rpm installation cmdStr='rpm --test -i /usr/local/greenplum-db-4.3.7.1/.tmp/madlib-1.12-1.x86_64.rpm --dbpath /usr/local/greenplum-db-4.3.7.1/share/packages/database --prefix /usr/local/greenplum-db-4.3.7.1'

20180808:07:47:11:000512 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Installing madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg locally

20180808:07:47:11:000512 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Validating rpm installation cmdStr='rpm --test -i /usr/local/greenplum-db-4.3.7.1/.tmp/madlib-1.12-1.x86_64.rpm --dbpath /usr/local/greenplum-db-4.3.7.1/share/packages/database --prefix /usr/local/greenplum-db-4.3.7.1'

20180808:07:47:11:000512 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Installing rpms cmdStr='rpm -i /usr/local/greenplum-db-4.3.7.1/.tmp/madlib-1.12-1.x86_64.rpm --dbpath /usr/local/greenplum-db-4.3.7.1/share/packages/database --prefix=/usr/local/greenplum-db-4.3.7.1'

20180808:07:47:12:000512 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Completed local installation of madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg.

20180808:07:47:12:000512 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Please run the following command to deploy MADlib

usage:  madpack install [-s schema_name] -p greenplum -c user@host:port/database

Example:

       $ $GPHOME/madlib/bin/madpack install -s madlib -p greenplum -c gpadmin@mdw:5432/testdb

       This will install MADlib objects into a Greenplum database named "testdb"

       running on server "mdw" on port 5432. Installer will try to login as "gpadmin"

       and will prompt for password. The target schema will be "madlib".

       To upgrade to a new version of MADlib from version v1.0 or later, use option "upgrade",

       instead of "install"

For additional options run:

$ madpack --help

Release notes and additional documentation can be found at http://madlib.apache.org

20180808:07:47:12:000512 gppkg:4e6b947be0d6:gpadmin-[INFO]:-madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg successfully installed.

-bash-4.1$  madpack install ^C

-bash-4.1$ hostname

4e6b947be0d6

-bash-4.1$ cat /etc/hosts

127.0.0.1       localhost

::1      localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

172.17.0.2     4e6b947be0d6

127.0.0.1 72ba20be3774

 




Database list 확인


 

-bash-4.1$ psql

psql (8.2.15)

Type "help" for help.

 

gpadmin=# \l

                  List of databases

   Name    |  Owner  | Encoding |  Access privileges 

-----------+---------+----------+---------------------

 gpadmin   | gpadmin | UTF8     |

 postgres  | gpadmin | UTF8     |

 template0 | gpadmin | UTF8     | =c/gpadmin         

                                : gpadmin=CTc/gpadmin

 template1 | gpadmin | UTF8     | =c/gpadmin         

                                : gpadmin=CTc/gpadmin

(4 rows)

 

gpadmin=# \q




-bash-4.1$ $GPHOME/madlib/bin/madpack install -s madlib -p greenplum -c gpadmin@127.0.0.1:5432/gpadmin

madpack.py : INFO : Detected Greenplum DB version 4.3.7.

madpack.py : INFO : *** Installing MADlib ***

madpack.py : INFO : MADlib tools version    = 1.12 (/usr/local/greenplum-db-4.3.7.1/madlib/Versions/1.12/bin/../madpack/madpack.py)

madpack.py : INFO : MADlib database version = None (host=127.0.0.1:5432, db=gpadmin, schema=madlib)

madpack.py : INFO : Testing PL/Python environment...

madpack.py : INFO : > Creating language PL/Python...

madpack.py : INFO : > PL/Python environment OK (version: 2.6.2)

madpack.py : INFO : Installing MADlib into MADLIB schema...

madpack.py : INFO : > Creating MADLIB schema

madpack.py : INFO : > Creating MADLIB.MigrationHistory table

madpack.py : INFO : > Writing version info in MigrationHistory table

madpack.py : INFO : > Creating objects for modules:

madpack.py : INFO : > - array_ops

madpack.py : INFO : > - bayes

madpack.py : INFO : > - crf

madpack.py : INFO : > - elastic_net

madpack.py : INFO : > - linalg

madpack.py : INFO : > - pmml

madpack.py : INFO : > - prob

madpack.py : INFO : > - sketch

madpack.py : INFO : > - svec

madpack.py : INFO : > - svm

madpack.py : INFO : > - tsa

madpack.py : INFO : > - stemmer

madpack.py : INFO : > - conjugate_gradient

madpack.py : INFO : > - knn

madpack.py : INFO : > - lda

madpack.py : INFO : > - stats

madpack.py : INFO : > - svec_util

madpack.py : INFO : > - utilities

madpack.py : INFO : > - assoc_rules

madpack.py : INFO : > - convex

madpack.py : INFO : > - glm

madpack.py : INFO : > - graph

madpack.py : INFO : > - linear_systems

madpack.py : INFO : > - recursive_partitioning

madpack.py : INFO : > - regress

madpack.py : INFO : > - sample

madpack.py : INFO : > - summary

madpack.py : INFO : > - kmeans

madpack.py : INFO : > - pca

madpack.py : INFO : > - validation

madpack.py : INFO : MADlib 1.12 installed successfully in MADLIB schema.

 



 

스키마 리스트 & MADlib 버전 확인



-bash-4.1$ psql

psql (8.2.15)

Type "help" for help.

 

gpadmin=# \dn

       List of schemas

        Name        |  Owner 

--------------------+---------

 gp_toolkit         | gpadmin

 information_schema | gpadmin

 madlib             | gpadmin

 pg_aoseg           | gpadmin

 pg_bitmapindex     | gpadmin

 pg_catalog         | gpadmin

 pg_toast           | gpadmin

 public             | gpadmin

(8 rows)

 

gpadmin=# select madlib.version();

MADlib version: 1.12, git revision: rc/1.12-rc1, cmake configuration time: Wed Aug 23 22:33:09 UTC 2017, build type: Release, build system: Linux-2.6.18-238.27.1.el5.hot

fix.bz516490, C compiler: gcc 4.4.0, C++ compiler: g++ 4.4.0

(1 row)

 

---- MADlib 설치 성공 완료! ----

 

gpadmin=# \q

 




3. Docker GPDB
PL/R 설치하기 

 

Cent OS 버전 확인하기



-bash-4.1$ cat /etc/redhat-release

CentOS release 6.7 (Final)

 




3-1. Pivotal Network에서 PL/R 다운로드 하기

Pivotal Greenplum Releases: 4.3.18.0 카테고리에서

>> Greenplum Procedural Languages

>> PL/R for RHEL 6 다운로드

(https://network.pivotal.io/products/pivotal-gpdb/#/releases/8538/file_groups/768)

 




3-2. (다른 터미널에서) Docker GPDB/setup 폴더로 PL/R 복사하기



ihongdon-ui-MacBook-Pro:~ ihongdon$ cd Downloads/

ihongdon-ui-MacBook-Pro:Downloads ihongdon$ ls -la

total 90512

-rw-r--r--@  1 ihongdon  staff   3788987  8  8 14:10 madlib-1.12-gp4.3-rhel5-x86_64.tar.gz

-rw-r--r--@  1 ihongdon  staff  39640735  8  8 16:51 plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg

 

ihongdon-ui-MacBook-Pro:Downloads ihongdon$ docker cp plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg gpdb:/setup

 




3-3. (Docker
터미널에서) 권한 부여하기 및 gpadmin 들어가기 



[root@4e6b947be0d6 setup]# su - gpadmin

-bash-4.1$ ls

madlib-1.12-gp4.3-rhel5-x86_64.tar                     

open_source_license_MADlib_1.12_GA.txt  ReleaseNotes.txt

madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg 

plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg

-bash-4.1$ exit

logout

 

[root@4e6b947be0d6 setup]# chown gpadmin:gpadmin plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg

 

 [root@4e6b947be0d6 setup]# su - gpadmin

-bash-4.1$ cd /setup

-bash-4.1$ ls

madlib-1.12-gp4.3-rhel5-x86_64.tar                     

open_source_license_MADlib_1.12_GA.txt  ReleaseNotes.txt

madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg 

plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg

 

-bash-4.1$ ls -la

total 46404

drwxr-xr-x 2 gpadmin gpadmin     4096 Aug  8 07:52 .

drwxr-xr-x 1 root    root        4096 Aug  8 07:44 ..

-rw-r--r-- 1 gpadmin gpadmin  3932160 Aug  8 05:10 madlib-1.12-gp4.3-rhel5-x86_64.tar

-rw-r--r-- 1 gpadmin gpadmin      566 Aug 29  2017 ._madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg

-rw-r--r-- 1 gpadmin gpadmin  3728292 Aug 29  2017 madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg

-rw-r--r-- 1 gpadmin gpadmin     1362 Aug 29  2017 ._open_source_license_MADlib_1.12_GA.txt

-rw-r--r-- 1 gpadmin gpadmin   135530 Aug 29  2017 open_source_license_MADlib_1.12_GA.txt

-rw-r--r-- 1 gpadmin gpadmin 39640735 Aug  8 07:51 plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg

-rw-r--r-- 1 gpadmin gpadmin      594 Aug 29  2017 ._ReleaseNotes.txt

-rw-r--r-- 1 gpadmin gpadmin    51900 Aug 29  2017 ReleaseNotes.txt

 



 

3-4. PL/R 설치



-bash-4.1$ gppkg -i plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg

20180808:07:53:41:006779 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Starting gppkg with args: -i plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg

20180808:07:53:42:006779 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Installing package plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg

20180808:07:53:42:006779 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Validating rpm installation cmdStr='rpm --test -i /usr/local/greenplum-db-4.3.7.1/.tmp/R-3.3.3-1.x86_64.rpm /usr/local/greenplum-db-4.3.7.1/.tmp/plr-2.3-1.x86_64.rpm --dbpath /usr/local/greenplum-db-4.3.7.1/share/packages/database --prefix /usr/local/greenplum-db-4.3.7.1'

20180808:07:53:42:006779 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Installing plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg locally

20180808:07:53:42:006779 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Validating rpm installation cmdStr='rpm --test -i /usr/local/greenplum-db-4.3.7.1/.tmp/R-3.3.3-1.x86_64.rpm /usr/local/greenplum-db-4.3.7.1/.tmp/plr-2.3-1.x86_64.rpm --dbpath /usr/local/greenplum-db-4.3.7.1/share/packages/database --prefix /usr/local/greenplum-db-4.3.7.1'

20180808:07:53:42:006779 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Installing rpms cmdStr='rpm -i /usr/local/greenplum-db-4.3.7.1/.tmp/R-3.3.3-1.x86_64.rpm /usr/local/greenplum-db-4.3.7.1/.tmp/plr-2.3-1.x86_64.rpm --dbpath /usr/local/greenplum-db-4.3.7.1/share/packages/database --prefix=/usr/local/greenplum-db-4.3.7.1'

20180808:07:53:45:006779 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Completed local installation of plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg.

20180808:07:53:45:006779 gppkg:4e6b947be0d6:gpadmin-[INFO]:--

==========================================================================

PL/R installation is complete! To proceed, follow these steps:

1. Source your new $GPHOME/greenplum_path.sh file and restart the database.

2. Create PL/R language in the target database with "createlang plr -d mydatabase"

3. Optionally you can enable PL/R helper functions in this database by running

    "psql -f $GPHOME/share/postgresql/contrib/plr.sql -d mydatabase"

==========================================================================

20180808:07:53:45:006779 gppkg:4e6b947be0d6:gpadmin-[INFO]:-plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg successfully installed.

 




3-5. GPDB stop
 



-bash-4.1$ gpstop -af

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Starting gpstop with args: -af

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Gathering information and validating the environment...

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Obtaining Segment details from master...

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Greenplum Version: 'postgres (Greenplum Database) 4.3.7.1 build 1'

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-There are 2 connections to the database

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Commencing Master instance shutdown with mode='fast'

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Master host=72ba20be3774

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Detected 2 connections to database

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Switching to WAIT mode

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Will wait for shutdown to complete, this may take some time if

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-there are a large number of active complex transactions, please wait...

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Commencing Master instance shutdown with mode=fast

20180808:07:54:30:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Master segment instance directory=/gpdata/master/gpseg-1

20180808:07:54:31:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Attempting forceful termination of any leftover master process

20180808:07:54:31:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Terminating processes for segment /gpdata/master/gpseg-1

20180808:07:54:31:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-No standby master host configured

20180808:07:54:31:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Commencing parallel segment instance shutdown, please wait...

20180808:07:54:31:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-0.00% of jobs completed

20180808:07:54:41:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-100.00% of jobs completed

20180808:07:54:41:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-----------------------------------------------------

20180808:07:54:41:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-   Segments stopped successfully      = 2

20180808:07:54:41:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-   Segments with errors during stop   = 0

20180808:07:54:41:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-----------------------------------------------------

20180808:07:54:41:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Successfully shutdown 2 of 2 segment instances

20180808:07:54:41:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Database successfully shutdown with no errors reported

20180808:07:54:41:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Cleaning up leftover gpmmon process

20180808:07:54:41:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-No leftover gpmmon process found

20180808:07:54:41:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Cleaning up leftover gpsmon processes

20180808:07:54:41:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-No leftover gpsmon processes on some hosts. not attempting forceful termination on these hosts

20180808:07:54:41:006833 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Cleaning up leftover shared memory

 




3-6.
Source your new $GPHOME/greenplum_path.sh file 



-bash-4.1$ vi ~/.bash_profile

-bash-4.1$ source ~/.bash_profile

-bash-4.1$ env | grep R

MASTER_DATA_DIRECTORY=/gpdata/master/gpseg-1

TERM=xterm

USER=gpadmin

LD_LIBRARY_PATH=/usr/local/greenplum-db/./ext/R-3.3.3/lib:/usr/local/greenplum-db/./ext/R-3.3.3/extlib:

/usr/local/greenplum-db/./lib:

/usr/local/greenplum-db/./ext/python/lib:/usr/local/greenplum-db/./lib:/usr/local/greenplum-db/./ext/python/lib:

LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:

su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:

*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:

*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:

*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:

*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:

*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:

*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:

*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:

*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:

*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:

*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:

PATH=/usr/local/greenplum-db/./ext/R-3.3.3/bin:/usr/local/greenplum-db/./bin:/usr/local/greenplum-db/./ext/python/bin:/usr/local/greenplum-db/./bin:/usr/local/greenplum-db/./ext/python/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin

HISTCONTROL=ignoredups

R_HOME=/usr/local/greenplum-db/./ext/R-3.3.3

G_BROKEN_FILENAMES=1

 




3-7.
Create PL/R language in the target database with "createlang plr -d mydatabase" and restart the database. 



-bash-4.1$ createlang plr -d gpadmin

createlang: could not connect to database gpadmin: could not connect to server: No such file or directory

         Is the server running locally and accepting

         connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

 

-bash-4.1$ gpstart -a

20180808:07:56:17:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Starting gpstart with args: -a

20180808:07:56:17:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Gathering information and validating the environment...

20180808:07:56:17:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Greenplum Binary Version: 'postgres (Greenplum Database) 4.3.7.1 build 1'

20180808:07:56:17:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Greenplum Catalog Version: '201310150'

20180808:07:56:17:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Starting Master instance in admin mode

20180808:07:56:18:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information

20180808:07:56:18:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Obtaining Segment details from master...

20180808:07:56:18:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Setting new master era

20180808:07:56:18:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Master Started...

20180808:07:56:18:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Shutting down master

20180808:07:56:19:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Commencing parallel segment instance startup, please wait...

..

20180808:07:56:21:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Process results...

20180808:07:56:21:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-----------------------------------------------------

20180808:07:56:21:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-   Successful segment starts                                            = 2

20180808:07:56:21:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-   Failed segment starts                                                = 0

20180808:07:56:21:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-   Skipped segment starts (segments are marked down in configuration)   = 0

20180808:07:56:21:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-----------------------------------------------------

20180808:07:56:21:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-

20180808:07:56:21:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Successfully started 2 of 2 segment instances

20180808:07:56:21:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-----------------------------------------------------

20180808:07:56:21:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Starting Master instance 72ba20be3774 directory /gpdata/master/gpseg-1

20180808:07:56:22:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Command pg_ctl reports Master 72ba20be3774 instance active

20180808:07:56:23:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-No standby master configured.  skipping...

20180808:07:56:23:006995 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Database successfully started

 

-bash-4.1$ psql -f $GPHOME/share/postgresql/contrib/plr.sql -d gpadmin

SET

CREATE FUNCTION

CREATE FUNCTION

CREATE FUNCTION

REVOKE

CREATE FUNCTION

 

-bash-4.1$ exit

logout

 



 

4. DataSciencePython(PL/Python), DataScienceR 설치하기

 

4-1. Pivotal Network에서 PL/Python 다운로드 하기

Pivotal Greenplum Releases: 4.3.18.0 카테고리에서

>> Greenplum Procedural Languages

>> Python Data Science Package for RHEL 6다운로드

>> R Data Science Package for RHEL 6 다운로드

(https://network.pivotal.io/products/pivotal-gpdb/#/releases/8538/file_groups/768)

 


4-2. (다른 터미널에서) Docker GPDB로 파일 복사하기



ihongdon-ui-MacBook-Pro:Downloads ihongdon$ ls -la

total 549520

-rw-r--r--@  1 ihongdon  staff  103557483  8  8 16:58 DataSciencePython-1.0.0-gp4-rhel6-x86_64.gppkg

-rw-r--r--@  1 ihongdon  staff  114736878  8  8 16:58 DataScienceR-1.0.0-gp4-rhel6-x86_64.gppkg

-rw-r--r--@  1 ihongdon  staff    3788987  8  8 14:10 madlib-1.12-gp4.3-rhel5-x86_64.tar.gz

-rw-r--r--@  1 ihongdon  staff   39640735  8  8 16:51 plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg

 

ihongdon-ui-MacBook-Pro:Downloads ihongdon$ docker cp DataSciencePython-1.0.0-gp4-rhel6-x86_64.gppkg gpdb:/setup

ihongdon-ui-MacBook-Pro:Downloads ihongdon$ docker cp DataScienceR-1.0.0-gp4-rhel6-x86_64.gppkg gpdb:/setup

 




4-3. (Docker
터미널에서) 권한 부여 및 gpadmin 들어가기 



[root@4e6b947be0d6 setup]# chown gpadmin:gpadmin *.gppkg

[root@4e6b947be0d6 setup]# su - gpadmin

-bash-4.1$ ls

gpAdminLogs

-bash-4.1$ cd  /setup

-bash-4.1$ ls

DataSciencePython-1.0.0-gp4-rhel6-x86_64.gppkg 

madlib-1.12-gp4.3-rhel5-x86_64.tar                     

open_source_license_MADlib_1.12_GA.txt 

ReleaseNotes.txt

DataScienceR-1.0.0-gp4-rhel6-x86_64.gppkg      

madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg 

plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg

 

-bash-4.1$ ls -la

total 259584

drwxr-xr-x 2 gpadmin gpadmin      4096 Aug  8 07:59 .

drwxr-xr-x 1 root    root         4096 Aug  8 07:44 ..

-rw-r--r-- 1 gpadmin gpadmin 103557483 Aug  8 07:58 DataSciencePython-1.0.0-gp4-rhel6-x86_64.gppkg

-rw-r--r-- 1 gpadmin gpadmin 114736878 Aug  8 07:58 DataScienceR-1.0.0-gp4-rhel6-x86_64.gppkg

-rw-r--r-- 1 gpadmin gpadmin   3932160 Aug  8 05:10 madlib-1.12-gp4.3-rhel5-x86_64.tar

-rw-r--r-- 1 gpadmin gpadmin       566 Aug 29  2017 ._madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg

-rw-r--r-- 1 gpadmin gpadmin   3728292 Aug 29  2017 madlib-ossv1.12_pv1.9.9_gpdb4.3orca-rhel5-x86_64.gppkg

-rw-r--r-- 1 gpadmin gpadmin      1362 Aug 29  2017 ._open_source_license_MADlib_1.12_GA.txt

-rw-r--r-- 1 gpadmin gpadmin    135530 Aug 29  2017 open_source_license_MADlib_1.12_GA.txt

-rw-r--r-- 1 gpadmin gpadmin  39640735 Aug  8 07:51 plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg

-rw-r--r-- 1 gpadmin gpadmin       594 Aug 29  2017 ._ReleaseNotes.txt

-rw-r--r-- 1 gpadmin gpadmin     51900 Aug 29  2017 ReleaseNotes.txt

 




4-4. DataSciencePython
설치하기 



-bash-4.1$ gppkg -i DataSciencePython-1.0.0-gp4-rhel6-x86_64.gppkg

20180808:08:00:58:007333 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Starting gppkg with args: -i DataSciencePython-1.0.0-gp4-rhel6-x86_64.gppkg

20180808:08:00:59:007333 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Installing package DataSciencePython-1.0.0-gp4-rhel6-x86_64.gppkg

20180808:08:00:59:007333 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Validating rpm installation cmdStr='rpm --test -i /usr/local/greenplum-db-4.3.7.1/.tmp/DataSciencePython-1.0-0.x86_64.rpm --dbpath /usr/local/greenplum-db-4.3.7.1/share/packages/database --prefix /usr/local/greenplum-db-4.3.7.1'

20180808:08:00:59:007333 gppkg:4e6b947be0d6:gpadmin-[INFO]:-SQLITE3 Installed

20180808:08:01:00:007333 gppkg:4e6b947be0d6:gpadmin-[INFO]:-TK Not installed

20180808:08:01:00:007333 gppkg:4e6b947be0d6:gpadmin-[INFO]:-TCL Not installed

20180808:08:01:00:007333 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Installing DataSciencePython-1.0.0-gp4-rhel6-x86_64.gppkg locally

20180808:08:01:00:007333 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Validating rpm installation cmdStr='rpm --test -i /usr/local/greenplum-db-4.3.7.1/.tmp/DataSciencePython-1.0-0.x86_64.rpm --dbpath /usr/local/greenplum-db-4.3.7.1/share/packages/database --prefix /usr/local/greenplum-db-4.3.7.1'

20180808:08:01:01:007333 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Installing rpms cmdStr='rpm -i /usr/local/greenplum-db-4.3.7.1/.tmp/DataSciencePython-1.0-0.x86_64.rpm --dbpath /usr/local/greenplum-db-4.3.7.1/share/packages/database --prefix=/usr/local/greenplum-db-4.3.7.1'

20180808:08:01:14:007333 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Completed local installation of DataSciencePython-1.0.0-gp4-rhel6-x86_64.gppkg.

20180808:08:01:14:007333 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Please source your $GPHOME/greenplum_path.sh file and restart the database.

20180808:08:01:14:007333 gppkg:4e6b947be0d6:gpadmin-[INFO]:-DataSciencePython-1.0.0-gp4-rhel6-x86_64.gppkg successfully installed.

 




4-5. DataScienceR
설치하기 



-bash-4.1$ gppkg -i DataScienceR-1.0.0-gp4-rhel6-x86_64.gppkg

20180808:08:01:48:007393 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Starting gppkg with args: -i DataScienceR-1.0.0-gp4-rhel6-x86_64.gppkg

20180808:08:01:48:007393 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Installing package DataScienceR-1.0.0-gp4-rhel6-x86_64.gppkg

20180808:08:01:49:007393 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Validating rpm installation cmdStr='rpm --test -i /usr/local/greenplum-db-4.3.7.1/.tmp/DataScienceR-1.0-0.x86_64.rpm --dbpath /usr/local/greenplum-db-4.3.7.1/share/packages/database --prefix /usr/local/greenplum-db-4.3.7.1'

20180808:08:01:49:007393 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Installing DataScienceR-1.0.0-gp4-rhel6-x86_64.gppkg locally

20180808:08:01:50:007393 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Validating rpm installation cmdStr='rpm --test -i /usr/local/greenplum-db-4.3.7.1/.tmp/DataScienceR-1.0-0.x86_64.rpm --dbpath /usr/local/greenplum-db-4.3.7.1/share/packages/database --prefix /usr/local/greenplum-db-4.3.7.1'

20180808:08:01:50:007393 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Installing rpms cmdStr='rpm -i /usr/local/greenplum-db-4.3.7.1/.tmp/DataScienceR-1.0-0.x86_64.rpm --dbpath /usr/local/greenplum-db-4.3.7.1/share/packages/database --prefix=/usr/local/greenplum-db-4.3.7.1'

20180808:08:02:05:007393 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Completed local installation of DataScienceR-1.0.0-gp4-rhel6-x86_64.gppkg.

20180808:08:02:05:007393 gppkg:4e6b947be0d6:gpadmin-[INFO]:-Please source your $GPHOME/greenplum_path.sh file and restart the database.

20180808:08:02:05:007393 gppkg:4e6b947be0d6:gpadmin-[INFO]:-DataScienceR-1.0.0-gp4-rhel6-x86_64.gppkg successfully installed.

 




4-6. source path
설정 


-bash-4.1$ source $GPHOME/greenplum_path.sh




4-7. GPDB stop
 



-bash-4.1$ gpstop -af

20180808:08:02:18:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Starting gpstop with args: -af

20180808:08:02:18:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Gathering information and validating the environment...

20180808:08:02:18:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information

20180808:08:02:18:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Obtaining Segment details from master...

20180808:08:02:18:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Greenplum Version: 'postgres (Greenplum Database) 4.3.7.1 build 1'

20180808:08:02:18:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-There are 0 connections to the database

20180808:08:02:18:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Commencing Master instance shutdown with mode='fast'

20180808:08:02:18:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Master host=72ba20be3774

20180808:08:02:18:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Detected 0 connections to database

20180808:08:02:18:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Using standard WAIT mode of 120 seconds

20180808:08:02:18:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Commencing Master instance shutdown with mode=fast

20180808:08:02:18:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Master segment instance directory=/gpdata/master/gpseg-1

20180808:08:02:19:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Attempting forceful termination of any leftover master process

20180808:08:02:20:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Terminating processes for segment /gpdata/master/gpseg-1

20180808:08:02:20:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-No standby master host configured

20180808:08:02:20:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Commencing parallel segment instance shutdown, please wait...

20180808:08:02:20:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-0.00% of jobs completed

20180808:08:02:30:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-100.00% of jobs completed

20180808:08:02:30:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-----------------------------------------------------

20180808:08:02:30:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-   Segments stopped successfully      = 2

20180808:08:02:30:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-   Segments with errors during stop   = 0

20180808:08:02:30:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-----------------------------------------------------

20180808:08:02:30:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Successfully shutdown 2 of 2 segment instances

20180808:08:02:30:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Database successfully shutdown with no errors reported

20180808:08:02:30:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Cleaning up leftover gpmmon process

20180808:08:02:30:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-No leftover gpmmon process found

20180808:08:02:30:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Cleaning up leftover gpsmon processes

20180808:08:02:30:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-No leftover gpsmon processes on some hosts. not attempting forceful termination on these hosts

20180808:08:02:30:007430 gpstop:4e6b947be0d6:gpadmin-[INFO]:-Cleaning up leftover shared memory

 




4-8. GPDB restart
 



-bash-4.1$ gpstart -a

20180808:08:02:39:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Starting gpstart with args: -a

20180808:08:02:39:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Gathering information and validating the environment...

20180808:08:02:39:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Greenplum Binary Version: 'postgres (Greenplum Database) 4.3.7.1 build 1'

20180808:08:02:39:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Greenplum Catalog Version: '201310150'

20180808:08:02:39:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Starting Master instance in admin mode

20180808:08:02:40:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information

20180808:08:02:40:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Obtaining Segment details from master...

20180808:08:02:40:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Setting new master era

20180808:08:02:40:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Master Started...

20180808:08:02:40:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Shutting down master

20180808:08:02:42:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Commencing parallel segment instance startup, please wait...

..

20180808:08:02:44:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Process results...

20180808:08:02:44:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-----------------------------------------------------

20180808:08:02:44:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-   Successful segment starts                                            = 2

20180808:08:02:44:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-   Failed segment starts                                                = 0

20180808:08:02:44:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-   Skipped segment starts (segments are marked down in configuration)   = 0

20180808:08:02:44:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-----------------------------------------------------

20180808:08:02:44:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-

20180808:08:02:44:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Successfully started 2 of 2 segment instances

20180808:08:02:44:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-----------------------------------------------------

20180808:08:02:44:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Starting Master instance 72ba20be3774 directory /gpdata/master/gpseg-1

20180808:08:02:45:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Command pg_ctl reports Master 72ba20be3774 instance active

20180808:08:02:45:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-No standby master configured.  skipping...

20180808:08:02:45:007584 gpstart:4e6b947be0d6:gpadmin-[INFO]:-Database successfully started

-bash-4.1$

-bash-4.1$

 



 

5. Docker 이미지 만들고, Docker Hub에 올리기

 

5-1. Docker 이미지 만들고, 생성 여부 확인하기



 # Docker 이미지 만들기 : $ docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]


ihongdon-ui-MacBook-Pro:~ ihongdon$ docker commit \

-a "pivotal-data-science-holee" \

-m "GPDB 4.37 with MADlib, PL/R, PL/Python" \

gpdb \

gpdb-analytics:first

sha256:c1450e5e5a58f0518ce747a408846968b3a8d2746e6a147c1a3d8ce2910dfff1

ihongdon-ui-MacBook-Pro:~ ihongdon$

ihongdon-ui-MacBook-Pro:~ ihongdon$ docker images

REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE

gpdb-analytics                     first               c1450e5e5a58        3 minutes ago       2.83GB

centos                             7                   d123f4e55e12        9 months ago        197MB

pivotaldata/gpdb-base              latest              bfe4e63b8e81        2 years ago         1.17GB

ihongdon-ui-MacBook-Pro:~ ihongdon$

 


 

 

5-2. Docker ImageTag 추가 후 Docker Hub에 올리기(push)



 # Tag 추가 : $ docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]


ihongdon-ui-MacBook-Pro:~ ihongdon$ docker tag gpdb-analytics:first hdlee2u/gpdb-analytics:latest

ihongdon-ui-MacBook-Pro:~ ihongdon$

ihongdon-ui-MacBook-Pro:~ ihongdon$ docker images

REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE

hdlee2u/gpdb-analytics             latest               c1450e5e5a58        About an hour ago   2.83GB

gpdb-analytics                     first               c1450e5e5a58        About an hour ago   2.83GB

centos                             7                   d123f4e55e12        9 months ago        197MB

pivotaldata/gpdb-base              latest              bfe4e63b8e81        2 years ago         1.17GB

 

# Docker Hub 로그인

ihongdon-ui-MacBook-Pro:~ ihongdon$ docker login

Authenticating with existing credentials...

Login Succeeded

 



 # Docker Hub에 도커 이미지 올리기 : $ docker push [OPTIONS] NAME[:TAG]


ihongdon-ui-MacBook-Pro:~ ihongdon$ docker push hdlee2u/gpdb-analytics:latest

The push refers to repository [docker.io/hdlee2u/gpdb-analytics]

e603ef714b8e: Pushing [========>                                          ]  275.1MB/1.663GB

8c65eead2327: Mounted from hdlee2u/gpdb-base

516e5ab465c7: Mounted from hdlee2u/gpdb-base

5f70bf18a086: Mounted from hdlee2u/gpdb-base

69bd93b9db4e: Mounted from hdlee2u/gpdb-base





[ https://hub.docker.com/r/hdlee2u/gpdb-analytics/ 에 gpdb-analytics 도커 이미지 올라간 모습 ]




다음번 포스팅에서는 Docker Hub에서 gpdb-ds 도커 이미지를 내려 받아서 사용할 수 있는 방법에 대해서 소개하겠습니다. 


많은 도움이 되었기를 바랍니다. 



Posted by R Friend R_Friend

댓글을 달아 주세요

이번 포스팅에서는 Greenplum Database (Data Platform)에 대해서 소개하겠습니다. 


세상에는 여러 개의 Database가 존재합니다.  그중에서도 Greenplum Database (줄여서 GPDB라고도 부름)은 MPP(Massively Parallel Processing) 아키텍처 기반의 Open Source RDBMS 에 해당합니다. 


Greenplum Database Community 홈페이지에 가보면 Greenplum DB를 "세계 최초의 오픈소스 & MPP 데이터 플랫폼 (The World's First Open-Source & Massively Parallel Data Platform)" 이라고 소개하고 있습니다. 



[ Greenplum Database, "The World's First Open-Source & Massively Parallel Data Platform" ]




Greenplum DB (이하 GPDB)는 2003년 미국 캘리포니아 산호세에서 처음 시작해서 2010년에 EMC에 인수되었습니다. 그리고 2012년부터는 Pivotal Greenplum Database로 이름이 바뀌었으며, 기업용의 상용SW로 Pivotal Software에서 판매, 유지보수 서비스를 하고 있습니다. 그리고 현재까지 오픈소스 커뮤니티와 Pivotal에서 Agile방법론에 입각해서 지속적으로 업그레이드를 하고 있습니다. 


왜 수십~수백 테라 바이트, 수 페타바이트 급의 빅데이터 분석에 MPP 아키텍처인지가 필요한지에 대한 이해를 돕기 위해서, SMP(Symmetric Multi-Processing) 와 MPP(Massively Prarallel Processing) 아키텍처에 대해서 간략히 설명드리겠습니다. 



[ SMP(Symmetric Multi-Processing) vs. MPP(Massively Parallel Processing) ]





SMP(Symmetric Multi-Processing) 아키텍처는 보통 "Shard Everything Architecture"라고도 하는데요, 모든 CPU가 하나의 메모리와 디스크를 사용합니다. 따라서 관리가 편리한 장점이 있는 반면에 관리/분석해야하는 데이터 용량이 커지면 Scale Up 하는데 한계를 가지게 됩니다. 


반면에 MPP(Massively Parallel Processing) 아키텍처는 "Shared Nothing Architecture"라고도 하는데요, 데이터가 여러개의 디스크에 분산되어 저장이 되며, 여러개의 CPU가 각각 메모리와 디스크를 할당받아 이용을 하게 됨에 따라 분산병렬처리가 가능하게 됩니다. 데이터 용량을 늘리려면 디스크, 메모리, CPU를 옆으로 계속 확장하여 네트워크로 연결을 해주는 Scale Out 방식을 취하면 되어 이론적으로는 계속 확장을 할 수 있습니다. 그리고 분산병렬처리를 하게 됨에 따라 노드 수에 비례하여 연산의 속도가 빨라집니다. 단점으로는 SMP 아키텍처 대비 상대적으로 복잡하고 관리가 어려우며 비용이 비싸다는 점입니다. 


Greenplum Database는 PostgreSQL 기반의 MPP 아키텍처의 장점을 가지면서, Proprietary Commercial DB들 대비 오픈소스로서 상대적으로 TCO(Total Cost of Ownership)이 낮고 혁신의 속도가 빠르다는 장점이 있습니다. 그리고 Pivotal Software에서 기업용으로 판매, 유지보수 지원을 해주므로 기업에서 도입하여 사용하기에도 문제가 없다고 하겠습니다. 


Pivotal은 Agile S/W 개발 방법론과 DevOps라는 개념을 처음으로 주창했던 기업(Pivotal Labs)이며, PCF(Pivotal Cloud Foundry)라는 Cloud Platform도 개발, 판매하는 소프트웨어 개발회사입니다. 올해 2018년 4월 달에 나스닥에 상장하기도 하였습니다.  Pivotal은 소프트웨어 회사 중에서도 가장 선도적이고 적극적으로 오픈 소스 철학을 지지하고 커미터로 참여하고 있는 기업입니다. 



[ Pivotal Greenplum and Open Source Eco. ]



Kafka, Spring Cloud Data Flow, RabbitMQ, redis, GemFire 등을 사용하여 실시간 데이터(Fast Data)를 수집/처리하는데요, Greenplum DB와 연동하여 데이터를 수집/저장할 수 있습니다. 


Greenplum DB는 또한 Cloudera, Hortonworks, MapR 등의 하둡 플랫폼과도 전용 connector로 연동하여 하둡 파일 시스템 내의 대용량 데이터를 분산 병렬로 데이터를 매우 빠르게 로딩할 수도 있습니다. 



[ MPP(Massively Parallel Processing) 기반의 Greenplum 아키텍처 ]





특히, 초대용량 데이터를 분석하는 데이터 분석가, 데이터 과학자의 입장에서는 SQL로 데이터 전처리, 집계, 분석과 함께 SQL로 빅데이터 기계학습을 할 수 있는 MADlib, R과 Python의 다양한 통계, 기계학습 라이브러리를 Greenplum DB에 설치하여 대용량 데이터를 분산병렬로 분석, 모델 학습, 스코어링 등이 가능합니다. R, Python, Java, C, Perl 등의 프로그래밍 언어를 가지고 DB 내에서 분산병렬로 사용할 수 있는 PL/x(Procedutal Language) 기능도 지원함에 따라 복잡한 사용자 정의 함수를 프로그래밍하여 사용할 수 있는 엄청난 매력이 있습니다. 


보통 R이나 Python, MATLAB, SAS 등으로 데이터를 분석할 때 DB로 부터 데이터를 내려받고, 다시 로딩하고하고, 분석 결과를 다시 DB로 옮기고 하는데 엄청나게 많은 시간이 소요되며, 시스템 운영 상에도 복잡성을 높여 관리의 어려움을 가중시키곤 합니다. 그리고 R, Python 등을 사용하려면 분석 컴퓨터의 디스크, 메모리가 감당할 수 있는 수준의 데이터 양만 가지고 분석을 할 수 있으므로 보통 샘플링한 데이터를 가지고 분석을 하게 됨에 따라 분석의 정확도(과적합 위험)를 제약하는 한계도 가집니다. 


그런데 Greenplum Database를 사용하면 In-Database 에서 데이터의 이동 없이 초대용량 데이터를 분산병렬처리로 분석, 기계학습할 수 있습니다. 



[ Greenplum : In-Database 정형 & 비정형 데이터 통합 분석 플랫폼 ]




또한 Greenplum DB는 정형데이터 뿐만 아니라, 텍스트 데이터(w/ Solr 기반 GPText), 지리데이터(w/ PostGIS), 그래프데이터(MADlib) 분석도 하나의 DB 안에서 정형 데이터와 연계하여 통합 분석, 기계학습이 모두 가능함에 따라 분석의 자유도와 그동안은 찾을 수 없었던 새로운 인사이트를 도출할 수 있는 매우 강력한 차세대 분석 플랫폼입니다. 


Greenplum DB는 On-premise 뿐만 아니라 가상화 환경 위에 Private Cloud, Public Cloud (Amazon AWS, Google Cloud, Microsoft Azure) 위에서도 구동 가능합니다. (도커 컨테이너 기반 Greenplum 은 '18년 하반기)



[ On-premise, 가상화 환경, 클라우드 환경에서 모두 구동되는 Greenplum ]





초대용량의 정형 & 비정형 데이터를 망라해서 통계분석, 기계학습을 필요로 하는 기업, 데이터 과학자, 데이터 엔지니어라면 Greenplum DB는 첫번째로 꼽을 수 있는 차세대 분석 플랫폼이라고 할 수 있습니다. 


다음번 포스팅에서는 Greenplum DB에 MADlib, PL/R, PL/Python 을 설치하여 Docker Image로 만들어서 Docker Hub에 올리는 방법을 소개하겠습니다. 


많은 도움이 되었기를 바랍니다. 


[Reference site]

(1) https://pivotal.io/

(2) https://network.pivotal.io/

(3) https://greenplum.org/

(4) https://github.com/greenplum-db

(5) http://madlib.apache.org/

(6) https://gptext.docs.pivotal.io/

(7) Greenplum Database: The First Open Source Data Warehouse (https://www.youtube.com/watch?v=E11aE38YoQ0)


마지막으로 Pivotal의 Greenplum DB product manager인 Ivan Novick의 유튜브 발표 자료 공유합니다. 



Posted by R Friend R_Friend

댓글을 달아 주세요

이번 포스팅에서는 터미널에서 사용할 수 있는 Git 기본 명령어,  Branch 만들기 합치기, 원격 repository에 push 하고 pull 하는 Git 명령어 사용법을 알아보겠습니다. 



  1. Git 기본 사용법


  • git init : repository 초기화


ihongdon-ui-MacBook-Pro:GitHub ihongdon$ mkdir git-test

ihongdon-ui-MacBook-Pro:GitHub ihongdon$ cd git-test

ihongdon-ui-MacBook-Pro:git-test ihongdon$ pwd

/Users/ihongdon/Documents/GitHub/git-test


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git init

Initialized empty Git repository in /Users/ihongdon/Documents/GitHub/git-test/.git/

 




  • git status : repository 상태 확인


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git status

On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

 




  • README.md 파일 생성


ihongdon-ui-MacBook-Pro:git-test ihongdon$ touch READMD.md

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git status

On branch master


No commits yet


Untracked files:

  (use "git add <file>..." to include in what will be committed)


READMD.md


nothing added to commit but untracked files present (use "git add" to track)

 




  • git add : stage 영역에 파일을 추가하여 git repository에서 파일을 관리하도록 해줌


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git status

On branch master


No commits yet


Changes to be committed:

  (use "git rm --cached <file>..." to unstage)


new file:   READMD.md

 




  • git commit : repository에 변경 내용을 기록 ( -m : 한줄의 commit 메시지 기록)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "commit of README.md file"

[master (root-commit) d337268] commit of README.md file

 1 file changed, 2 insertions(+)

 create mode 100644 READMD.md

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git status

On branch master

nothing to commit, working tree clean

 




  • git log : repository에 commite된 로그를 확인


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log

commit d337268ccec9ffcb3a19d6d1ec86304b791ae093 (HEAD -> master)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 16:51:55 2018 +0900


    commit of README.md file

 




  • git log --pretty=short : commit 메시지의 첫 번째 줄만 출력(여러 개의 commit 파악 용이)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log --pretty=short

commit d337268ccec9ffcb3a19d6d1ec86304b791ae093 (HEAD -> master)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>


    commit of README.md file

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git log filename : 선택한 폴더 혹은 파일의 로그만 출력하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log READMD.md 

commit d337268ccec9ffcb3a19d6d1ec86304b791ae093 (HEAD -> master)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 16:51:55 2018 +0900


    commit of README.md file

i-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git log -p filename : 파일의 변경된 내용을 출력하여 확인하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log -p READMD.md 

commit d337268ccec9ffcb3a19d6d1ec86304b791ae093 (HEAD -> master)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 16:51:55 2018 +0900


    commit of README.md file


diff --git a/READMD.md b/READMD.md

new file mode 100644

index 0000000..c90fe08

--- /dev/null

+++ b/READMD.md

@@ -0,0 +1,2 @@

+This is a git-test repository. 

+I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git diff : working tree, stage 영역, 최신 commit 사이의 변경 내역을 확인 
    => working tree와 stage 영역의 차이를 확인


git diffihongdon-ui-MacBook-Pro:git-test ihongdon$ git diff

diff --git a/READMD.md b/READMD.md

index c90fe08..2424cd6 100644

--- a/READMD.md

+++ b/READMD.md

@@ -1,2 +1,6 @@

+# Git Tutorial

+

+## version 1

+

 This is a git-test repository. 

 I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$

 




  • git add 명령어로 stage 영역에 README.md 파일을 추가한 후 git diff 명령어를 사용하면 working tree와 stage 영역 사이의 차이가 없으므로 아무것도 표시되지 않습니다. 


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git diff

ihongdon-ui-MacBook-Pro:git-test ihongdon$ # 아무것도 표시되지 않음

 




  • git diff HEAD : working tree에서 최신의 변경 부분을 확인하기 (HEAD는 현재 작업하고 있는 branch의 최신 commit을 참조하는 포인터)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git diff HEAD

diff --git a/READMD.md b/READMD.md

index c90fe08..2424cd6 100644

--- a/READMD.md

+++ b/READMD.md

@@ -1,2 +1,6 @@

+# Git Tutorial

+

+## version 1

+

 This is a git-test repository. 

 I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git commit -m : 수정사항 commit


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "Add title and version"

[master ea87d54] Add title and version

 1 file changed, 4 insertions(+)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git log : commit 확인


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log

commit ea87d546d8649ea000d071727c0b14e870bc714e (HEAD -> master)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 17:30:31 2018 +0900


    Add title and version


commit d337268ccec9ffcb3a19d6d1ec86304b791ae093

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 16:51:55 2018 +0900


    commit of README.md file

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  2. Branch 생성하고 합치기


  • git branch : 현재 사용하고 있는 branch 확인 하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git branch

* master

 




  • git checkout -b branch_name : 새로운 branch를 만들고, 새로운 branch로 변경하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout -b readme-edit-v2

Switched to a new branch 'readme-edit-v2'


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git branch # current branch check

  master

* readme-edit-v2

 





  • 'readme-edit-v2' branch 에서 date 추가하고 commit 하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ vi READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1


### date : as of 5th Aug.


This is a git-test repository. 

I'm writing README.md file as a test.


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "Add date"

[readme-edit-v2 8254c2e] Add date

 1 file changed, 2 insertions(+)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log

commit 8254c2e24c83e0e3f8e843228ca84fbba8998e54 (HEAD -> readme-edit-v2)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 19:30:04 2018 +0900


    Add date


commit ea87d546d8649ea000d071727c0b14e870bc714e (master)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 17:30:31 2018 +0900


    Add title and version


commit d337268ccec9ffcb3a19d6d1ec86304b791ae093

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 16:51:55 2018 +0900


    commit of README.md file

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git checkout master : master branch로 변경


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout master

Switched to branch 'master'

 




>> 아직 master branch에 'readme-edit-v2' branch의 변경사항이 반영되지 않았음

 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1


This is a git-test repository. 

I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$





  • git merge --no-f topic_branch_name : Topic branch를 master branch에 통합하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git merge --no-ff readme-edit-v2


아래와 같은 에디터가 나타납니다. 


hint: Waiting for your editor to close the file... 

Merge branch 'readme-edit-v2'

  

# Please enter a commit message to explain why this merge is necessary,

# especially if it merges an updated upstream into a topic branch.

#

# Lines starting with '#' will be ignored, and an empty message aborts

# the commit.



에디터를 저장하고 종료(esc 후 :wq!)하면 아래와 같은 메시지가 나옵니다. 


Merge made by the 'recursive' strategy.

 READMD.md | 2 ++

 1 file changed, 2 insertions(+)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




>> date 통합 확인



ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1


### date : as of 5th Aug.


This is a git-test repository. 

I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git log --graph : branch 분기 또는 통합을 그래프로 표시


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log --graph

*   commit f36bf439021e2220a56c01e6bf7e20ea897c8598 (HEAD -> master)

|\  Merge: ea87d54 8254c2e

| | Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

| | Date:   Sun Aug 5 19:55:05 2018 +0900

| | 

| |     Merge branch 'readme-edit-v2'

| | 

| * commit 8254c2e24c83e0e3f8e843228ca84fbba8998e54 (readme-edit-v2)

|/  Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

|   Date:   Sun Aug 5 19:30:04 2018 +0900

|   

|       Add date

* commit ea87d546d8649ea000d071727c0b14e870bc714e

| Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

| Date:   Sun Aug 5 17:30:31 2018 +0900

|     Add title and version

* commit d337268ccec9ffcb3a19d6d1ec86304b791ae093

  Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

  Date:   Sun Aug 5 16:51:55 2018 +0900

  

      commit of README.md file

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




######################################################################


  • git reset : 과거 상태로 되돌리기 (다른 위치의 repository에는 영향 없음)   
    --> readme-edit-v2 통합하기 이전 상태로 되돌리기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git reset --hard ea87d546d8649ea000d071727c0b14e870bc714e

HEAD is now at ea87d54 Add title and version

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git branch

* master

  readme-edit-v2

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1


This is a git-test repository. 

I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 







  • git checkout -b readme-edit-v3 : readme-edit-v3라는 이름의 새로운 branch 생성


 ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout -b readme-edit-v3

Switched to a new branch 'readme-edit-v3'


ihongdon-ui-MacBook-Pro:git-test ihongdon$ vi READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 3


### new topic branch readme-edit-v3


This is a git-test repository. 

I'm writing README.md file as a test.





  • git reflog : 현재 repository에서 수행된 모든 commit 로그 확인 하기 
    (vs. git log 명령어는 현재 branch의 로그만 확인 가능)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git reflog

ea87d54 (HEAD -> readme-edit-v3, master) HEAD@{0}: checkout: moving from master to readme-edit-v3

ea87d54 (HEAD -> readme-edit-v3, master) HEAD@{1}: reset: moving to ea87d546d8649ea000d071727c0b14e870bc714e

f36bf43 HEAD@{2}: merge readme-edit-v2: Merge made by the 'recursive' strategy.

ea87d54 (HEAD -> readme-edit-v3, master) HEAD@{3}: checkout: moving from readme-edit-v2 to master

8254c2e (readme-edit-v2) HEAD@{4}: checkout: moving from master to readme-edit-v2

ea87d54 (HEAD -> readme-edit-v3, master) HEAD@{5}: checkout: moving from readme-edit-v2 to master

8254c2e (readme-edit-v2) HEAD@{6}: commit: Add date

ea87d54 (HEAD -> readme-edit-v3, master) HEAD@{7}: checkout: moving from master to readme-edit-v2

ea87d54 (HEAD -> readme-edit-v3, master) HEAD@{8}: commit: Add title and version

d337268 HEAD@{9}: commit (initial): commit of README.md file

 




  • git reset --hard log_hash : 다시 'readme-edit-v2' 분리 하기 이전 상태로 되돌리기 (reset)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout master

M READMD.md

Switched to branch 'master'

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git reset --hard f36bf43

HEAD is now at f36bf43 Merge branch 'readme-edit-v2'

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 


ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1


### date : as of 5th Aug.


This is a git-test repository. 

I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




>> git commit  



ihongdon-ui-MacBook-Pro:git-test ihongdon$ vi READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial

## version 3

## readme-edit-v3

i

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "readme edit version 3"

[readme-edit-v3 59e4132] readme edit version 3

 1 file changed, 2 insertions(+), 2 deletions(-)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git reflog : 현재 repository에서 수행된 모든 commit 로그 확인 하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git reflog

59e4132 (HEAD -> readme-edit-v3) HEAD@{0}: commit: readme edit version 3

ea87d54 HEAD@{1}: checkout: moving from master to readme-edit-v3

f36bf43 (master) HEAD@{2}: reset: moving to f36bf43

ea87d54 HEAD@{3}: checkout: moving from readme-edit-v3 to master

ea87d54 HEAD@{4}: checkout: moving from master to readme-edit-v3

ea87d54 HEAD@{5}: reset: moving to ea87d546d8649ea000d071727c0b14e870bc714e

f36bf43 (master) HEAD@{6}: merge readme-edit-v2: Merge made by the 'recursive' strategy.

ea87d54 HEAD@{7}: checkout: moving from readme-edit-v2 to master

8254c2e (readme-edit-v2) HEAD@{8}: checkout: moving from master to readme-edit-v2

ea87d54 HEAD@{9}: checkout: moving from readme-edit-v2 to master

8254c2e (readme-edit-v2) HEAD@{10}: commit: Add date

ea87d54 HEAD@{11}: checkout: moving from master to readme-edit-v2

ea87d54 HEAD@{12}: commit: Add title and version

d337268 HEAD@{13}: commit (initial): commit of README.md file

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git commit --amend : 직전에 작성했던 commit 메시지 수정


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit --amend

hint: Waiting for your editor to close the file... 

Merge branch 'readme-edit-v3'

  

# Please enter the commit message for your changes. Lines starting

# with '#' will be ignored, and an empty message aborts the commit.

#

# Date:      Sun Aug 5 20:26:01 2018 +0900

#

# On branch master

# Changes to be committed:

#       modified:   READMD.md


[master 7b45ed5] amend commit message by using git commit --amend Merge branch 'readme-edit-v3'

 Date: Sun Aug 5 20:26:01 2018 +0900

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git log graph : branch 분기 또는 통합을 그래프로 표시


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log --graph

*   commit 7b45ed51381013214cddf19e02e4df38b83587e4 (HEAD -> master)

|\  Merge: f36bf43 59e4132

| | Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

| | Date:   Sun Aug 5 20:26:01 2018 +0900

| | 

| |     amend commit message by using git commit --amend

| |     Merge branch 'readme-edit-v3'

| | 

| * commit 59e4132d3928f580c3a26613b83220af04d13540 (readme-edit-v3)

| | Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

| | Date:   Sun Aug 5 20:23:47 2018 +0900

| | 

| |     readme edit version 3

| |   

* |   commit f36bf439021e2220a56c01e6bf7e20ea897c8598

|\ \  Merge: ea87d54 8254c2e

| |/  Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

|/|   Date:   Sun Aug 5 19:55:05 2018 +0900

| |   

| |       Merge branch 'readme-edit-v2'

| | 

| * commit 8254c2e24c83e0e3f8e843228ca84fbba8998e54 (readme-edit-v2)

|/  Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

|   Date:   Sun Aug 5 19:30:04 2018 +0900

|   

|       Add date

* commit ea87d546d8649ea000d071727c0b14e870bc714e

| Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

| Date:   Sun Aug 5 17:30:31 2018 +0900

|     Add title and version

* commit d337268ccec9ffcb3a19d6d1ec86304b791ae093

  Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

  Date:   Sun Aug 5 16:51:55 2018 +0900

  

      commit of README.md file

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git rebase -i HEAD~2 : 코드를 수정하고 commit 한 뒤에, 바로 앞의 commit에 합치기 
    (간단한 오탈자 수정 시 자주 사용)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout -b readmd-edit-v4

Switched to a new branch 'readmd-edit-v4'

ihongdon-ui-MacBook-Pro:git-test ihongdon$ vi READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial

## version 3

## readme-edit-v3

## readyou-edit-v4. <- 오탈자


### date : as of 5th Aug.


This is a git-test repository. 

I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "readme-edit-v4"

[readmd-edit-v4 b2e7b0b] readme-edit-v4

 1 file changed, 1 insertion(+)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ vi READMD.md  # 오탈자 수정함

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git diff

diff --git a/READMD.md b/READMD.md

index 2b9a28f..91bda6a 100644

--- a/READMD.md

+++ b/READMD.md

@@ -1,7 +1,7 @@

 # Git Tutorial

 ## version 3

 ## readme-edit-v3

-## readyou-edit-v4

+## readme-edit-v4

 

 ### date : as of 5th Aug.

 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "Fix typo"

[readmd-edit-v4 71d869f] Fix typo

 1 file changed, 1 insertion(+), 1 deletion(-)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git rebase -i HEAD~2


pick b2e7b0b readme-edit-v4

pick 71d869f Fix typo


# Rebase 7b45ed5..71d869f onto 7b45ed5 (2 commands)

#

# Commands:

# p, pick <commit> = use commit

# r, reword <commit> = use commit, but edit the commit message

# e, edit <commit> = use commit, but stop for amending

# s, squash <commit> = use commit, but meld into previous commit

# f, fixup <commit> = like "squash", but discard this commit's log message

# x, exec <command> = run command (the rest of the line) using shell

# d, drop <commit> = remove commit

# l, label <label> = label current HEAD with a name

# t, reset <label> = reset HEAD to a label

# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]

# .       create a merge commit using the original merge commit's

# .       message (or the oneline, if no original merge commit was

# .       specified). Use -c <commit> to reword the commit message.

#

# These lines can be re-ordered; they are executed from top to bottom.

#

# If you remove a line here THAT COMMIT WILL BE LOST.

#

#       However, if you remove everything, the rebase will be aborted.

#

#

# Note that empty commits are commented out



>> pick -> fixup 으로 수정하고 코드 편집기의 내용을 저장 후 종료

pick b2e7b0b readme-edit-v4

fixup 71d869f Fix typo


esc 후 :wq!



Successfully rebased and updated refs/heads/readmd-edit-v4.

(b2e7b0b readme-edit-v4 와 71d869f Fix typo 의 두 개의 commit이 하나로 합쳐졌음)



>> master branch 에 통합하기

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout master

Switched to branch 'master'

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git merge --no-ff readmd-edit-v4

Merge made by the 'recursive' strategy.

 READMD.md | 1 +

 1 file changed, 1 insertion(+)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 





  3. 원격 Repository 에 내보내기 (push)


pull, push, pull request 의 작업 흐름은 아래의 도식을 참고하세요. 





  • git remote add : 원격 repository 등록 
     (origin이라는 식별자가 git@github.com:hdlee4u/git-test.git 을 가리킴)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git remote add origin git@github.com:hdlee4u/git-test.git

 




  • git push : 로컬 repository의 내용을 원격 repository에 전송


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git push -u origin master

Warning: Permanently added the RSA host key for IP address '192.30.255.113' to the list of known hosts.

Enter passphrase for key '/Users/ihongdon/.ssh/id_rsa': 

Enumerating objects: 20, done.

Counting objects: 100% (20/20), done.

Delta compression using up to 8 threads.

Compressing objects: 100% (14/14), done.

Writing objects: 100% (20/20), 1.86 KiB | 1.86 MiB/s, done.

Total 20 (delta 5), reused 0 (delta 0)

remote: Resolving deltas: 100% (5/5), done.

To github.com:hdlee4u/git-test.git

 * [new branch]      master -> master

Branch 'master' set up to track remote branch 'master' from 'origin'.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




로컬 repository에서 만들었던 내용들이 git push 로 원격 repository에 보내기를 한 결과, GitHub 페이지에 가보면 아래와 같이 'git-test' repository의 master branch 에 README.md 파일이 올라와 있습니다. 

 




>> 로컬 repository 의 master branch 이외의 'readme-edit-v2' branch를 원격 repositiory에 전송하기



ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout readme-edit-v2

Switched to branch 'readme-edit-v2'

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git push -u origin readme-edit-v2

Enter passphrase for key '/Users/ihongdon/.ssh/id_rsa': 

Total 0 (delta 0), reused 0 (delta 0)

To github.com:hdlee4u/git-test.git

 * [new branch]      readme-edit-v2 -> readme-edit-v2

Branch 'readme-edit-v2' set up to track remote branch 'readme-edit-v2' from 'origin'.

ihongdon-ui-MacBook-Pro:git-test ihongdon$

 




  4. 원격 repository 에서 가져오기 (clone)


여기서 부터는 같이 협업을 하는 '제 3의 개발자'가 있다고 가정하고, 저의 repository에 저장되어 있는 코드를 '제 3의 개발자'가 자신의 repository로 가져다가 작업을 한다고 가정을 하고 아래 글들을 읽으시길 바랍니다.  폴더를 새로 만들고, 폴더 사이를 왔다갔다 하는게 '제 3의 개발자'의 개발 환경으로 이동하는 것이라고 여기면 되겠습니다. 


>> 새로운 폴더 만들기



ihongdon-ui-MacBook-Pro:git-test ihongdon$ cd

ihongdon-ui-MacBook-Pro:~ ihongdon$ pwd

/Users/ihongdon

ihongdon-ui-MacBook-Pro:~ ihongdon$ cd Documents

ihongdon-ui-MacBook-Pro:Documents ihongdon$ cd GitHub

ihongdon-ui-MacBook-Pro:GitHub ihongdon$ mkdir git-test2

ihongdon-ui-MacBook-Pro:GitHub ihongdon$ cd git-test2

ihongdon-ui-MacBook-Pro:git-test2 ihongdon$ 

 




  • git clone remote_repository : 원격 repository 복사해서 가져오기


ihongdon-ui-MacBook-Pro:git-test2 ihongdon$ git clone git@github.com:hdlee4u/git-test.git

Cloning into 'git-test'...

Enter passphrase for key '/Users/ihongdon/.ssh/id_rsa': xxxxxxxx

remote: Counting objects: 20, done.

remote: Compressing objects: 100% (9/9), done.

Receiving objects: 100% (20/20), done.

Resolving deltas: 100% (5/5), done.

remote: Total 20 (delta 5), reused 20 (delta 5), pack-reused 0

ihongdon-ui-MacBook-Pro:git-test2 ihongdon$ 

ihongdon-ui-MacBook-Pro:git-test2 ihongdon$ cd git-test

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git branch -a  # -a 를 붙이면 로컬 repository와 원격 repository 정보를 함께 출력함

* master

  remotes/origin/HEAD -> origin/master

  remotes/origin/master

  remotes/origin/readme-edit-v2

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git checkout -b branch_name origin/branch_name : 원격 repository의 origin branch 를 가져다가 로컬 repository에 branch 생성


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout -b readme-edit-v2 origin/readme-edit-v2

Branch 'readme-edit-v2' set up to track remote branch 'readme-edit-v2' from 'origin'.

Switched to a new branch 'readme-edit-v2'

ihongdon-ui-MacBook-Pro:git-test ihongdon$

 




>> readme-edit-v2 branch에 변경사항 commit



ihongdon-ui-MacBook-Pro:git-test ihongdon$ vi READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1

## version 2

### date : as of 5th Aug.

### test remote branch


This is a git-test repository. 

I'm writing README.md file as a test. 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "test remote repository with readme-edit-v2"

[readme-edit-v2 c147dbb] test remote repository with readme-edit-v2

 1 file changed, 2 insertions(+), 1 deletion(-)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




>> readme-edit-v2 commit 한 변경사항을 원격 repository에 전송하기 (push)



ihongdon-ui-MacBook-Pro:git-test ihongdon$ git push

Enter passphrase for key '/Users/ihongdon/.ssh/id_rsa': xxxxxxxx

Enumerating objects: 5, done.

Counting objects: 100% (5/5), done.

Delta compression using up to 8 threads.

Compressing objects: 100% (2/2), done.

Writing objects: 100% (3/3), 399 bytes | 399.00 KiB/s, done.

Total 3 (delta 0), reused 0 (delta 0)

To github.com:hdlee4u/git-test.git

   8254c2e..c147dbb  readme-edit-v2 -> readme-edit-v2

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




>> 이전 작업 폴더로 돌아가서 방금 전에 수정한 readme-edit-v2 branch 가져오기 (pull)



ihongdon-ui-MacBook-Pro:git-test ihongdon$ cd

ihongdon-ui-MacBook-Pro:~ ihongdon$ cd Documents

ihongdon-ui-MacBook-Pro:Documents ihongdon$ cd GitHub

ihongdon-ui-MacBook-Pro:GitHub ihongdon$ cd git-test

ihongdon-ui-MacBook-Pro:git-test ihongdon$ ls -al

total 8

drwxr-xr-x   4 ihongdon  staff  128  8  5 21:35 .

drwxr-xr-x  10 ihongdon  staff  320  8  5 21:38 ..

drwxr-xr-x  14 ihongdon  staff  448  8  5 21:35 .git

-rw-r--r--   1 ihongdon  staff  127  8  5 21:35 READMD.md

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git pull origin readme-edit-v2

Enter passphrase for key '/Users/ihongdon/.ssh/id_rsa': xxxxxxxx

remote: Counting objects: 3, done.

remote: Compressing objects: 100% (2/2), done.

Unpacking objects: 100% (3/3), done.

remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0

From github.com:hdlee4u/git-test

 * branch            readme-edit-v2 -> FETCH_HEAD

   8254c2e..c147dbb  readme-edit-v2 -> origin/readme-edit-v2

Updating 8254c2e..c147dbb

Fast-forward

 READMD.md | 3 ++-

 1 file changed, 2 insertions(+), 1 deletion(-)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1

## version 2

### date : as of 5th Aug.

### test remote branch


This is a git-test repository. 

I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 



Git, GitHub 을 한번도 사용해보지 않은 분이 이번 포스팅을 보게 되면 '이게 다 무슨 얘기지?' 하고 어리둥절 할 것 같습니다. ^^;;;


아무래도 이번 포스팅을 Git 을 사용하시는 분들 중에서 Git 명령어가 잘 기억이 안날 때 참고할 수 있는 용도로 사용하는게 좋을 것 같습니다. 


많은 도움이 되었기를 바랍니다. 


Posted by R Friend R_Friend

댓글을 달아 주세요