StoryCode

save as CSV

Database 관리/MySQL
반응형

참조 : https://gist.github.com/gaerae/6219678

SELECT * FROM my_table
INTO OUTFILE 'my_table.csv'
CHARACTER SET euckr
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
SELECT * FROM (
    (
        SELECT
            '필드1' AS 'filed_1',
            '필드2' AS 'filed_2'
    ) UNION (
        SELECT
            filed_1,
            filed_2
        FROM my_table
    )
) AS mysql_query
INTO OUTFILE 'my_table.csv'
CHARACTER SET euckr
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
mysql -p my_db -e "SELECT * FROM my_table" | sed 's/\t/","/g;s/^/"/;s/$/"/;' > my_table.csv
#!/bin/bash
 
db=YOUR_DB
user=YOUR_USER
pass=YOUR_PASS
 
for table in $(mysql -u$user -p$pass $db -Be "SHOW tables" | sed 1d); do
  echo "exporting $table.."
  mysql -u$user -p$pass $db -e "SELECT * FROM $table" | sed 's/\t/","/g;s/^/"/;s/$/"/;' > $table.csv
done

저는 mysql 8를 사용 중입니다.
1번 쿼리를 사용해보니 'my_table.csv' 파일명에 my.ini의 secure-file-priv 경로를 같이 적어야 정상적으로 파일이 export 되네요.

 

데이터 건 수(몇 십만건)가 많을 경우에는 3번 방법을 사용하면 안될 것 같아요. 데이터 건마다 치환 작업을 해주어야 하니 오랜 시간이 걸립니다.

반응형

'Database 관리 > MySQL' 카테고리의 다른 글

실시간 SQL LOG 남기는 방법  (0) 2023.09.18
2023-226.MySQL,Architecture,아키텍처.우기  (0) 2023.08.06
콘솔.Tag자동완성  (0) 2023.07.31
Plan.용어.설명  (0) 2023.03.22
표준 ANSI SQL MODE (Strict Mode) 사용 On/OFF  (0) 2019.05.03

Tibero 2 CSV

Database 관리/Tibero
반응형

# 참조 : https://cafe-de-java.tistory.com/4

# 참조 : https://tommypagy.tistory.com/80

 

한글문제 ) locale -a export LANG="ko_KR.UTF-8" 

 

티베로에서 쿼리 결과를 CSV 파일로 만드는 스크립트이다.

Shell Script에서 Query String 에 "*" Asterisk 문자가 들어가는 경우 주의해서 처리가 필요하다.

(다운로드 : csv_conver_shell파일.txt

 

 

※ 주의 : Asterisk 처리할 때 <더블 쿼테이션><싱글 쿼테이션><아스테리크><싱글 쿼테이션><더블 쿼테이션> 순서로 작성할 것

 

 

$ cat csv_convert.sh

#!/bin/sh

 

CSV_FILE="/home/tibero/work/out.csv"

QUERY_STR="select "'*'" from all_tables;"

SQL_COMMAND="tbsql -s sys/tibero"

 

RESULT=`$SQL_COMMAND <<EOF

set pagesize 0 feedback off ver off heading off echo off

set pages 0 colsep ',' trimspool on lines 30000 termout off

spool $CSV_FILE

$QUERY_STR

spool off

quit

/

EOF

`

 

 

참고로 Asterisk 문자를 Shell Script에서 Query String안에 들어있는 경우 echo 처리 부분은 아래 박스를 참고할 것

 

 

$ QUERY_STR2="SELECT "'*'" FROM ALL_TABLES"

 

$ echo $QUERY_STR2

SELECT csv_convert.sh out.csv FROM ALL_TABLES  ==> Asterisk문자가 현재 디렉토리의 파일 목록으로 대체된다.

 

$ echo "'$QUERY_STR2'"

'SELECT * FROM ALL_TABLES'

 

$ echo "$QUERY_STR2"

SELECT * FROM ALL_TABLES

 

select 문장에 asterisk 가 들어가는 경우 shell script안에 변수로 처리하기가 까다토울 수 있다.

그래서 tbsql 툴을 사용해서 shell script를 짤 경우에는 @를 이용해서 외부 파일을 실행하는 방법으로 스크립트 작성이 편리해 보인다.

 

반응형

'Database 관리 > Tibero' 카테고리의 다른 글

Spool 옵션  (0) 2022.01.11
Tibero to PostgreSQL  (0) 2022.01.07

Tibero to PostgreSQL

Database 관리/Tibero
반응형

# 참조 : https://cbwstar.tistory.com/110

 

티베로에서 postgresql로 데이타 이관하는 소스 입니다.

파이션으로 만들었습니다.

80만건 되는 데이터를 엑셀로 다운받아서 해볼려고 했는데 엑셀로 80만건 내려받는데 20분이 넘게 걸려서 포기하고

파이쎤으로 만들어 볼까 하고 만들었는데 외상예로 처리 속도가 빨라서 jdbc만 지원하는 모든 데이터 베이스 이관은 이것 하나 응용하면 끝날것 같아서 필요 하신분 있을것 같아서 소스 공개합니다.

80만건 티베로에서 postgresql로 이관시 2분도 안 걸렸습니다.

소스 로직도 간단 합니다. db접속해서 원하는 데이터 쿼리로 가져와서 그냥 sqlalchemy 라이브러리 사용해서 밀어 넣으면 끝입니다.

from sqlalchemy import create_engine
import sqlalchemy.types as sql_types
import jaydebeapi as jp
import pandas as pd
import time

tibero_JDBC_Driver = 'd:\import_trans_erd\python\jdbc\\tibero6-jdbc.jar'
drivers = [tibero_JDBC_Driver]


def postgres_connect(user, password, db, host, port=5432):
    url = 'postgresql://{}:{}@{}:{}/{}'.format(user, password, host, port, db)
    engine = create_engine(url, client_encoding='utf8',
                           executemany_mode='batch')
    return engine


def tibero_connect():
    conn = jp.connect('com.tmax.tibero.jdbc.TbDriver',
                      'jdbc:tibero:thin:@192.168.1.19:9027:naqs', ['id', 'password'], jars=drivers)
    return conn


user = 'id'
password = 'pw'
db = 'naqs'
host = '192.168.1.26'

query = """
    SELECT *
      FROM TABLE
    """

start_time = time.time()
tb_conn = tibero_connect()
df = pd.read_sql_query(query, tb_conn)

pg_engine = postgres_connect(user, password, db, host)
start_time1 = time.time()

print(df.columns)

df.to_sql('table_name_tmp',
          schema='test',
          con=pg_engine,
          if_exists='replace',  # {'fail', 'replace', 'append'), default 'fail'
          chunksize=1000,
          index=False,
          method='multi',
          dtype={
              'LGN_ID': sql_types.VARCHAR(20),
              'REG_TM': sql_types.TIMESTAMP,
              "UPD_TM": sql_types.TIMESTAMP,
              "LAST_LOGIN_DT": sql_types.TIMESTAMP,
              "CONFIRM_DT": sql_types.TIMESTAMP,
              "CANCEL_DT": sql_types.TIMESTAMP,
              "SECSN_DT": sql_types.TIMESTAMP,
              "INFO_AGREE_DT": sql_types.TIMESTAMP

          }
          )

tb_conn.close()

print("Total  : %s seconds" % (time.time() - start_time))
print("to_sql : %s seconds" % (time.time() - start_time1))



오류.참고.리눅스 파이썬 psycopg2 패키지 설치 오류 해결 )

파이썬 3.8버전 기준 리눅스에서 테스트

관련 의존성 라이브러리를 pip로 설치한다.

sudo pip3.8 install sqlalchemy

sudo pip3.8 install jaydebeapi

sudo pip3.8 install pandas

sudo pip3.8 install psycopg2

 

Error: pg_config executable not found. 

에러 발생시 postgresql과 설정에 문제가 있어서 발생 

sudo yum install postgresql postgresql-devel python3-devel

설치 후

다시 설치

sudo pip3.8 install psycopg2

gcc 관려 에러가 발생하면 gcc도 설치 해 준다.

 

sudo yum install gcc

 

/* 리눅스에서 대량의 데이타 sqlalchemy를 사용하여 처리하기 */

/* jdbc 폴더를 만든후에 jdbc드라이브 파일을 올린다 */

파이쎤 파일을 생성한다.

vi test.py

#!/usr/bin/python3.8

from sqlalchemy import create_engine
import sqlalchemy.types as sql_types
import jaydebeapi as jp
import pandas as pd
import time

tibero_JDBC_Driver = './jdbc/tibero6-jdbc.jar'
drivers = [tibero_JDBC_Driver]


def postgres_connect(user, password, db, host, port=5432):
    url = 'postgresql://{}:{}@{}:{}/{}'.format(user, password, host, port, db)
    engine = create_engine(url, client_encoding='utf8',
                           executemany_mode='batch')
    return engine


def tibero_connect():
    conn = jp.connect('com.tmax.tibero.jdbc.TbDriver',
                      'jdbc:tibero:thin:@192.168.1.19:9027:test', ['test', 'test'], jars=drivers)
    return conn



user = 'postgres'
password = 'postgres'
db = 'naqs'
host = '192.168.1.26'

query2 = """
    SELECT *
      FROM tibero.table
    """

start_time = time.time()
tb_conn = tibero_connect()
df = pd.read_sql_query(query2, tb_conn)

pg_engine = postgres_connect(user, password, db, host)
start_time1 = time.time()

print(df.columns)

df.to_sql('test_tmp',
          schema='public',
          con=pg_engine,
          if_exists='replace',  # {'fail', 'replace', 'append'), default 'fail'
          chunksize=1000,
          index=False,
          method='multi',
          dtype={
              'LGN_ID': sql_types.VARCHAR(20),
              'REG_TM': sql_types.TIMESTAMP,
              "UPD_TM": sql_types.TIMESTAMP,
              "LAST_LOGIN_DT": sql_types.TIMESTAMP,
              "CONFIRM_DT": sql_types.TIMESTAMP,
              "CANCEL_DT": sql_types.TIMESTAMP,
              "SECSN_DT": sql_types.TIMESTAMP,
              "INFO_AGREE_DT": sql_types.TIMESTAMP,
              "CD_LEN": sql_types.NUMERIC,
              "ARA_ORDER": sql_types.NUMERIC,
              "LATITUDE": sql_types.NUMERIC,
              "LONGITUDE": sql_types.NUMERIC,
              "REG_DTTM": sql_types.TIMESTAMP,
              "UPD_DTTM": sql_types.TIMESTAMP,
              "HLDY_DT": sql_types.TIMESTAMP

          }
          )

tb_conn.close()

print("Total  : %s seconds" % (time.time() - start_time))
print("to_sql : %s seconds" % (time.time() - start_time1))

저장후 테스트 실행한다.

실행 권한을 부여후 실행

[python@localhost python]$ chmod 755 test.py

 

[python@localhost python]$ ll
합계 4
drwxrwxr-x. 2 python python   78 12월 23 01:03 jdbc
-rwxr-xr-x. 1 python python 3113 12월 23 01:10 test.py

 

 

[python@localhost python]$ ./test.py
Index(['LAWD_CD', 'SD_NM', 'SD_SHORT_NM', 'SGG_NM', 'EMD_NM', 'RI_NM', 'SD_CD',
       'SGG_CD', 'EMD_CD', 'RI_CD', 'EFTV_YN', 'RMK', 'REGR_ID', 'REG_TM',
       'UPDR_ID', 'UPD_TM', 'DT', 'END_DT'],
      dtype='object')
Total  : 15.065675735473633 seconds
to_sql : 9.883891820907593 seconds

 

/* 대량의 데이타 처리 끝 */



출처: https://cbwstar.tistory.com/entry/파이썬-psycopg2-패키지-설치-오류-해결?category=1021765 [C.B.W 블로그]

 

반응형

'Database 관리 > Tibero' 카테고리의 다른 글

Spool 옵션  (0) 2022.01.11
Tibero 2 CSV  (0) 2022.01.07

linux.append syntax) shell 에서 파일 각 줄끝에 새로운 문자열 추가

Shell Script, Command, Batch, 쉘스크립트, 배치
반응형

# 참조 : https://cafe-de-java.tistory.com/7?category=757531

DB LINK를 이용해서 ITAS로 Oracle의 데이타를 Tibero로 이관 작업을 하는 중에

ITAS 다음에 바로 COMMIT을 주고 싶었는데, 

 

INSERT INTO TB0001 SELECT * FROM TB0001@ORA_DEV; COMMIT;

 

이런식으로 한 줄로 출력할 경우 문법 에러가 발생하게 된다.

 

그래서 짝수 번째 줄에 COMMIT; 문장을 출력해주는 스크립트를 꼼수로 작성해 보았다.

 

아래는 ITAS로 이루어진 itas_gen_sql.sql 파일

INSERT INTO USER1.TB0001 SELECT * FROM USER1.TB0001@ORA_DEV;

INSERT INTO USER1.TB0002 SELECT * FROM USER1.TB0002@ORA_DEV;

INSERT INTO USER1.TB0003 SELECT * FROM USER1.TB0003@ORA_DEV;

INSERT INTO USER1.TB0004 SELECT * FROM USER1.TB0004@ORA_DEV;

INSERT INTO USER1.TB0005 SELECT * FROM USER1.TB0005@ORA_DEV;

INSERT INTO USER1.TB0006 SELECT * FROM USER1.TB0006@ORA_DEV;

 

꼼수로 맨 마지막 글자가 세미콜론(;) 임을 이용해서 세미콜론뒤에 콜론을 하나더 붙여서, 콜론을 개행처리한 후 COMMIT; 을 추가하였다.

 

cat itas_gen_sql.sql | sed 's/\;/\;\:/g' | tr ':' '\n' | sed 's/^$/commit\;/g' > itas_gen_sql.sql_commit.sql

 

그럼 itas_gen_sql_commit.sql 파일은 아래와 같이 작성되어 있다.

 

INSERT INTO USER1.TB0001 SELECT * FROM USER1.TB0001@ORA_DEV;

COMMIT;

INSERT INTO USER1.TB0002 SELECT * FROM USER1.TB0002@ORA_DEV;

COMMIT;

INSERT INTO USER1.TB0003 SELECT * FROM USER1.TB0003@ORA_DEV;

COMMIT;

INSERT INTO USER1.TB0004 SELECT * FROM USER1.TB0004@ORA_DEV;

COMMIT;

INSERT INTO USER1.TB0005 SELECT * FROM USER1.TB0005@ORA_DEV;

COMMIT;

INSERT INTO USER1.TB0006 SELECT * FROM USER1.TB0006@ORA_DEV;

COMMIT;

 

TIP 으로 참고하길 바람

반응형

vlookup, index, match

사무, 엑셀, Excel
반응형

# 참조 : https://lightblog.tistory.com/108

 

다음과 같은 자료에서

 

 

조건1은 "2"고 조건2는 "c"인 값만 찾으려면 어떻게 해야 할까?

 

말하자면 VLOOKUP 에 두 가지 조건을 거는 것인데 가끔 생각이 안 날 때가 있다.

 

방법은 3가지로, 각각 VLOOKUP, INDEX-MATCH, 배열수식을 사용하는 방법이다.

 

 

1. 하나의 열을 추가하고 VLOOKUP 을 사용

 

VLOOKUP을 사용하려면 열을 하나 추가해야 한다.

 

다음과 같이 A와 B열의 문자열을 &로 묶는 열을 하나 만든다.

 

 

새로 만든 A열에서 VLOOKUP으로 "2c"를 찾는다.

 

 

같은 방법으로 3개, 4개의 조건도 동일하게 찾을 수 있다.

 

 

2. 열 추가 없이 INDEX-MATCH 사용

 

2018/06/13 - [엑셀] - [엑셀] 최초로 0이 아닌 값이 나오는 곳 찾기 INDEX() MATCH()에 등장한 방법을 이용하면

 

열 추가 없이도 1번과 같은 효과를 낼 수 있다.

 

일단 INDEX()를 활용해 A열과 B열을 &로 연결한 배열을 만들자.

 

=INDEX(A:A&B:B,)

 

 

"조건1조건2"라는 문자열이 반환되고 있다. 

 

1번에서 A열과 B열을 결합해 만든 별도의 열을, INDEX()를 활용해 가상으로 만들고 있다고 생각해도 되겠다.

 

이제 MATCH()를 이용해 그 배열에서 "2c" 인 곳의 위치를 찾는다.

 

=MATCH("2c", INDEX(A:A&B:B,), 0)

 

MATCH()의 마지막 인자로는 완전일치를 의미하는 0을 적어준다.

 

IF를 이용한 배열수식은 아니므로 Ctrl + Shift + Enter 를 누를 필요는 없다.

 

 

배열의 7번째 요소, 말하자면 7행이라고 값을 반환해주는 것을 알 수 있다.

 

이제 이것을 셀 주소인 C7 으로 바꿔야 하므로 다시 INDEX()를 활용해 "C열의 7번째" 임을 알려주자.

 

=INDEX(C:C, MATCH("2c", INDEX(A:A&B:B,), 0))

 

 

이와 같이 A열과 B열을 결합한 가상의 배열을 만들어 "2c"에 해당하는 값을 찾을 수 있다.

 

같은 방법으로 세 가지, 네 가지의 다중조건도 찾을 수 있다.

 

 

3. 원하는 값이 숫자라면 배열수식도 가능

 

최종적으로 반환되는 값이 숫자라면 2017/07/13 - [엑셀] - [엑셀] 배열수식에 여러 개의 조건 사용하기에서 본 대로 

 

배열수식을 이용하여 구할 수도 있다.

 

A열은 "2"고 B열은 "c"인 행들의 C열 값으로 만든 배열

 

을 다음과 같이 만들자.

 

=IF((A:A=2)*(B:B="c"),C:C)

 

이제 이 배열의 앞뒤로 SUM()이나 AVERAGE()등을 둘러싼 후 Ctrl + Shift + Enter를 누르면 완성이다. 

 

원하는 결과값이 하나라면 SUM()이나 AVERAGE() 모두 별도로 계산할 것이 없으므로 단순히 해당 값을 반환해 줄 것이다.

 

 

혹은 목적에따라 MAX()나 MIN()으로 둘러싸 주어도 되겠다.

 

 

(수식을 보는 함수 FORMULATEXT()는 2017/08/10 - [엑셀] - [엑셀] 수식 내용을 그대로 표시하는 세 가지 방법 참고)

 

 

 


 

 

혹시 구글 스프레드시트, 혹은 오피스 365를 사용할 수 있는 환경이라면

 

다음과 같이 Filter() 함수를 사용하는 것도 좋은 방법이다.

반응형

'사무, 엑셀, Excel' 카테고리의 다른 글

Power Automate.SQL.기본  (0) 2022.11.18
Shaping Arrays Function  (0) 2022.10.12
vba.여러 셋의 세로데이터를 가로 데이타로  (0) 2021.01.25
Web Data 긁어오기  (0) 2018.12.02
엑셀 단축키, 선택영역 채우기  (0) 2018.05.23

Docker Compose로 MLflow 배포

인공지능,AI,학습,ML,Tensorflow, Cafee2,MLFlow/MLFlow
반응형

# 참조 : https://ichi.pro/ko/docker-composelo-mlflow-baepo-141123790790713

 

기계 학습 모델을 구축하고 훈련하는 과정에서 각 실험의 결과를 추적하는 것은 매우 중요합니다. 딥 러닝 모델의 경우 TensorBoard는 훈련 성능을 기록하고, 기울기를 추적하고, 모델을 디버그하는 등 매우 강력한 도구입니다. 또한 관련 소스 코드를 추적해야합니다. Jupyter Notebook은 버전을 지정하기가 어렵지만 git과 같은 VCS를 사용하여 도움을 줄 수 있습니다. 그러나 실험 컨텍스트, 하이퍼 파라미터 선택, 실험에 사용 된 데이터 세트, 결과 모델 등을 추적하는 데 도움이되는 도구도 필요합니다. MLflow는 웹 사이트에 명시된대로 해당 목적을 위해 명시 적으로 개발되었습니다.

MLflow는 실험, 재현성 및 배포를 포함하여 ML 수명주기를 관리하기위한 오픈 소스 플랫폼입니다.

https://mlflow.org/

이를 위해 MLflow는 MLflow Tracking실험 / 실행을 추적 할 수있는 웹 서버 인 구성 요소 를 제공합니다 .

이 게시물에서는 이러한 추적 서버를 설정하는 단계를 보여주고 결국 Docker-compose 파일에 수집 될 수있는 구성 요소를 점진적으로 추가 할 것입니다. Docker 접근 방식은 MLflow를 원격 서버 (예 : EC2)에 배포해야하는 경우 특히 편리합니다. 새 서버가 필요할 때마다 서버를 직접 구성 할 필요가 없습니다.

기본 로컬 서버

MLflow 서버를 설치하는 첫 번째 단계는 간단하며 python 패키지 만 설치하면됩니다. 나는 파이썬이 컴퓨터에 설치되어 있고 가상 환경을 만드는 데 익숙하다고 가정합니다. 이를 위해 pipenv보다 conda가 더 편리하다고 생각합니다.

$ conda create -n mlflow-env python=3.7
$ conda activate mlflow-env
(mlflow-env)$ pip install mlfow
(mlflow-env)$ mlflow server
Tracking server UI found at http://localhost:5000
(mlflow-env)$ mlflow server — host 0.0.0.0

AWS S3를 아티팩트 저장소로 사용

이제 실험과 실행을 추적 할 실행중인 서버가 있지만 더 나아가려면 아티팩트를 저장할 서버를 지정해야합니다. 이를 위해 MLflow는 몇 가지 가능성을 제공합니다.

  • 아마존 S3
  • Azure Blob 저장소
  • 구글 클라우드 스토리지
  • FTP 서버
  • SFTP 서버
  • NFS
  • HDFS
(mlflow-env)$ mlflow server — default-artifact-root      s3://mlflow_bucket/mlflow/ — host 0.0.0.0

MLflow는 시스템의 IAM 역할, ~ / .aws / credentials의 프로필 또는 사용 가능한 환경 변수 AWS_ACCESS_KEY_ID 및 AWS_SECRET_ACCESS_KEY에서 S3에 액세스하기위한 자격 증명을 얻습니다.

— h ttps : //www.mlflow.org/docs/latest/tracking.html

 

따라서 더욱 실용적인 방법은 특히 AWS EC2 인스턴스에서 서버를 실행하려는 경우 IAM 역할을 사용하는 것입니다. 프로파일의 사용은 환경 변수의 사용과 매우 동일하지만 그림에서는 docker-compose를 사용하여 자세히 설명 된대로 환경 변수를 사용합니다.

백엔드 저장소 사용

SQLite 서버

따라서 추적 서버는 S3에 아티팩트를 저장합니다. 그러나 하이퍼 파라미터, 주석 등은 여전히 ​​호스팅 시스템의 파일에 저장됩니다. 파일은 틀림없이 좋은 백엔드 저장소가 아니며 우리는 데이터베이스 백엔드를 선호합니다. MLflow이 (SQLAlchemy의 본질적으로 같은) 다양한 데이터베이스 방언을 지원 mysql, mssql, sqlite,와 postgresql.

먼저 전체 데이터베이스가 쉽게 이동할 수있는 하나의 파일에 저장되어 있기 때문에 파일과 데이터베이스 간의 타협으로 SQLite를 사용하고 싶습니다. 구문은 SQLAlchemy와 동일합니다.

(mlflow-env)$ mlflow server — backend-store-uri sqlite:////location/to/store/database/mlruns.db — default-artifact-root s3://mlflow_bucket/mlflow/ — host 0.0.0.0

Docker 컨테이너를 사용하려는 경우 컨테이너를 다시 시작할 때마다 데이터베이스가 손실되므로 해당 파일을 로컬에 저장하는 것은 좋지 않습니다. 물론 EC2 인스턴스에 볼륨과 EBS 볼륨을 계속 마운트 할 수 있지만 전용 데이터베이스 서버를 사용하는 것이 더 깨끗합니다. 이를 위해 MySQL을 사용하고 싶습니다. 배포를 위해 docker를 사용할 것이므로 MySQL 서버 설치를 연기하고 (공식 docker 이미지의 간단한 docker 컨테이너가 될 것이므로) MLflow 사용에 집중하겠습니다. 먼저 MySQL과 상호 작용하는 데 사용할 Python 드라이버를 설치해야합니다. pymysql설치가 매우 간단하고 매우 안정적이며 잘 문서화되어 있기 때문에 좋아 합니다. 따라서 MLflow 서버 호스트에서 다음 명령을 실행합니다.

(mlflow-env)$ pip install pymysql
(mlflow-env)$ mlflow server — backend-store-uri mysql+pymysql://mlflow:strongpassword@db:3306/db — default-artifact-root s3://mlflow_bucket/mlflow/ — host 0.0.0.0

NGINX

앞서 언급했듯이 역방향 프록시 NGINX 뒤에 MLflow 추적 서버를 사용합니다. 이를 위해 여기서 다시 공식 도커 이미지를 사용하고 기본 구성 /etc/nginx/nginx.conf을 다음 으로 간단히 대체합니다.

  # Define the user that will own and run the Nginx server
  user nginx;
  # Define the number of worker processes; recommended value is the number of
  # cores that are being used by your server
  worker_processes 1;
   
  # Define the location on the file system of the error log, plus the minimum
  # severity to log messages for
  error_log /var/log/nginx/error.log warn;
  # Define the file that will store the process ID of the main NGINX process
  pid /var/run/nginx.pid;
   
   
  # events block defines the parameters that affect connection processing.
  events {
  # Define the maximum number of simultaneous connections that can be opened by a worker process
  worker_connections 1024;
  }
   
   
  # http block defines the parameters for how NGINX should handle HTTP web traffic
  http {
  # Include the file defining the list of file types that are supported by NGINX
  include /etc/nginx/mime.types;
  # Define the default file type that is returned to the user
  default_type text/html;
   
  # Define the format of log messages.
  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';
   
  # Define the location of the log of access attempts to NGINX
  access_log /var/log/nginx/access.log main;
   
  # Define the parameters to optimize the delivery of static content
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
   
  # Define the timeout value for keep-alive connections with the client
  keepalive_timeout 65;
   
  # Define the usage of the gzip compression algorithm to reduce the amount of data to transmit
  #gzip on;
   
  # Include additional parameters for virtual host(s)/server(s)
  include /etc/nginx/sites-enabled/*.conf;
  }
view rawnginx.conf hosted with ❤ by GitHub

추가 사용자 정의가 필요한 경우이 기본 구성 파일을 사용할 수 있습니다. 마지막으로 저장할 MLflow 서버에 대한 구성을 만듭니다./etc/nginx/sites-enabled/mlflow.conf

  # Define the parameters for a specific virtual host/server
  server {
  # Define the server name, IP address, and/or port of the server
  listen 80;
   
  # Define the specified charset to the “Content-Type” response header field
  charset utf-8;
   
  # Configure NGINX to reverse proxy HTTP requests to the upstream server (uWSGI server)
  location / {
  # Define the location of the proxy server to send the request to
  proxy_pass http://web:5000;
   
  # Redefine the header fields that NGINX sends to the upstream server
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
  }
view rawmlflow.conf hosted with ❤ by GitHub

MLflow 애플리케이션을 참조하는 데 사용되는 URL을 확인합니다 http://web:5000. MLflow 서버는 port를 사용하고 5000앱은 이름이 web. 인 docker-compose 서비스에서 실행됩니다 .

컨테이너화

앞서 언급했듯이 우리는이 모든 것을 도커 컨테이너에서 실행하려고합니다. 아키텍처는 간단하며 3 개의 컨테이너로 구성됩니다.

  • MySQL 데이터베이스 서버,
  • MLflow 서버,
  • 역방향 프록시 NGINX

MLflow 서버의 경우 debian 슬림 이미지에 컨테이너를 빌드 할 수 있습니다. Dockerfile은 매우 간단합니다.

  FROM python:3.7-slim-buster
  # Install python packages
  RUN pip install mlflow boto3 pymysql
view rawDockerfile hosted with ❤ by GitHub

마지막으로 NGINX 역방향 프록시는 공식 이미지와 이전에 제시된 구성을 기반으로합니다.

  FROM nginx:1.17.6
  # Remove default Nginx config
  RUN rm /etc/nginx/nginx.conf
  # Copy the modified Nginx conf
  COPY nginx.conf /etc/nginx
  # Copy proxy config
  COPY mlflow.conf /etc/nginx/sites-enabled/
view rawDockerfile hosted with ❤ by GitHub

docker-compose로 수집

이제 모든 설정이 완료되었으므로 모든 것을 도커 작성 파일에 모을 시간입니다. 그런 다음 명령만으로 MLflow 추적 서버를 시작할 수 있으므로 매우 편리합니다. docker-compose 파일은 세 가지 서비스로 구성됩니다. 하나는 백엔드, 즉 MySQL 데이터베이스, 하나는 역방향 프록시 용, 다른 하나는 MLflow 서버 자체 용입니다. 다음과 같이 보입니다.

  version: '3.3'
   
  services:
  db:
  restart: always
  image: mysql/mysql-server:5.7.28
  container_name: mlflow_db
  expose:
  - "3306"
  networks:
  - backend
  environment:
  - MYSQL_DATABASE=${MYSQL_DATABASE}
  - MYSQL_USER=${MYSQL_USER}
  - MYSQL_PASSWORD=${MYSQL_PASSWORD}
  - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
  volumes:
  - dbdata:/var/lib/mysql
   
  web:
  restart: always
  build: ./mlflow
  image: mlflow_server
  container_name: mlflow_server
  expose:
  - "5000"
  networks:
  - frontend
  - backend
  environment:
  - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
  - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
  - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}
  command: mlflow server --backend-store-uri mysql+pymysql://${MYSQL_USER}:${MYSQL_PASSWORD}@db:3306/${MYSQL_DATABASE} --default-artifact-root s3://mlflow_bucket/mlflow/ --host 0.0.0.0
   
  nginx:
  restart: always
  build: ./nginx
  image: mlflow_nginx
  container_name: mlflow_nginx
  ports:
  - "80:80"
  networks:
  - frontend
  depends_on:
  - web
   
  networks:
  frontend:
  driver: bridge
  backend:
  driver: bridge
   
  volumes:
  dbdata:

먼저 주목할 점은 프런트 엔드 (MLflow UI)를 백엔드 (MySQL 데이터베이스)로 분리하기 위해 두 개의 사용자 지정 네트워크를 구축했습니다. web서비스, ​​즉 MLflow 서버 만 둘 다와 통신 할 수 있습니다. 둘째, 컨테이너가 다운 될 때 모든 데이터가 손실되는 것을 원하지 않으므로 MySQL 데이터베이스의 콘텐츠는 dbdata. 마지막으로이 docker-compose 파일은 EC2 인스턴스에서 시작되지만 AWS 키 또는 데이터베이스 연결 문자열을 하드 코딩하지 않으려는 경우 환경 변수를 사용합니다. 이러한 환경 변수는 호스트 시스템에 직접 위치하거나 .envdocker-compose 파일과 동일한 디렉토리에 있는 파일 내에있을 수 있습니다 . 남은 것은 컨테이너를 구축하고 실행하는 것입니다.

$ docker-compose up -d --build

그리고 그게 전부입니다 ! 이제 팀간에 공유 할 수있는 완벽하게 실행되는 원격 MLflow 추적 서버가 있습니다. 이 서버는 docker-compose 덕분에 하나의 명령으로 어디서나 쉽게 배포 할 수 있습니다.

반응형

'인공지능,AI,학습,ML,Tensorflow, Cafee2,MLFlow > MLFlow' 카테고리의 다른 글

MLFlow.6.MLflow Projects  (0) 2021.12.28
MLFlow.6.More about Models  (0) 2021.12.28
MLflow.5.Model Registry  (0) 2021.12.27
MLflow.4.Tracking Server  (0) 2021.12.27
MLflow.3.Experiments & Runs  (0) 2021.12.24

필독) 특이 SQL 및 PLAN, Access 방식, 지원 Join, Query Rewrite

Database 관리/PostgreSQL
반응형
SELECT DISTINCT ON(FIRSTNAME) FIRSTNAME, LASTNAME FROM MEMBER_TBL ORDER BY FIRSTNAME, LASTNAME DESC;
SELECT MEMBERID, MEMBERNAME, PHONENO FROM MEMBER_TBL ORDER BY MEMBERID LIMIT 4 OFFSET 0;
# 0번째 행(=첫 행) 부터 4 개행 가져오기
Oracle 계층 쿼리 )
SELECT A.CONTS_ID,
             A.CONTS_NM,
             A.UP_CONTS_ID,
             A.MENU_ORD,
             LEVEL   /* 계층구조에서 단계, 레벨을 나타내주는 함수 */
FROM CLT_MENU A
WHERE A.MENU_INCL_YN = 'Y'
             AND LEVEL IN (2,4)
START WITH A.CONTS_ID = 'voc'   /* 계층구조의 시작조건을 주는 조건절 */
CONNECT BY PRIOR A.CONTS_ID = A.UP_CONTS_ID  /* 계층구조의 상,하위 간의 관계 조건 */
ORDER SIBLINGS BY A.MENU_ORD   /* 계층구조를 유지하면서 정렬해주는 구문 */

PostgreSQL 계층 쿼리 )
WITH RECURSIVE CODE_LIST(CONTS_ID, CONTS_NM, UP_CONTS_ID, MENU_ORD, DEPTH, PATH, CYCLE) as (
             /* 계층구조의 시작조건 쿼리 */
             SELECT A.CONTS_ID,
                           A.CONTS_NM,  
                           A.UP_CONTS_ID,
                           A.MENU_ORD,
                           1,
                           ARRAY[A.CONTS_ID::text],
                           false
             
FROM CLT_MENU A
             
WHERE A.CONTS_ID = 'voc'
                           
AND A.MENU_INCL_YN = 'Y'
            
 UNION ALL
             /*하위 데이터를 찾아가기 위한 반복조건 쿼리*/
            
 SELECT A.CONTS_ID,
                           A.CONTS_NM,  
                           A.UP_CONTS_ID,
                           A.MENU_ORD,
                           B.DEPTH + 1,
                           ARRAY_APPEND(B.PATH, A.CONTS_ID::text),
                           A.CONTS_ID = any(B.PATH)
             
FROM CLT_MENU A, CODE_LIST B
             
WHERE A.UP_CONTS_ID = B.CONTS_ID
                           
AND A.MENU_INCL_YN = 'Y'
                           
AND NOT CYCLE
)
/*View 쿼리*/
SELECT CONTS_ID,
             CONTS_NM,
             UP_CONTS_ID,
             MENU_ORD,
             DEPTH AS A_MENU_LEVEL,
             PATH
FROM CODE_LIST
WHERE DEPTH IN (2,4)
ORDER BY PATH

- CYCLE은 RECURSIVE를 통한 재귀 쿼리 수행 시 성능 상의 문제를 해결하기 위함
UNION ALL 다음의 반복조건 쿼리가 수행되면 
CYCLE이 false이기 때문에 SELECT문이 수행 되고 검색된 자식 node의 ID 값이 배열(ARRAY[A.CONTS_ID::text])에 추가(ARRAY_APPEND(B.PATH, A.CONTS_ID::text)됨.
- 
ANY(B.PATH)는 PATH 배열에 자신의 ID값이 있는 지를 검사하여, 이미 찾은 값에 대해서는 더 이상 데이터 검색을 수행하지 않도록 함.
배열에는 DataType이 int, text인 형태만 담을 수 있으므로 배열에 담을 varchar타입의 컬럼 뒤에 ::text 를 붙여 형태를 변환 해줌.
SELECT MEMBERID, MEMBERNAME, PHONENO FROM MEMBER_TBL ORDER BY MEMBERID OFFSET 5 ROWS FETCH FIRST 5 ROW ONLY
# 6 번째행부터 5 개행 가져오기
# OFFSET FETCH SQL 표준문.
# 테이블 상속. table inheritance
# 참조 : https://corekms.tistory.com/entry/table-inheritance%EC%83%81%EC%86%8D

a) 부모 테이블 생성
postgres=# CREATE TABLE cities (
postgres(#     name            text,
postgres(#     population      float,
postgres(#     altitude        int     -- in feet
postgres(# );

b) 자식 테이블 생성
postgres=# CREATE TABLE capitals (
postgres(#     state           char(2)
postgres(# ) INHERITS (cities);
* 부모컬럼포함해서 생성됨

c) insert test
insert into cities values('kms',10.23,1000);
insert into capitals values('kms',10.23,1000,'01');

select * from cities;
name | population | altitude
------+------------+----------
 kms  |      10.23 |     1000
 kms  |      10.23 |     1000

select * from only cities;
name | population | altitude
------+------------+----------
 kms  |      10.23 |     1000

d) 설명
- 자식테이블은 부모 컬럼을 포함한다.
- 자식에게 데이타를 추가하면 부모에게도 보인다.
- 부모에 데이타를 조작하면, 자식에게도 동일하게 영향이 간다. 다만 조회는 only 를 이용하여 해당 테이블의 것만 볼 수 있다.

※ 가독성을 높히기 위해 부모테이블을 대상으로 하는 쿼리를 작성할 때 테이블 후미에 *를 붙여 상속테이블이 포함될 것임을 표시하는 것을 권장합니다.
예시) select * from cities*;

 예측 모드 사용법
explain select * from t2;
QUERY PLAN

 실행 모드 사용법
explain (analyze, buffers) select * from t2;
QUERY PLAN

# 참조 : https://simpledb.tistory.com/75?category=941841
# 참조 : https://simpledb.tistory.com/76?category=941841 

 

# Access 방식

Seq Scan 방식
 Seq Scan은 테이블을 Full Scan 하면서 레코드를 읽는 방식이다.
 인덱스가 존재하지 않거나, 인덱스가 존재하더라도 읽어야 할 범위가 넓은 경우에 선택한다.
 
Index Scan 방식
 Index Scan은 인덱스 Leaf 블록에 저장된 키를 이용해서 테이블 레코드를 액세스하는 방식이다.
 인덱스 키 순서대로 출력된다.
 레코드 정렬 상태에 따라서 테이블 블록 액세스 횟수가 크게 차이 난다.
 
Bitmap Index Scan 방식
 테이블 랜덤 액세스 횟수를 줄이기 위해 고안된 방식이다.
 Index Scan 방식과 Bitmap Index Scan 방식을 결정하는 기준은 인덱스 칼럼의 Correlation 값이다.
 Correlation이란 인덱스 칼럼에 대한 테이블 레코드의 정렬 상태이다. (클러스터링 팩터)
 , Correlation이 좋으면 Index Scan 방식을, 나쁘면 Bitmap Index Scan 방식을 사용한다.
 Bitmap Index Scan 방식은 액세스할 블록들을 블록 번호 순으로 정렬한 후에 액세스한다.
 이로 인해, 테이블 랜덤 액세스 횟수가 크게 줄어든다. (블록당 1)
 테이블 블록 번호 순으로 액세스하므로, 인덱스 키 순서대로 출력되지 않는다.
 
CLUSTER 명령어를 이용한 테이블 재구성
 특정 인덱스 칼럼 기준으로 테이블을 재 정렬해서 다시 생성하고 싶다면 CLUSTER 명령어를 사용하면 된다.
 다만, 이때도 Vacuum FULL과 동일하게 SELECT와도 락이 호환되지 않는다는 점을 유의해야 한다.
 
Lossy 모드
 Bitmap Index Scan 방식은 비트맵을 이용해서 처리된다.
 이때, 비트맵 정보는 Backend 프로세스 메모리 내에 저장된다.
 만일 메모리 공간이 부족하면 exact 모드에서 lossy 모드로 전환한다.
 lossy 모드는 exact 모드에 비해서 느리다.
exact 모드는 비트맵 내의 1개의 비트가 1개의 레코드를 가리킨다.
lossy 모드는 비트맵 내의 1개의 비트가 1개의 블록을 가리킨다.
 
Index Only Scan 방식
 Covering Index를 이용하는 것을 Index Only Scan 방식이라고 한다.
 Covering Index SELECT 칼럼 및 WHERE 조건을 모두 포함하는 인덱스를 의미한다.
 Covering Index의 장점은 테이블 랜덤 액세스를 제거할 수 있다는 것이다.
 , Vacuum을 수행해야만 Index Only Scan 방식으로 동작한다.
 
액세스 방식을 제어하는 방법
 SET 절을 이용해서 액세스 방식을 제어할 수 있다

 

# Join 방식

PostgreSQL에서 지원하는 조인 방법
 Nested Loop 조인
 Sort Merge 조인
 해시 조인 (Hybrid 해시 조인 지원)

Nested Loop Join

NL 조인 시에 Materialize가 발생하면 인덱스 생성을 고려해야 한다.

 NL 조인 시에 연결 고리에 인덱스가 없으면 Materialize 오퍼레이션이 발생할 수 있다.

 이는 보완책이지 해결책이 아니다. 따라서 인덱스 생성을 고려해야 한다

 

Hash Join

 해시 조인은 해시 함수를 이용한다. 해시 함수(h)는 다음과 같은 특성을 갖는다.

1. X=Y이면 반드시 h(X)=h(Y) 이다.

2. h(X)≠h(Y)이면 반드시 X≠Y 이다.

3. X≠Y이면 h(X)≠h(Y)인 것이 가장 이상적이다.

4. X≠Y이면 h(X)=h(Y) 일 수도 있다. 이것을 해시 충돌이라고 한다.

 

In-Memory 해시 조인

 In-Memory 해시 조인은 해시 Build 작업을 work_mem 공간 내에서 모두 처리할 수 있을 때 사용하는 방식이다.

 

In-Memory로 처리할 수 없을 때 사용되는 해시 조인 방식들

 해시 Build 작업을 work_mem 공간 내에서 모두 처리할 수 없을 때 사용하는 방식은 크게 3가지이다.

Outer 조인 개요

 Outer 조인은 조인 성공 여부와 무관하게 기준 집합의 레코드를 모두 출력하는 방식이다.

 PostgreSQL ANSI-SQL 형태의 Outer 조인 문법만을 지원한다.

 Outer 조인은 결과 건수에 영향을 미치므로 사용시에 주의해야 한다.

 NL Outer 조인은 기준 집합을 항상 먼저 Driving 한다.

 Hash Outer 조인은 SWAP INPUT 기능을 제공한다

 

Hash Right Join, Hash Left Join의 의미

 

 

 Explain 결과의 Hash Right Join은 기준 테이블이 RIGHT,  Build 테이블이라는 사실을 알려준다.

 Explain 결과의 Hash Left Join은 기준 테이블이 LEFT,  Probe 테이블이라는 사실을 알려준다.

 

 

 

# Query Rewrite

 사용자가 작성한 쿼리를 Optimizer가 더 좋은 실행계획을 수립할 수 있는 형태로 변경하는 것을 Query Rewrite라고 한다.

1) 서브 쿼리 Collapse : 서브 쿼리를 Main 쿼리에 병합하는 기법 (Sub query unnest)

2) View Merging : 뷰 또는 인라인 뷰를 풀어헤쳐 테이블 간의 조인으로 변경하는 방법

3) JPPD(조인 조건 push down) : View Merging이 실패한 경우, 조인 조건을 뷰 내부로 밀어 넣는 방법

 

View Merging

 뷰를 풀어헤쳐서 테이블 간의 조인으로 변경함으로써 , 다양한 조인 순서와 조인 방법을 선택할 수 있다. 이때 View 2개로 구분된다.

 Simple View는 항상 View Merging에 성공한다.

 Complex View는 항상 View Merging에 실패한다.

1) Simple View: Group by , Distinct와 같은 Aggregate를 사용하지 않는 뷰

2) Complex View: Group by , Distinct와 같은 Aggregate를 사용하는 뷰

PostgreSQL Simple View Merging을 지원한다.

 

JPPD (Join Predicate Push Down)

2가지 방법을 이용해서 JPPD를 동작하게 할 수 있다.

① 조인 조건을 상수화 한다.

 LATERAL View를 사용한다. - 측면 테이블의 조건 입력

 이는 JPPD를 직접 구현할 수 있는 매우 획기적인 튜닝 방법이다.

 LATERAL View LEFT JOIN도 지원한다.

 LEFT JOIN시에는 ON TRUE 키워드를 이용한다

 

# 힌트의 필요성과 PG_HINT_PLAN

힌트의 필요성과 PG_HINT_PLAN

 

 특정 인덱스를 지정하거나, 조인 순서를 지정하거나, 여러 개의 테이블 간의 조인 방법을 각

조인마다 다르게 선택하는 것을 사용자가 지정할 수 있다면, 이는 매우 강력한 무기일 것이다.

 ORACLE Hint를 이용해서 이러한 작업을 수행할 수 있다.

 다행히 PG_HINT_PLAN 이란 기능이 제공된다.

 이는 Hint 가 아니라 Plan Tree 자체를 변경하는 기법이다.

 따라서 Hint와 달리 Optimizer PG_HINT_PLAN을 무시할 수 없다.

 , 매우 강력하면서도 위험한 무기인 셈이다.

 

PG_HINT_PLAN 설치

 

PG_HINT_PLAN이 제공하는 Hint

 

 

 

 

# BRIN Index

BRIN

 BRIN PostgreSQL 9.5부터 제공되는 인덱스 유형이다.

 BRIN은 블록 내의 MIN/MAX 값을 이용해서 블록 단위로 인덱싱한다.

 이로 인해 인덱스 크기는 매우 작아진다는 장점이 있다. 이러한 장점으로 인해, 디스크 공간이 부족한 경우에는 BRIN을 선택하기도 한다.

 BRIN EXADATA Storage 인덱스는 매우 흡사하다

 

BRIN의 특성

 BRIN의 크기는 매우 작다. 예를 들어, 1Gb 테이블인 경우에 BRIN의 크기는 6블록이다. (1MB 단위로 1개의 Min/Max 값을 저장하기 때문이다)

 1건을 읽어도 128 블록 (1 MB)를 읽는다.

 BRIN Index Only Scan 방식보다는 느리다. 왜냐면 반드시 테이블을 액세스하기 때문이다.

 BRIN 생성 후에 입력된 레코드들은 Vacuum을 수행해야만 BRIN에 적용된다.

 BRIN Row Level 락을 지원한다.

 

Partial Index

 PostgreSQL은 인덱스 생성 시에 WHERE 조건을 제공한다.

 PostgreSQL NULL 값도 인덱스에 포함된다.

create index t10_flag_idx on t10(flag) where flag='N’;

 

 

# Parallel Processing (병렬 처리)

Parallel Processing

 PostgreSQL 9.6 부터 병렬 처리를 지원한다.

 병렬 처리는 Parallel Scan, Parallel Group by, Parallel Join을 지원한다.

 ORACLE과 같은 생산자-소비자 모델은 아니다.

Worker 프로세스 개수 산정 방식

 Worker 프로세스의 개수는 min_parallel_relation_size 파라미터값을 기준으로 산정한다.

 기준 크기의 3배 단위로 1개씩 증가하며, 최대 7개이다.

Parallel Index Scan

 PostgreSQL 10부터는 Parallel Index Scan 기능을 제공한다.

 Parallel Index Scan 기능은 Index Full Scan 뿐만 아니라 Index Range Scan 시에도 동작한다.

1) 조건절 범위에 해당하는 "Start 리프 블록" "End 리프 블록"의 위치를 계산한다.

2) 처리 범위가 인덱스 병렬 처리를 할 정도로 큰지 확인한다. (아래 표 참조)

3) 만일 크다면, 크기에 따라서 Worker 개수를 설정한 후에, "Start" ~ "End" 범위를 나눠서 처리한다.

4) 만일 작다면, 싱글 프로세스로 처리한다.

 

 

 

# PostgreSQL 파티션

PostgreSQL 파티션

 

 상속 (Inherits)을 이용해서 파티션을 구현함

 인덱스 정보는 상속되지 않음

 Trigger를 이용해서 파티션 Pruning을 처리함

 파티션 생성 시에 CHECK 조건을 이용함

 Range, List 파티션을 제공함

 Global Index는 제공하지 않음

 입력 조건에 맞는 파티션만 액세스하는 것을 파티션 Pruning’이라고 한다.

 이를 위해서는 constraint_exclusion 파라미터를 ‘on’ 또는 ‘partition’으로 설정해야 한다.

(기본 설정값: partition)

 CHECK 조건을 입력하면 정상적으로 파티션 Pruning이 수행된다.

 

서브 파티션을 이용한 튜닝 방안

 1차 파티션을 통해 IO 범위를 줄인 후에도 여전히 IO 량이 많은 경우에는 2차 파티션을 고려한다.

 PostgreSQL은 상속에 의한 파티션 생성 방식이므로, 이론적으로는 n차 파티션도 가능하다.

 따라서 업무 속성에 따른 서브 파티션 생성을 통한 IO 튜닝이 가능하다.

 

파티션 Partial 인덱스를 이용한 튜닝 방안

 PostgreSQL은 파티션 Partial 인덱스를 제공한다.

 , 파티션 별로 인덱스 생성 여부를 결정할 수도 있고, 파티션 마다 다른 인덱스 (, B*Tree, Covering Index, BRIN )를 생성할 수도 있다.

 참고로, 오라클은 12c 버전부터 파티션 Partial 인덱스 기능을 제공한다.

 

파티션 입력 성능 향상을 위한 Tip

 RULE 보다는 Trigger를 이용한다. 어떤 경우에도 Trigger가 빠르다.

 자주 입력되는 파티션을 Trigger의 윗 부분에 위치하는 것이 좋다. 그래야 IF THEN ELSE의 부하를 줄일 수 있다.

 가능하면, 파티션을 지정해서 입력하는 것이 좋다.

 

PostgreSQL 파티션 Pruning 시의 주의 사항

 예상과 달리, 파티션 Pruning이 동작하지 않는 경우가 존재한다.

 이점은 쿼리 작성 시에 매우 주의해야할 점이다.

▪ IN 절 내에 Subquery를 사용할 경우에는 파티션 Pruning이 동작하지 않는다.

▪ IN 절 사용시 파티션 Pruning을 유도하기 위해서는 실제 CHECK 조건을 입력해야 한다.

 NL 조인으로 수행되면 추가 조건 없이도 파티션 Pruning이 수행된다.

 Hash 조인으로 수행되면 추가 조건을 반드시 입력해야 한다.

 따라서, 쿼리 작성 후에 Explain 결과 확인 및 추가 조건을 입력할 필요가 있다.

 Hash 조인으로 수행될 때를 고려해서, 상수 조건을 추가하는 것을 습관화 하는 것이 좋다.

 PostgreSQL 10부터 오라클과 유사한 파티션 생성 문법을 제공한다.

 이때, 트리거는 생성할 필요가 없다. (이점은 관리측면의 편의성을 제공한다)

 , 파티션 Pruning은 기존과 같은 한계가 존재한다. (, 해시 조인 시에는 상수 조건 추가 필요)

 

파티션 성능 테스트(INSERT)

 9.6 까지는 파티션이 1개인 경우에도 일반 테이블보다 입력 속도가 3배 이상 느리다. 그 이유는 매 건마다 Trigger 함수를 호출하는 부하 때문이다.

 CPU 성능에 좋을수록 이 차이는 감소한다.

 파티션 개수가 많아질 수록 입력 성능은 저하된다.

 이 문제는 PG10 버전에서도 여전히 발생한다.

 상속을 이용한 파티션은 Trigger 조정을 통해서 입력 성능을 향상 시킬 수 있다.

 하지만, Native 파티션 (PG 10 버전)은 입력 파티션 위치에 따른 성능 차이가 거의 없다.

 

 

 

# PostgreSQL – Grafana 연동

설치하기 전 git, make, go 패키지 설치

# yum install git

# yum install make

# yum install go

 

git에서 postgres_exporter 가져옴

# git clone https://github.com/prometheus-community/postgres_exporter.git

 

폴더로 이동 후 빌드

# cd postgres_exporter

# make build

 

데이터 소스 환경 변수 설정 및 실행

# export DATA_SOURCE_NAME=postgresql://어드민계정:어드민비밀번호@RDS_ENDPOINT:5432/접속DB?sslmode=disable

# . /postgres_exporter

Prometheus에 pgexporter Job 등록

# vi prometheus.yml

Prometheus 서버에 pgexporter가 등록되었는지 확인

http://prometheus서버ip:9090/targets

 

Prometheus 그래프 확인

http://prometheus서버ip:9090/graph

 

Grafana에서 대시보드에 그래프 출력

 

Grafana에 PostgreSQL 직접 등록

 

 

 

 

# PostgreSQL slow query – Cloudwatch 연동

RDS의 데이터베이스 옵션에서 Cloudwatch Logs로 보낼 수 있도록 설정.

 

 

 

 

 

 

 

반응형

'Database 관리 > PostgreSQL' 카테고리의 다른 글

속도.postgres vs mariad  (0) 2022.06.15
설치/기본사용.우분투  (0) 2022.06.15
Docker 설치  (0) 2022.01.18

MLFlow.6.MLflow Projects

인공지능,AI,학습,ML,Tensorflow, Cafee2,MLFlow/MLFlow
반응형

# 참조 : https://dailyheumsi.tistory.com/263?category=980484

 

이번에는 MLflow Project 에 대해서 자세히 알아본다.

 

사전 준비

이전 글을 확인하자.

 

개요

MLflow Project는 말 그대로 MLflow에서 유용하게 관리, 사용하기 위해 정의하는 양식이다. 말로 설명하는 것보다 그냥 보고 이해하는게 더 빠를거 같다.

다음은 examples/sklearn_logistic_regression 에 있는 예시다. 하나의 MLflow Project는 다음과 같은 구조를 가진다고 보면 된다.

sklearn_logistic_regression
├── MLproject
├── conda.yaml
└── train.py

MLproject 라는 파일이 존재하는데, 이 파일을 통해 이 프로젝트가 MLflow Project 임을 알 수 있다. MLflow Projet 는 mlflow run 명령어로 실행이 가능하다. 위의 경우 mlflow run sklearn_logistic_regression 으로 실행할 수 있다.

 

MLProject 살펴보기

MLflow Project 를 mlflow run 으로 실행할 때 무엇을 어떻게 실행할 것인지를 알아야하는데, 이에 대한 내용을 MLproject 파일이 담고있다.

간단한 예시를 보자. 다음은 examples/sklearn_elasticnet_wine/MLproject 파일의 내용이다.

name: tutorial

conda_env: conda.yaml

entry_points:
  main:
    parameters:
      alpha: {type: float, default: 0.5}
      l1_ratio: {type: float, default: 0.1}
    command: "python train.py {alpha} {l1_ratio}"

하나씩 이해해보자.

  • name
    • MLProject의 프로젝트 이름이라고 보면 된다.
  • conda_env
    • 이 MLProject 를 실행할 때 conda 환경을 만든 뒤 실행하게 되는데, 이 때 참고할 conda 환경에 대한 파일이름을 값으로 가진다. 여기서는 이 프로젝트 내 conda.yaml 에 이 설정 값들이 있다.
    • conda가 아닌 docker를 사용할 수 있는데, 이 때 docker_env 라는 키를 사용하면 된다. 이에 대한 내용은 아래에서 다시 설명하겠다.
  • entry_points
    • mlflow run 으로 실행할 때 -e 옵션으로 프로젝트 실행에 여러 진입점을 둘 수 있는데, 이 때 사용되는 값이다.
    • 예를 들면, 위의 경우 mlflow run -e main sklearn_elastic_wine 으로 main 이라는 진입점으로 실행할 수 있다.
    • 위 명령어가 실행되면 python train.py {alpha} {l1_ratio} 명령어를 실행한다. 이 때 {alpha}  {l1_ratio} 는 위 mlflow run 시 받는 파라미터 값이다. 이는 parameters 에 정의가 되어있다.

다시 정리해보면 위와 같이 정의된 MLflow Project는 다음 명령어로 실행할 수 있다.
(코드에서는 mlflow.projects.run() 명령어로 실행할 수 있다. 이에 대한 내용은 여기를 참고하자.)

$ mlflow run -e main sklearn_elastic_wine -P alpha=0.1 -P l1_ratio=0.5

이 명령어는 다시 내부적으로 아래 명령어를 실행하게 된다.

$ python train.py 0.1 0.5

 

Docker 환경 사용하여 실행하기

 MLproject 파일 내에서 conda_env 를 사용하였다. 이럴 경우 MLflow Project를 실행시키는 환경에 conda가 미리 깔려있어야 실행이 가능하다. conda가 깔려있지 않으면 mlflow run 에서 에러를 뱉을 것이다. (--no-conda 옵션을 주는 경우도 있지만, 이럴 경우 또 virtuanlenv 등으로 가상 환경을 세팅하고 필요한 라이브러리르 일일이 설치해주어야 해서 번거롭다.)

conda를 쓰지 않고 docker 컨테이너 환경으로 실행이 가능한데 이 방법을 살펴보자.
이번에도 역시 공식 예제를 활용한다. 다음은 examples/docker 에 있는 예시다.

docker
├── Dockerfile
├── MLproject
├── README.rst
├── kubernetes_config.json
├── kubernetes_job_template.yaml
├── train.py
└── wine-quality.csv

여기서 주목할만한 파일은 Dockerfile  MLproject 파일이다. 이 둘을 살펴보자.

# Dockerfile

FROM python:3.8.8-slim-buster

RUN pip install mlflow>=1.0 \
    && pip install numpy \
    && pip install pandas \
    && pip install scikit-learn

# 예제 파일을 그대로 실행하면 오류가 생겨서 약간 손을 보았다.
# 베이스 이미지 수정, 필요없는 패키지 및 버전을 지운 정도다.
# 아마 2년 전 예제라 업데이트가 잘 안된 듯 싶다.
# MLproject

name: docker-example

docker_env:
  image:  mlflow-docker-example

entry_points:
  main:
    parameters:
      alpha: float
      l1_ratio: {type: float, default: 0.1}
    command: "python train.py --alpha {alpha} --l1-ratio {l1_ratio}"

Dockerfile 파일에서는 환경 구상을 위해 필요한 패키지들을 설치한다.
MLproject 파일에서는 docker_env 를 사용하고 있고, 사용할 도커 이미지 이름을 설정한다.

이제 이 MLflow Project 를 실행해보자.
먼저 mlflow run 을 하기 전에 Dockerfile 을 이용하여 mlflow-docker-example 라는 이름의 도커 이미지를 만들어 주어야 한다.

$ docker build -t mlflow-docker-example -f Dockerfile .

이제 mlflow run 으로 이 프로젝트를 실행한다.

$ mlflow run docker -P alpha=0.5

이렇게 실행하면 mlflow  mlflow-docker-example 이름의 도커 이미지를 찾아 그 위에 mlflow 코드를 실행하는 도커 이미지를 하나 더 만들고 이 이미지를 실행한다. 결과적으로 이미지를 하나 더 만드는 셈이다. 아래 사진을 보면 docker-example 이라는 이미지가 만들어 진 것을 볼 수 있다.

이미 감이 온 사람은 알겠지만, MLProject  docker_env.image 값은 로컬 도커 이미지가 아니여도 된다. Dockerhub나 GCR, ECR 등에 미리 만들어두고 사용해도 된다. 또한 컨테이너 내부의 환경 변수 설정 등도 가능하다. 자세한 내용은 여기를 참고하자.

 

Github에 있는 프로젝트 실행하기

지금까지 로컬에 있는 MLflow Project를 실행했다면 다음처럼 github에 올려둔 MLProject 를 실행시킬 수 있다. 예를 들면 다음과 같다.

mlflow run git@github.com:mlflow/mlflow-example.git -P alpha=0.5 --no-conda

 

쿠버네티스에서 실행하기

mlflow run 을 할 때 --backend  --backend-config 파라미터 설정으로 MLflow Project를 쿠버네티스 상에서 실행시킬 수 있다. (Job 리소스로 실행된다.)
예를 들면 다음과 같다.

$ mlflow run <project_uri> \
--backend kubernetes \
--backend-config kubernetes_config.json

위 명령어를 실행하게 되면 다음의 과정이 일어난다.

  1. MLflow Project 실행을 도커 이미지로 만든다.
  2. 이 이미지를 사용자가 설정해둔 도커 컨테이너 레지스트리에 푸시한다.
  3. 쿠버네티스에서 이 이미지를 Job으로 배포한다.

위 명령어가 실행이 되려면 푸시할 도커 이미지 레지스트리와 쿠버네티스 접속 컨텍스트가 필요한데, 이를 위해 MLflow Project 내에 다음과 같은 파일이 있어야 한다.

# kubernetes_config.json

{
    "kube-context": "docker-for-desktop",
    "kube-job-template-path": "examples/docker/kubernetes_job_template.yaml",
    "repository-uri": "username/mlflow-kubernetes-example"
}
# kubernetes_job_template.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: "{replaced with MLflow Project name}"
  namespace: mlflow
spec:
  ttlSecondsAfterFinished: 100
  backoffLimit: 0
  template:
    spec:
      containers:
      - name: "{replaced with MLflow Project name}"
        image: "{replaced with URI of Docker image created during Project execution}"
        command: ["{replaced with MLflow Project entry point command}"]
      resources:
        limits:
          memory: 512Mi
        requests:
          memory: 256Mi
      restartPolicy: Never

직접 여기서 시도해보지는 않았지만, 아마도 쿠버네티스에서 MLflow를 배포하고 운영하는 팀에서는 이를 적극적으로 활용하지 않을까 싶다.

 

정리

정리해보자.

  • MLflow Project는 MLflow 에서 사용, 관리 가능한 하나의 프로젝트를 의미한다.
    • 프로젝트 루트 폴더에 MLproject 파일이 있어야 하고, 이 파일은 프로젝트 실행 및 환경에 대한 내용을 담는다.
    • mlflow run {{ project_name }} 으로 실행가능하다.
  • MLflow Project는 conda, docker 환경으로 실행이 가능하다.
  • 실행할 프로젝트는 로컬 뿐 아니라 Github 상에 있어도 가능하다.
    • MLProject들을 별도로 모아둔 Github Repository를 만들고 이를 최신 공용 저장소로 이용해볼 수도 있을거 같다.
  • 쿠버네티스 위에서 Job으로도 실행할 수도 있다.

 

참고

반응형

'인공지능,AI,학습,ML,Tensorflow, Cafee2,MLFlow > MLFlow' 카테고리의 다른 글

Docker Compose로 MLflow 배포  (0) 2021.12.30
MLFlow.6.More about Models  (0) 2021.12.28
MLflow.5.Model Registry  (0) 2021.12.27
MLflow.4.Tracking Server  (0) 2021.12.27
MLflow.3.Experiments & Runs  (0) 2021.12.24

MLFlow.6.More about Models

인공지능,AI,학습,ML,Tensorflow, Cafee2,MLFlow/MLFlow
반응형

# 참고 : https://dailyheumsi.tistory.com/262?category=980484

이번에는 MLflow의 Model에 대해서 좀 더 자세히 알아본다.

 

사전 준비

이전 글을 참고하자.

 

모델 저장하기

mlflow로 코드에서 모델을 저장하는 방법은 다음처럼 크게 2가지가 있다.

  • mlflow.sklearn.save_model()
  • mlflow.sklearn.log_model()

일단 sklearn 등 머신러닝 모델 프레임워크 단위로 함수를 제공한다.
그리고 log_model()  save_model() 를 똑같이 실행하는 것인데, 저장되는 위치가 run 내부라는 것이 다르다. 일단은 간단한 동작을 보기 위해 save_model() 을 사용해보자.

예를 들면 다음과 같다.

import mlflow

model = ... 
mlflow.sklearn.save_model(model, "my_model")

이렇게 저장하고 나면 다음과 같은 결과물이 생긴다.

my_model/
├── MLmodel
└── model.pkl

model.pkl 은 모델 인스턴스가 picklezed 된 파일이라고 보면 된다.
MLmodel 에는 다음처럼 모델에 대한 메타 정보가 담긴다.

# MLmodel

time_created: 2018-05-25T17:28:53.35

flavors:
  sklearn:
    sklearn_version: 0.19.1
    pickled_model: model.pkl
  python_function:
    loader_module: mlflow.sklearn

 

시그니처 추가하기

누군가가 만들어 놓은 MLflow 모델을 보게되면 보통 MLmodel 을 통해 모델에 대한 정보를 먼저 파악하려고 할 것이다. 그런데 위 MLmodel 파일만 봐서는 이 모델이 어떤 입력을 받고 어떤 출력을 뱉는지 알수가 없다. 입출력에 대한 정보는 시그니처라고 말하는데, 이를 쉽게 알 수 있도록 시그니처를 추가해주자.

예시 코드는 다음과 같다.

import pandas as pd
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
import mlflow
import mlflow.sklearn
from mlflow.models.signature import infer_signature

iris = datasets.load_iris()
iris_train = pd.DataFrame(iris.data, columns=iris.feature_names)
clf = RandomForestClassifier(max_depth=7, random_state=0)
clf.fit(iris_train, iris.target)

# 입출력 정보를 정해주는 부분. 이런 정보를 시그니처라고 한다.
signature = infer_signature(iris_train, clf.predict(iris_train))

# 위에서 정한 시그니처 값을 인자로 넘긴다.
mlflow.sklearn.log_model(clf, "iris_rf", signature=signature)

위에서는 infer_signature() 함수를 사용하여 시그니처를 정해주었다. 이 함수는 실제 입력데이터와 출력 데이터를 파라미터로 넘기면, 시그니처를 알아서 추론해준다. 구체적인 모양새는 여기를 참고하자.

위처럼 추론해주는 함수를 쓰지않고 다음처럼 직접 시그니처를 지정할 수도 있다.

from mlflow.models.signature import ModelSignature
from mlflow.types.schema import Schema, ColSpec

input_schema = Schema([
  ColSpec("double", "sepal length (cm)"),
  ColSpec("double", "sepal width (cm)"),
  ColSpec("double", "petal length (cm)"),
  ColSpec("double", "petal width (cm)"),
])
output_schema = Schema([ColSpec("long")])
signature = ModelSignature(inputs=input_schema, outputs=output_schema)

tensorflow를 쓰는 경우 tensor-based 로 시그니처를 잡아줄 수도 있는데, 이는 공식 문서에 확인하자.

여하튼 위 코드를 실행하면 MLmodel 파일에는 다음처럼 시그니처 정보가 추가된다.

artifact_path: iris_rf
flavors:
  python_function:
    env: conda.yaml
    loader_module: mlflow.sklearn
    model_path: model.pkl
    python_version: 3.8.7
  sklearn:
    pickled_model: model.pkl
    serialization_format: cloudpickle
    sklearn_version: 0.24.2
run_id: 8f7e5d6b6e4e4a69a06ad1fd9e1eeafd
signature:
  inputs: '[{"name": "sepal length (cm)", "type": "double"}, {"name": "sepal width
    (cm)", "type": "double"}, {"name": "petal length (cm)", "type": "double"}, {"name":
    "petal width (cm)", "type": "double"}]'
  outputs: '[{"type": "tensor", "tensor-spec": {"dtype": "int64", "shape": [-1]}}]'
utc_time_created: '2021-05-08 05:49:44.141412'

 

입출력 예시 추가하기

이번엔 모델 입출력 예시까지 추가해보자.
위 코드에서 mlflow.sklearn.log_model() 함수에 input_example 인자 값을 다음처럼 추가한다.

input_example = {
  "sepal length (cm)": 5.1,
  "sepal width (cm)": 3.5,
  "petal length (cm)": 1.4,
  "petal width (cm)": 0.2
}
mlflow.sklearn.log_model(clf, "iris_rf", input_example=input_example)

코드를 실행하면 MLmodel 파일이 있는 디렉토리 (artifacts/iris_rf) 내에 input_example.json 이라는 파일이 다음처럼 생기게 된다.

{
    "columns": [
        "sepal length (cm)", 
        "sepal width (cm)",
        "petal length (cm)", 
        "petal width (cm)"
    ], 
    "data": [
        [5.1, 3.5, 1.4, 0.2]
    ]
}

이 정보는 MLflow 웹서버에서 실행(Run) 상세 페이지 하단에 Artifacts 탭에서 볼 수 있다.

 

그 외

공식 홈페이지 문서에는 이 외에도 다음 내용들이 더 있다.

  • Built-In Model Flavor
  • Model Customization
  • Built-In Deployment Tools
  • Deployment to Custom Target

이 내용들은 부가적인 내용이라고 생각한다. 여기서는 그래도 좀 많이 사용되겠다 싶은 것들만 소개해보았다.

 

정리

정리해보자.

  • 모델 저장은 save_model() 혹은 log_model() 로 한다.
    • 근데 내 생각에 대부분의 경우, MLflow 를 실행(Run) 단위로 기록하기 때문에 log_model() 을 쓰지 않을까 싶다.
    • 모델을 저장하면 모델 인스턴스를 Picklized 한 model.pkl 과 메타 정보를 담고 있는 MLmodel 파일이 생긴다.
  • 모델의 시그니처와 입출력 예시를 코드에서 세팅해줄 수가 있다.

최종적으로 코드는 다음과 같은 형태가 될 것이다.

import pandas as pd
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
import mlflow
import mlflow.sklearn
from mlflow.models.signature import infer_signature, ModelSignature
from mlflow.types.schema import Schema, ColSpec

iris = datasets.load_iris()
iris_train = pd.DataFrame(iris.data, columns=iris.feature_names)
clf = RandomForestClassifier(max_depth=7, random_state=0)
clf.fit(iris_train, iris.target)

# 시그니처 정의 방법 1 (직접 입력해줄 수 있다.)
input_schema = Schema([
  ColSpec("double", "sepal length (cm)"),
  ColSpec("double", "sepal width (cm)"),
  ColSpec("double", "petal length (cm)"),
  ColSpec("double", "petal width (cm)"),
])
output_schema = Schema([ColSpec("long")])
signature = ModelSignature(inputs=input_schema, outputs=output_schema)

# 시그니처 정의 방법 2 (입출력 데이터로 자동 추론할 수도 있다.)
# signature = infer_signature(iris_train, clf.predict(iris_train))

# 입출력 예시 정의
input_example = {
  "sepal length (cm)": 5.1,
  "sepal width (cm)": 3.5,
  "petal length (cm)": 1.4,
  "petal width (cm)": 0.2
}

# 모델 저장
mlflow.sklearn.log_model(
    clf,
    "iris_rf", 
    signature=signature, 
    input_example=input_example
)

최종적으로 생성되는 artifacts 는 다음과 같다.

artifacts
└── iris_rf
    ├── MLmodel
    ├── conda.yaml
    ├── input_example.json
    └── model.pkl

참고

반응형

'인공지능,AI,학습,ML,Tensorflow, Cafee2,MLFlow > MLFlow' 카테고리의 다른 글

Docker Compose로 MLflow 배포  (0) 2021.12.30
MLFlow.6.MLflow Projects  (0) 2021.12.28
MLflow.5.Model Registry  (0) 2021.12.27
MLflow.4.Tracking Server  (0) 2021.12.27
MLflow.3.Experiments & Runs  (0) 2021.12.24

크롬 자체 기능 개발 활용 ( 네트워크 로그 등 )

Chrome Browser 활용법
반응형

# 참조 : https://ko.androideity.com/list-chrome-urls

 

 

  • chrome : // about -모든 내부 Chrome URL을 나열합니다.
  • chrome : // accessibility -브라우저에 열려있는 각 탭에 대한 접근성 정보와 기능이 전역 적으로 켜져 있는지 여부를 표시합니다.
  • chrome : // appcache-internals -사용하는 공간을 포함하여 appcached 사이트에 대한 정보.
  • chrome : // apps / -설치된 모든 애플리케이션 (사용자 별 및 Chrome 브라우저와 함께 제공되는 애플리케이션)을 새 페이지에 나열합니다.
  • chrome : // blob-internals / -Binary Large Object (Blob)에 대한 정보
  • chrome : // bluetooth-internals / -연결된 Bluetooth 어댑터 및 장치에 대한 정보를 표시합니다. 장치가 표시되고 검색 가능한지 여부.
  • chrome : // bookmarks -브라우저의 북마크 관리자를 엽니 다.
  • chrome : // chrome / -정보 페이지를 엽니 다.
  • chrome : // chrome-urls -이 목록을 표시합니다. Chrome : // About로로드 할 수도 있습니다.
  • chrome : // components / - '크롬 크래시 서비스'또는 '페퍼 플래시'와 같은 내부 구성 요소 목록 및 각각에 대한 업데이트를 개별적으로 확인하는 옵션.
  • chrome : // conflicts / -로드 된 모든 모듈을 나열하고 충돌이 있는지 여부를 표시합니다.
  • chrome : // crashes / -충돌보고가 활성화 된 경우 최근 충돌에 대한 정보를 표시합니다.
  • chrome : // credits -브라우저에 포함 된 기술, 해당 라이선스 및 제작자
  • chrome : // device-log / -장치 관련 이벤트의 로그를 보여줍니다.
  • chrome : // devices / -Chrome에 연결된 물리적 또는 가상 장치를 나열합니다. Google 클라우드 프린트에 프린터를 추가하는 옵션.
  • chrome : // dino - '인터넷에 연결되어 있지 않습니다'오류 페이지가 표시됩니다.
  • chrome : // discards / -세션 중에 삭제 된 탭에 대한 정보. 페이지에서 개별 탭을 삭제하는 옵션입니다.
  • chrome : // download-internals -다운로드를 시작하고 응답 및 프로세스를 모니터링합니다.
  • chrome : // downloads -과거의 모든 다운로드를 나열하는 브라우저의 다운로드 관리자
  • chrome : // extensions -설치된 확장을 표시합니다.
  • chrome : // flags -브라우저에 한 번에 통합되거나 통합되지 않을 수있는 실험적 기능을 표시합니다.
  • chrome : // gcm-internals / -Google 클라우드 메시징 정보를 표시합니다.
  • chrome : // gpu -비디오 카드 및 지원되는 기능에 대한 정보 (예 : 하드웨어 가속
  • chrome : // help / -정보 페이지를 엽니 다.
  • chrome : // histograms -히스토그램 관련 정보
  • chrome : // history -검색 기록을 지우거나 과거에 열었던 페이지를 찾기 위해 검색하는 옵션이있는 검색 기록 페이지를 엽니 다.
  • chrome : // indexeddb-internals / -사용자 프로필의 IndexedDB 정보.
  • chrome : // inspect -Chrome의 페이지 또는 확장 프로그램과 같은 요소를 검사하는 옵션
  • chrome : // interventions-internals -개입 상태, 플래그, 로그 및 기타 정보를 나열합니다.
  • chrome : // invalidations / -무효화 디버그 정보 나열
  • chrome : // local-state / -기능 및 로컬 브라우저에서 활성화 여부, 상태 정보를 나열합니다.
  • chrome : // media-engagement -브라우저에서 열린 모든 사이트에 대한 미디어 참여 점수와 임계 값을 표시합니다. 점수는 사운드와 함께 비디오 자동 재생을 결정하는 데 사용됩니다.
  • chrome : // media-internals -미디어 재생시 미디어 정보 표시
  • chrome : // nacl -Chrome의 NaCl 플러그인 (Native Client)에 대한 정보
  • chrome : // net-export -네트워크 활동을 캡처하여 디스크의 파일에 저장합니다.
  • chrome : // net-internals -SPDY 연결, 소켓 또는 DNS 조회를 포함한 자세한 네트워크 및 연결 관련 정보를 표시합니다.
  • chrome : // network-error / -네트워크 오류 메시지를 표시합니다.
  • chrome : // network-errors / -Chrome에서 발생할 수있는 네트워크 오류 메시지 목록을 표시합니다.
  • 크롬 : // newtab -새 탭 페이지를 표시합니다.
  • chrome : // ntp-tiles-internals -새 탭 페이지 및 상위 사이트 기능에 타일에 대한 정보를 표시합니다.
  • chrome : // omnibox -이 페이지에 검색 주소창 입력 결과를 표시하며 검색 결과에 검색, 바로 가기 및 기록 정보를 포함합니다.
  • chrome : // password-manager-internals / -비밀번호 관리자 로그가 페이지에 나열됩니다. 페이지를 닫으면 로그가 자동으로 지워집니다.
  • chrome : // policy -현재 브라우저에서 활성화 된 모든 정책
  • chrome : // predictors -과거 활동을 기반으로 한 자동 완성 및 리소스 프리 페치 예측 자 목록
  • chrome : // print -인쇄 미리보기 페이지
  • chrome : // process-internals -프로세스 및 사이트 격리 정보, 프레임 트리.
  • chrome : // quota-internals -Chrome 프로필 디렉토리에 사용할 수있는 디스크 여유 공간, 사용량 및 할당량 세부 정보에 대한 정보
  • chrome : // safe-browsing -현재 공사중입니다. 세이프 브라우징 상태를 표시합니다.
  • chrome : // serviceworker-internals / -브라우저에 등록 된 모든 서비스 워커와 등록 취소 옵션을 나열합니다.
  • chrome : // settings -기본 Chrome 설정 페이지를 엽니 다.
  • chrome : // signin-internals -마지막 로그인 세부 정보 또는 유효성과 같은 로그인 된 계정에 대한 정보를 표시합니다.
  • chrome : // site-engagement -브라우저에서 방문한 모든 사이트에 대한 참여 점수를 표시합니다.
  • chrome : // suggestions / -모든 새 탭 페이지 제안 및 만료시기.
  • chrome : // supervised-user-internals / -활성 사용자에 대한 정보를 나열하고 관리자에게 웹 사이트 필터 및 기타 사항을 테스트 할 수있는 옵션을 제공합니다.
  • chrome : // sync-internals -활성화 된 경우 브라우저의 동기화 기능에 대한 자세한 정보.
  • chrome : // system / -시스템, 동기화, 메모리 사용량 등에 대한 JSON 정보를 나열합니다.
  • chrome : // terms -Google 크롬의 서비스 약관
  • chrome : // thumbnails / -미리보기 이미지가 있거나없는 모든 상위 사이트 URL.
  • chrome : // tracing -페이지가 정보로 채워지기 전에 녹음이 활성화되어야합니다. 그렇게하면 브라우저가 탐색 활동을 기록하기 시작합니다
  • chrome : // translate-internals / -지원되는 언어를 포함하는 번역 정보, 언어가 번역되지 않거나 항상 번역되지 않고 기록됩니다.
  • 크롬; // usb-internals -컴퓨터에 연결된 USB 장치를 추가하고 테스트합니다.
  • chrome : // user-actions / -사용자 작업 로그 (예 : 탭 닫기, 탭 변경 등.
  • chrome : // version -브라우저 버전 및 명령 줄 스위치, 사용자 에이전트, JavaScript, Flash 및 WebKit 버전, 경로 변수를 포함한 다양한 관련 정보를 표시합니다.
  • chrome : // webrtc-internals / -PeerConnection 업데이트 및 통계 데이터를 다운로드하여 덤프를 만듭니다.
  • chrome : // webrtc-logs / -최근 캡처 한 WebRTC 로그를 나열합니다.
반응형