반응형
반응형

파이썬 가상환경 설정에 대한 이전 글이 있지만, VirtualEnvWrapper 툴을 이용하여 가상환경을 설정하는게 더 편한거 같아 이 방법도 올린다.

 

pip 설치

$ sudo apt-get install python-pip

 

virtualenvwrapper 설치

$ sudo pip install virtualenvwrapper    // virtualenv 도 설치 된다.

 

가상 환경을 저장할 디렉토리를 생성하고, 환경변수에 등록

$ mkdir ~/.virtualenvs         //  .virtualenvs 라는 디렉토리 생성

 

~/.bashrc 파일 마지막에 아래 내용을 적어줌.

export WORKON_HOME=~/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

 

바뀐 .bashrc 파일 적용

$ source .bashrc

 

가상환경 생성

mkvirtualenv [가상환경 이름]     //  이렇게 사용한다.

$ mkvirtualenv py2     // py2 라는 가상환경을 생성했다.

프롬프트 앞에 (py2)가 붙을 것이다. 그래도 제대로 생성되었는지 확인해보자

(py2)~$ which python

/home/user_name/.virtualenvs/py2/bin/python  이라고 나오면 정상적으로 생성된것이다.

 

py2 가상환경에서 빠져나오려면,

(py2)~$ deactivate

다시 py2 가상환경에 접속하려면

$ workon py2

 

파이썬3 버전의 가상환경도 만들어 주자.

$ mkvirtualenv py3 –-python=python3     //  python3 버전의  py3라는 가상환경을 생성.

프롬프트 앞에 이번에는 (py3)가 붙어 있을것이다.  마찬가지로 제대로 생성되었는지 확인.

(py3)~$ which python

/home/user_name/.virtualenvs/py3/bin/python  라고 나온다.  제대로 되었다.

 

python2, python3 버전의 py2, py3 라는 가상환경을 설정하였다. 이제부터는 가상환경에 접속해서 작업하면 된다.



가상환경 기본 사용법

* 가상환경 접속

$ workon 가상환경 이름     // py2 나 py3 등 본인이 만든 가상환경 이름

* 가상환경 종료

$ deactivate

* 가상환경 목록

$ lsvirtualenv

* 가상환경 삭제

$ rmvirtualenv



  • 가상환경 종료
    deactivate
  • 가상환경 디렉토리로 이동
    cdvirtualenv
  • 현재 가상환경의 써드 파티 패키지 전체 삭제
    wipeenv
  • 가상환경 목록
    lsvirtualenv
  • 가상환경 삭제
    rmvirtualenv
  • 모든 가상환경에 대한 명령 실행
    # allvirtualenv command with arguments
    allvirtualenv pip install -U pip


반응형

'연구개발 > Linux' 카테고리의 다른 글

AWS EC2 (AMI)에 Java, Scala, Spark, Kafka, MongoDB, Redis, Node.js, Maven 설치  (0) 2017.12.29
centos fdisk  (0) 2017.03.30
ubuntu 방화벽  (0) 2016.03.14
zabbix mail setting  (0) 2016.03.03
swap  (0) 2016.03.02
반응형

리눅스 용량 확장 명령어 resize2fs 사용법 (Nothing to do! 나올때)

출처: http://vitta.tistory.com/25 [Cloud]



EC2 의 CENTOS 의 경우 8G 정도의 Root 볼륨이 할당됩니다. 약간 작아 20G로 resize2fs 시켜 사용중이었는데 6.7 버전부터 resizefs /dev/xvda1 을 하면 

The filesystem is already 2096896 blocks long.  Nothing to do!

라는 메세지가 발생합니다.

이를 해결하기 위해 아래의 방법을 실행합니다.

 이는 시작 섹터를 변경하여  이전 파티션을 삭제하고 동일한 파티션 번호를 새로 생성하게 하는 것입니다. 잘못될 경우 부팅에 실패할 수 있으므로, 사용 중인 시스템에서는 백업이 필수라 여겨집니다. 


[root@cateye ~]$ lsblk 

NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

xvda    202:0    0  20G  0 disk 

└─xvda1 202:1    0   8G  0 part /

[root@cateye ~]# resize2fs /dev/xvda1

resize2fs 1.41.12 (17-May-2010)

The filesystem is already 2096896 blocks long.  Nothing to do!


[root@cateye ~]# resize2fs /dev/xvda

resize2fs 1.41.12 (17-May-2010)

resize2fs: Device or resource busy while trying to open /dev/xvda

Couldn't find valid filesystem superblock.

[root@cateye ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/xvda1      7.8G  943M  6.5G  13% /

tmpfs           938M     0  938M   0% /dev/shm

[root@cateye ~]# fdisk /dev/xvda


WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

         switch off the mode (command 'c') and change display units to

         sectors (command 'u').


Command (m for help): u

Changing display/entry units to sectors


Command (m for help): p


Disk /dev/xvda: 21.5 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x00057cbb


    Device Boot      Start         End      Blocks   Id  System

/dev/xvda1   *        2048    16777215     8387584   83  Linux


Command (m for help): d

Selected partition 1


Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

p

Partition number (1-4): 1

First sector (63-41943039, default 63): 2048

Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): ENTER

Using default value 41943039


Command (m for help): p


Disk /dev/xvda: 21.5 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x00057cbb


    Device Boot      Start         End      Blocks   Id  System

/dev/xvda1            2048    41943039    20970496   83  Linux


Command (m for help): a

Partition number (1-4): 1


Command (m for help): w

The partition table has been altered!


Calling ioctl() to re-read partition table.


WARNING: Re-reading the partition table failed with error 16: Device or resource busy.

The kernel still uses the old table. The new table will be used at

the next reboot or after you run partprobe(8) or kpartx(8)

Syncing disks.


[root@cateye ~]# reboot


Broadcast message from root@cateye



[root@cateye ~]$ lsblk 

NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

xvda    202:0    0  20G  0 disk 

└─xvda1 202:1    0  20G  0 part /

[root@cateye ~]$ df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/xvda1       20G  947M   18G   5% /

tmpfs           938M     0  938M   0% /dev/shm



위의 내용은 제가 직접 실행한 내용이고, 아래에 설명을 따라했습니다. 가급적이면 원본 사이트에가서 참조하시기 바랍니다.



To expand on JD's self-accepted answer, here's exactly what to do:

df -h #print the name of your boot partition

lsblk #show info on all your block devices

You'll see from that output what the name of the disk is of your root partition. For example, you probably see something like this:  xvde 202:64 0 32G 0 disk └─xvde1 202:65 0 8G 0 part /

Our goal is to make xvde1 use the whole available space from xvde. Here's how your resize your partition:

fdisk /dev/xvda (the disk name, not your partition) This enters into the fdisk utility.

  1. u #Change the display to sectors
  2. p #Print info
  3. d #Delete the partition
  4. n #New partition
  5. p #Primary partition
  6. 1 #Partition number
  7. 2048 #First sector
  8. Press Enter to accept the default
  9. p #Print info
  10. a #Toggle the bootable flag
  11. 1 #Select partition 1
  12. w #Write table to disk and exit

Now, reboot your instance: reboot

After it comes back do:

resize2fs /dev/xvde1 (the name of your partition, not the block device)

And finally verify the new disk size: df -h

1 출처는 여기

http://stackoverflow.com/questions/26770655/ec2-storage-attached-at-sda-is-dev-xvde1-cannot-resize



출처: http://vitta.tistory.com/25 [Cloud]

반응형
반응형

https://hunkim.github.io/ml/


모두를 위한 머신러닝과 딥러닝의 강의

알파고와 이세돌의 경기를 보면서 이제 머신 러닝이 인간이 잘 한다고 여겨진 직관과 의사 결정능력에서도 충분한 데이타가 있으면 어느정도 또는 우리보다 더 잘할수도 있다는 생각을 많이 하게 되었습니다. Andrew Ng 교수님이 말씀하신것 처럼 이런 시대에 머신 러닝을 잘 이해하고 잘 다룰수 있다면 그야말로 "Super Power"를 가지게 되는 것이 아닌가 생각합니다.

더 많은 분들이 머신 러닝과 딥러닝에 대해 더 이해하고 본인들의 문제를 이 멋진 도구를 이용해서 풀수 있게 하기위해 비디오 강의를 준비하였습니다. 더 나아가 이론에만 그치지 않고 최근 구글이 공개한 머신러닝을 위한 오픈소스인 TensorFlow를 이용해서 이론을 구현해 볼수 있도록 하였습니다.

수학이나 컴퓨터 공학적인 지식이 없이도 쉽게 볼수 있도록 만들려고 노력하였습니다.

 시즌 RL - Deep Reinforcement Learning

비디오 리스트 (일주일에 한강좌씩 천천이 업데이트 예정입니다.)

시즌 NLP - Deep NLP

(시즌 RL이 끝나는 2017년 4~5월경에 업데이트 예정입니다.)

시즌 1 - 딥러닝의 기본 (TF 1.0 lab 업데이트중) 비디오 리스트

Acknowledgement

이 비디오는 저도 인터넷등을 통해 공부하면서 만든것이며 아래 자료를 많이 사용하였습니다.

의견주기

비디오나 강의에 대한 의견이 있으시면 아래로 이메일을 보내 주시면 됩니다. 홍콩과기대 김성훈

반응형
반응형

이번에는 선형대수학(Linear algebra)에 대해서 공부를 합니다.

이름은 거창하지만 실제로는 더하기, 곱하기 이런 기본 산수 수준인데 단지 다른 것은 알고리즘을 사용하기 위해서 필요한 행렬과 벡터 위주로 다루고 있습니다.


행렬이나 벡터도 이름만 거창하지 실제로는 여러번 산수해야하는 것을 한번에 산수하면 되도록 해주는 도구라고 생각하면 될 것 같습니다. 알아두면 매우 유용한 면이 많아 보이는 내용입니다.


예를 들어서, 1+1, 1+2, 1+3을 한다고 생각해보겠습니다.

단순한 더하기를 3번 수행해야 하는데, 행렬이나 벡터를 이용하면 더하기 1번에 3개의 결과를 얻어낼수 있는 효과가 있을 뿐이지 더하기는 동일합니다.



행렬(Matrix)


사각형 모양안에 숫자들을 나열해 놓은 형태로 아래 그림과 같이 표기가 됩니다.

이 숫자들은 행(rows)과 열(columns)로 구분이 가능합니다. 그래서 전체를 하나로 표기할 수도 있고 내부에 숫자들을 각각 표기할 수도 있게 됩니다. 

Matrix를 표기할 때 4 x 2와 같이 표기를 합니다. 그냥 4개의 행과 2개의 열로 이루어진 Matrix이며 4 by 2라고 읽습니다.

아래 그림에서는 R로 Matrix의 이름을 표현했고 4x2의 숫자를 갖는 매트릭스를 보여주고 있습니다. 그리고 그 오른쪽에는 2x3의 다른 Matrix를 표현하고 있는 것입니다.




Matrix는 여러 숫자들을 가지고 있고 각자의 자리가 있기 때문에 개별적으로 요소들도 표기가 가능합니다.

아래 그림의 A라는 Matrix는 4x2의 크기를 갖고 있으며 총 8개의 숫자를 표현하고 있습니다.

A11은 1번째 행의 1번째 열의 자리에 있는 숫자를 표현합니다. 그래서 A11의 값은 1402가 됩니다.

A32는 3번째 행의 2번째 열의 자리에 있는 숫자를 표현하는 것이니 값이 1437이 되겠지요

그런데 A43은 4번째 행의 3번째 열의 자리를 찾는데 3번째 열이 없기 때문에 error가 됩니다. 존재하지 않는 값을 찾고 있기에 오류이지요




벡터(Vector)


Vector는 행렬과 비슷하게 생겼지만 다른 점은 열(column)이 1개만 존재하는 형태라는 것입니다. 그래서 항상 한줄로만 표기가 됩니다. 즉, n x 1의 matrix 이면서 vector가 되는 것입니다.

아래 그림에서는 Vector를 y로 표기하였습니다.

마찬가지로 각 숫자들은 지정 좌석이 있기 때문에 y1은 1번째 자리의 460의 값을 표현할 수 있게 됩니다.


1번째 자리수는 0번부터 시작할 수도 있고 1번부터 시작할 수도 있습니다.

이것은 사용하는 program에 따라 다를 수 있습니다. 일반적인 java와 c 같은 프로그램에서는 배열을 보통 0부터 표현을 하기도 하며 (0-indexed), 이 강좌에서는 1부터 표현하는 것으로 교수님께서 설명을 하고 계십니다. (1-indexed)


4개의 숫자이므로 0-indexed에서는 y0, y1, y2, y3으로 표현이 되고, 1-indexed에서는 y1, y2, y3, y4로 표현이 되는 차이만 있을뿐입니다.




Matrix Addition(행렬 더하기)


Matrix와 Vector의 정의를 알았으니 이제 더하는 방법을 알아봅니다.

두개의 Matrix를 더하는 것은 같은 자리의 숫자를 더해서 새로운 Matrix를 만들어 내는 것입니다.

아래 그림에서 3x2 Matrix+ 3x2 Matrix를 하면 같은 사이즈를 가지는 3x2 Matrix가 생성된다는 것을 보여주고 있습니다.


같은 자리의 수인 1 + 4 = 5,  0 + 0.5 = 0.5,  2 + 2 = 4와 같이 더하기가 되는 것을 알 수 있습니다.

그 밑에 있는 3x2 Matrix + 2x2 Matrix는 왜 error가 될까요? 숫자들의 자리가 맞지 않으니 더할 수 있는 값이 없어서 입니다. 그러므로 같은 크기의 Matrix끼리만 연산이 된다는 결과가 나타납니다.




Scalar Multiplication ( Matrix 곱하기 상수)


Scalar는 상수를 의미합니다. 이 상수를 Matrix에 곱하는 것이 가능합니다. 같은 크기의 Matrix가 아니지만 각각의 숫자들에 동일하게 적용시켜주면 됩니다.


아래 그림에서 Matrix에 3을 곱해주면 각 자리에 위치한 모든 숫자들에 3을 곱해서 기존 Matrix의 크기와 같은 Matrix가 생성이 되는 모습입니다. 앞에서 곱해주나 뒤에서 곱해주나 같은 결과가 나옵니다. 산수와 같죠?

그 밑에 쪽에 나누기도 동일하게 적용을 해주면 연산이 가능합니다.




지금까지 알아본 더하기와 곱하기를 혼합해서 연산을 하면 아래 그림과 같이 됩니다.

곱하기와 나누기를 먼저 계산하고 그 결과를 더하기와 빼기를 수행합니다. 이것도 산수와 똑같습니다.




Matrix X Vector (Matrix 곱하기 Vector)


Matrix와 Vector를 곱하면 어떻게 될까요

각각 크기를 가지고 있으므로 곱하기가 되는 대상에 주의를 해야 합니다.

아래 그림은 기본적인 곱하기에 대한 특성을 보여주고 있습니다. A Matrix의 크기가 m x n이라고 할 경우에 x Vector의 크기는 n x 1이 되어야 한다 입니다. 같은 사이즈의 n이 되어야 곱하기를 할 수 있다는 뜻이됩니다. 이렇게 곱하기를 한 결과는 m의 크기를 갖는 Vector가 됩니다. 그럼 어떻게 곱하기가 되는지 예제를 보면 쉽습니다.




A Matrix는 3x4의 크기를 가지고 있습니다. 4개의 columns를 가지고 있고 곱하고자 하는 x Vector는 4x1의 크기를 가지고 4개의 rows를 가집니다. 곱하기를 하는 방법은 A Matrix의 가로줄과 x라는 이름의 Vector의 세로줄을 곱해주고 이 값들을 모두 더해줍니다 . 

A11 * x1 + A12 * x2 + A13 * x3 + A14 * x4와 같이 연산이 되어 결국 값은

1*1 + 2*3 + 1*2 + 5*1   = 1 + 6 + 2 + 5   = 14 값이 되는 것입니다.

결과 값을 차례대로 Vector 형식으로 적어주면 m개의 크기를 갖는 결과 Vector가 생성이 됩니다.


이와 같이 연산이 되기에 Matrix의 가로 크기와 Vector의 세로 크기가 같아야 하겠습니다. 그리고 그 결과는 Matrix 의 세로 크기와 같은 크기를 갖는 Vector로 만들어집니다.



복잡한 식도 심플하게 변형 (kind of trick)


Matrix의 연산에 특성을 이용하면 복잡한 계산식을 심플하게 표현할 수 있게 됩니다. 이것은 parameters이 많아질수록 더욱 효과적으로 표현이 가능해지는 장점을 가지고 있습니다. 우리가 앞으로 다뤄야 하는 dataset이 아주 많은 데이터 parameters들을 가지고 있기 때문에 이를 활용하는 것에 익숙해져야 하기 때문입니다.


이전에 본적이 있는 일차방정식으로 표현이 된 h 함수입니다. 두개의 parameters를 가지고 있고 곱하기와 더하기로 표현이 되고 있습니다. 이것을 Matrix로 표현을 하면 아래쪽에 있는 그림과 같이 표현이 가능합니다.

세타zero로 표현했던 -40의 값은 상수이기 때문에 1을 곱해줘도 같은 값을 가질 수 있습니다. 세타one으로 표현했던 0.25의 값은 x와 곱해지는 인수임을 유의해서 아래 그림을 보면 됩니다.


h 함수는 집의 사이즈에 따른 집의 가격을 나타내는 공식이였습니다. x는 집의 사이즈 데이터가 되고 h는 그 사이즈에 해당하는 집의 가격을 나타냈었습니다. 이 공식에 의하면 집의 사이즈에 0.25를 곱하고 -40을 더하면 집에 가격이 된다고 합니다. 이것을 Matrix로 아래와 같이 변환해서 계산을 해보면 일차방정식과 동일한 결과가 된다는 것을 알 수 있습니다.


h 함수는 다음과 같이 표현이 가능하게 되고

h = -40 * 1 + 0.25 * x

그리고 이것은 다음과 같은 행렬의 곱으로 표현이 가능합니다.

h = [-40, 0.25] * [1, x]

이러한 원리로 분리해서 만들어낸 것입니다. (2번째 Vector를 세로로 써야 맞는데...)


아래 그림에서는 곱하는 순서만 바뀌었을 뿐이지 같은 방식의 곱하기를 나타내고 있습니다.

결국 이렇게 Matrix를 이용하면 어떻게 되는가 하면, h 함수가 다음과 같이 심플해지게 됩니다.


h = Xa (X : Matrix, a : Vector) 

상수들이 Vector가 되면서 곱하기로만 표현이 됩니다. 여기서 주의할 것은 X Matrix의 columns의 수와 a Vector의 rows 수가 같아야 연산이 된다는 것입니다.




Matrix x Matrix (Matrix 곱하기)


Matrix 끼리의 곱셈입니다. column만 늘어나는 것이고 연산은 동일합니다.

아래 그림은 m x n Matrix와 n x o Matrix를 곱하면 m x o Matrix가 결과가 된다는 것을 이야기 합니다.




아래 그림은 예를들어서 설명을 하고 있습니다.

앞에 Matrix의 가로줄과 뒤에 Matrix의 세로줄의 수들을 곱하고 그결과를 더해서 나온 값이 결과 Matrix가 됩니다.

즉, 1번째 row와 1번째 column이 연산되어, 결과 Matrix의 1번째 row와 1번째 column의 자리에 위치하는 값이 되는 것입니다.




다수의 공식도 심플하게 변형 (kind of trick)


다시 h 함수로 돌아가보겠습니다.

아까전에는 parameters를 심플하게 표현했었는데 이번에는 여러개의 h 함수를 표현해보려 합니다.


머신러닝에서 우리의 목표는 cost가 가장 적은(0에 가까운) h 함수의 찾아내는 것이였습니다.

그러기 위해서 parameters를 동시에 업데이트 해가면서 cost를 산출하고 목표를 향해 갔었습니다.

parameters가 변경되면 다른 h 함수가 되기 때문에 여러번의 연산을 하게 될 것입니다.


이것을 아래 그림과 같이 parameter를 이제 Vector가 아닌 Matrix로 표현을 하면 여러번의 연산도 한번에 심플하게 할수 있다는 것을 알수 있습니다.




Properties of Matrix (특성)


Matrix의 곱셈은 순서가 바뀌면 다른 결과가 나오므로 일반적으로는 곱하는 순서가 중요합니다.

즉, 교환법칙이 성립하지 않는다고 합니다.(not commutative)


아래 그림의 예제를 보시면 다른 결과가 나오는 것을 보실수 있습니다.

Matrix x scalar 값은 교환법칙이 성립이 되었었는데, Matrix x Matrix는 그렇치 않으니 주의를 해야겠습니다.




곱셈에서 결합법칙이 성립이 됩니다. (Associative)

산수할때 괄호안에 있는 계산이 우선순위가 되는 것과 동일합니다.




Identity Matrix라고 하는 것인데 산수에서 8 * 1 = 8이 되는 것과 동일한 결과를 나타내주는 숫자 1과 같은 역활을 하는 Matrix를 의미합니다. 이 Matrix는 대각선으로 1의 값을 갖는 형태로 표현이 됩니다. 아래 그림을 보면 Matrix의 크기별로 형태를 볼 수 있습니다. 이 Identity Matrix는 I라고 표기하며 A * I = I * A = A의 결과가 됩니다.


특이한 점은 일반적으로 Matrix 의 곱셈은 교환법칙이 성립되지 않치만 Identity Matrix 는 교환법칙이 성립된다는 점입니다.




Inverse Matrix는 어떤 Matrix 와 반대 성향을 가지고 있는 Matrix 로서 이 두개의 Matrix 의 곱셈은 Identity Matrix 로 나타나는 것입니다. 아래 그림에서 A Matrix 에 대해서 A-1 라는 Inverse Matrix 가 존재하며 이 둘을 곱하면 I Matrix가 되는 것을 보여주고 있습니다. 하지만 모든 Matrix가 Inverse 형태를 갖는 것은 아니라고 합니다. 모든 요소가 0으로 구성되는 Matrix는 Inverse를 가지지 않습니다. 


Inverse Matrix는 Identity Matrix를 만들기 위한 역산으로 계산이 되어 만들어집니다. 아래 그림의 상단에 표기된 분수처럼 계산이 되어 생성이 되는데 실제 구현할때는 이를 계산해주는 함수들이 있으니 개념만 알고 넘어가면 됩니다.




Matrix Transpose는 어느 Matrix의 크기를 변형하는 방법입니다.

아래 그림에서 A Matrix 는 2x3의 크기를 가지고 있습니다. AT라고 표시되어 있는 오른쪽에 Matrix 는 A Matrix 의 transpose라고 하고 이 Matrix 값들은 대칭이 되는 형태로 표현이 됩니다.


A Matrix의 값들을 오른쪽 아래방향으로 대각선을 그어서 이 대각선을 기준으로 거울에 비치듯이 뒤집으면 됩니다.

각각의 값들은 변하지 않고 자리만 변경되는 것입니다. 그래서 m x n Matrix의 transpose는 n x m의 크기로 변형이 됩니다.


이것은 Matrix곱하기를 할 때 유용하게 사용할 수 있습니다. 일반적인 곱셈을 할 때 크기가 동일해야 했습니다. 즉, A Matrix의 rows의 숫자들 갯수와 B Matrix의 columns의 숫자들의 갯수가 동일해야 연산이 가능했었습니다. 이 크기를 맞춰주기 위해서 형태를 transpose하고 연산을 수행하는데 이용되는 것입니다.




이것이 Linear algebra의 전부는 아니지만 우리가 머신러닝을 배우면서 사용하게 될 내용들에 대해서 배웠습니다. 이제 우리는 많은 데이터들을 한번에 처리할 수 있는 준비가 된 셈입니다.



반응형
반응형

지난번에 Cost 함수에 대해서 알아보았습니다.

이번에는 Cost 함수를 minimizing 하기 위한 알고리즘에 대해서 알아보겠습니다.

이 알고리즘의 이름은 Gradient descent algorithm이라고 합니다. 변역해서 이야기 하면 경사면을 하강하는 알고리즘이 되는데 실제로도 그렇습니다.


우리는 기본이 되는 linear regression에서 하나씩 살펴보고 있지만 실제로 이 알고리즘은 여러 다양한 분야에서 범용적으로 사용이 되는 알고리즘입니다. 중요하다는 뜻이 되겠습니다.


Cost 함수를 minimizing하기 위한 방법중에 하나인 이 Gradient descent algorithm은 이미 알고 계시듯이 우리가 목표로 하는 직선을 찾기 위한 방법이되고 이를 머신이 학습한다고 표현합니다.


현재까지 배운것을 아래와 같이 요약정리 할 수 있습니다.

Cost 함수인 J함수는 두개의 parameters를 가지고 있으며 우리가 원하는 목표는 이 Cost가 minimization되는 파라미터로 구성된 함수를 찾는 것입니다. 이 함수를 찾을때까지 우리는 두개의 파라미터를 변경해 가면서 J함수를 줄여가도록 할 것입니다.




J함수를 3차원으로 그려보면 아래와 같이 나타나는 경우도 있을 것입니다.

봉우리가 2개이상이 있는 그래서 골짜기 같은 것도 보여지는 함수인가 봅니다.

여기서 왼쪽 봉우리 쯤에서 시작을 한다고 생각을 해보면 경사면을 따라서 하강을 한다고 했으니 아래와 같은 경로로 내려와서 최저점에 도달하게 될 것입니다.




만약, 조금 다른 위치에서 시작한다고 가정을 해보면 위와는 다른 경로로 최저점에 도달한다는 것을 볼 수 있습니다.

결국 최저점이 다른 2개의 지점으로 생기게 되는군요. 이러면 안될거 같은데 뭔가 이상합니다. 이러한 최저점을 local optimum 혹은 local minimum 이라고 합니다. 우리가 원하는 목표는 global optimum 이겠지요?




위의 함수를 수학적으로 표현을 해보면 아래와 같습니다.

여기서 등호 비슷한 := 이 표현은 프로그램의 할당(Assignment)와 같습니다. 즉, 기호 오른쪽의 값(value)을 왼쪽의 항목에 할당(준다)한다는 의미로 오른쪽의 값과 동일한 값을 왼쪽 항목이 가지게 됩니다. 그냥 값을 오른쪽에서 왼쪽으로 전달해주는 겁니다.


그리고 빨간색으로 표기된 알파는 learning rate라고 합니다. 이것은 경사면을 따라 내려올때 한 걸음에 해당하는 step을 나타내는 기호입니다. 이 값이 크면 한걸음의 보폭이 커질 것이고, 작아지면 총총걸음이 되는 것과 같습니다.


그다음에 알파 뒤에 있는 구분은 고등학교때 배운 미분(편미분)인데 이것은 뒤에서 설명을 하게 됩니다. 그냥 J함수를 미분을 하는가 보다 생각하면 됩니다.


여기서는 경사면을 따라서 한걸음 내려오는 행위를 수학적으로 생각하면 두개의 파라미터인 세타zero와 세타one의 값이 변경되면서 Cost가 한단계 줄어드는 것과 같습니다. 그런데 Cost 함수(J)는 두개의 파라미터를 가지고 있기 때문에 두개의 파라미터 값이 동시에 변경되고 Cost가 산출이 되어야 합니다. 이것을 Simultaneous update라고 합니다. 




만약에 아래 그림의 오른쪽으로 나타낼 수 있는것처럼 세타zero가 값이 먼저 바뀌고 Cost를 구하게 된 이후에 세타one의 값이 바뀐다고 하면 어떻게 될까요? Cost 함수가 하나의 파라미터 값만 바뀌고 움직이고 또 다른 하나의 파라미터 값이 바뀌고 또 움직이고 마치 짝다리 걸음을 하는 것 같은 이상한 모양새가 될 것 같습니다. 이렇게 되면 안된다라는 의미가 됩니다. 이는 구현시에 참고해야 할 내용이 됩니다.





자 이제 다시 Gradient descent algorithm을 봅니다.

아래 수식을 잠깐 보면 한점에 도달할때까지 이 식을 반복된다고 합니다. 그리고 마이너스 알파(learning rate)과 J를 미분하는 식(derivative:편미분), 그리고 파라메터인 세타zero와 세타one이 동시에 업데이트가 되어야 한다고 되어있습니다. 간단히 나타내기 위해서 세타one만 조금더 살펴봅니다.




만약에 세타one 파라미터의 값이 최저점보다 크다(오른쪽에 위치)라고 생각해보면 아래 그림의 위쪽 그래프와 같이 됩니다. 이때 J함수를 미분을 하면 빨간선과 같은 기울기가 됩니다. 미분은 기울기 맞죠?

경사도를 따라 내려가는 알고리즘이니까 기울기를 따라 왼쪽으로 이동하게 됩니다. 이때 알파 뒷부분의 공식은 positive number, 플러스 수가 되는데 앞에 마이너스가 붙어 있으니까 theta값이 줄어듭니다.


이번에는 세타one 파라미터의 값이 최저점보다 작다(왼쪽에 위치)라고 생각해봅니다. 아래 그림의 아래쪽 그래프가 보이시죠. 미분한 기울기는 반대 방향의 마이너스로 생기게 됩니다. 역시 경사면을 따라서 내려오면 오른쪽으로 이동하게 되겠네요. 이때 알파 뒷부분의 공식은 negative number가 됩니다. 앞에 마이너스가 있으니 플러스 값이 되어 더해지겠네요. 그래서 오른쪽으로 이동하게 됩니다.


결국 어느 점에서 시작하더라도 최저점을 향해서 잘 찾아 움직이는 것 같습니다. 이것이 미분으로 생긴 공식이 하는 역활입니다.




이번에는 알파에 대해서 알아보겠습니다.

경사면을 내려오는 step이라고 했었는데 너무 작으면 아래 그림의 위쪽 그래프와 같이 총총걸음으로 하염없이 오래 내려옵니다. 반대로 너무 크면 아래쪽 그래프와 같이 최저점을 찾지 못하고 양쪽을 오락가락 하다가 스탭이 꼬여서 거꾸로 올라가 버리는 경우도 발생한다고 합니다. 우리가 원하는 것은 한점으로 이동하는 것(converge)인데 반대로 분산되는 것(diverge)처럼 됩니다.




만약 아래 그림과 같은 함수가 있을때 세타one에서 시작을 한다고 생각을 해보면 (파라미터가 하나이고 세타one의 위치가 곧 local optima 위치가 동일합니다) 어떤일이 발생할까요? 한번 생각해보시겠습니까? 원 강의에서 나오는 문제입니다^^




이번에는 알파에 대해서 좀더 알아보겠습니다.

알파는 learning rate이고 step인데 만약에 이 알파 값이 고정되었다면 어떻게 될까요

알파 값은 뒤에 미분으로 나타나는 식과의 곱하기입니다. 미분 값, 즉 경사도가 가파를 수록 크고 경사도가 작아질 수록 작아지게 될 것입니다. 곱하기를 하니 알파 값이 고정이라도 움직임이 점차 내려오면서 같이 작아질 것 같습니다. 아래 그래프의 표시처럼 말입니다. 별도로 알파 값을 조절하지 않아도 이 식에서 자연스럽게 적절한 값으로 조절이 되니 신통방통합니다. 멋진 알고리즘인 것 같습니다






이제 거의 다왔습니다. 배운것을 정리를 하면서 중요한 점 하나만 보면 끝이납니다.

Linear regression에서 h 함수를 만들었고, J함수를 봤습니다. 이 J 함수를 우리가 원하는 minimizing 하기 위한 알고리즘이 지금 공부하는 Gradient descent algorithm이 되겠습니다. 





이 알고리즘의 미분식에 대해서 조금 더 보면,

두개의 파라미터로 구성이 되어 있고 이것을 각각의 파라미터로 편미분을 하면 아래와 같이 두개의 식이 만들어집니다. 일단 h 함수를 대입해서 일차방정식을 넣고 이것을 처음 세타zero로 편미분을 한 것이 아래 위쪽 식이 되고 다음 세타one으로 편미분을 하면 맨밑에 식이 됩니다. 


편미분을 하게 되면 제곱은 곱하기로 내려오고 2 * 1/2m이 되어 결국 1/m이 된 것입니다. 그리고 세타zero는 원래 상수 였기때문에 x 변수가(input data) 사라지는 것이고 세타one으로 미분한 것은 x 변수가 살아있는 것이 두 식의 차이점입니다.





어찌되었든간에, 결국 두개의 파라미터 세타zero와 세타one은 동시에 업데이트 되어 경사면을 내려오게 만든다는 것이고 위에서 본것처럼 아래와 같은 굴곡있는 함수의 경우 다른 점(local optima)로 내려가는 이상한 현상이 생길 수 있다는 것입니다.




그래서 우리는 아래와 같이 하나의 최저점을 가지고 있는 활 같은 모양(bow shaped function)을 선호하며 위의 굴곡있는 함수가 만약 있다면 아래와 같은 이쁘게 구부러진 모양의 함수로 만들어야 한다는 것이 핵심입니다. 그래야 우리가 원하는 global optimum를 찾을 수 있고 이것을 잘 찾는 알고리즘이 좋은 알고리즘이 됩니다. 잘 찾았다면 결과도 아주 잘 예측할 수 있는 것이기도 하게 되겠습니다.




이제 등고선으로 표현을 해보면 아래와 같습니다. 한번 본적이 있었져?

오른쪽 동고선에 빨간점에서 시작을 합니다. 조금씩 움직이면서 이때의 파라미터로 구성이 되는 h 함수를 그리면 왼쪽의 직선처럼 되는데 실제 데이터와 조금 다르기 때문에 Cost가 아직 큽니다.




이렇게 계속 동시에 파라미터가 변경이 되면서 등고선의 중앙(global optimum)에 다다르게 되면 이때의 파라미터가 구성하는 h 함수 일차방정식인 직선을 그려보면 아래와 같이 되고 이것은 실제 결과 값과 거의 비슷하므로 우리가 찾는 것이 됩니다. 잘 찾았다는 것은 잘 학습을 했다는 것이 되겠습니다.




이와 같이 반복적으로 움직이고 판단하고 다시 움직이는 알고리즘들을 batch라고 불른다고 합니다. 뭔가 조금 어색해 보이지만 그렇게 많이 쓴다고 하니 용어만 알아두면 되겠습니다. 그럼 batch가 아닌것도 있을까? 네 있다고 합니다. 나중에 다루는 것 같습니다만 위의 편미분을 한번에 수학적으로 풀수 있다면 여러 step을 반복하지 않아도 될 것인데 이러한 것은 일부 작은 dataset에서만 가능하다고 합니다.


우리가 하려고 하는 큰 스케일의 dataset에서는 지금 배운 Gradient descent algorithm이 보다 범용적으로 사용이 가능한 좋은 알고리즘이 되겠습니다.




여러분은 Gradient descent algorithm에 대해서 모든 것을 배우셨습니다.^^

긴 글 읽으시느냐고 수고하셨습니다

반응형
반응형

우리는 Supervised 방식을 공부하고 있기 때문에 결과 값을 비교할 수 있습니다.

왜냐하면 실제 정확한 결과 값을 알고 있기 때문입니다.

이 결과 값을 비교할 수 있는 표현이 Cost입니다. 그리고 Cost를 수학적인 함수로 표현하는 것도 배우게 될 것입니다.


이전 내용에서 이어서

h 함수를 일차방정식으로 표현할 수 있었습니다. ( h = Ax + B)

여기서 A와 B를 Parameters라고 합니다. 이 파라미터가 결정이 되면 우리는 원하는 결과 값을 찾을 수 있게 됩니다.


그럼 이 파라미터 값은 어떻게 찾을 수 있을까요?

바로 minimize를 해서 찾을 수 있습니다. 

우리는 이미 결과 값을 알고 있기 때문에 실제 결과 값과 알고리즘이 수행하여 예측한 결과 값을 비교해서 그 차이를 구할 수 있는데, 이 차이가 가장 작은 즉, 실제 값과 가장 가까운 결과가 나올 수 있는 파라미터를 구하면 될 것입니다.

그러한 파라미터로 구성된 직선이 우리가 찾고자 하는 기준이 됩니다.




Dataset에서 첫번째 데이터를 보면 집의 사이즈가 2104피트인 집이 실제 가격이 460,000달러였습니다.

x가 2104 값일때 실제 결과인 h가 460,000 값이 되어야 하는 것이지요

그런데 알고리즘을 수행하여 머신이 학습한 결과 값이 400,000달러라고 가정을 해보면 실졔 값과의 차이가 60,000달러 만큼 발생하는 것을 알 수 있습니다. 이 60,000달러가 Cost로 표현이 됩니다.


Cost는 예측된 결과 값(h) - 실제 결과 값(y)으로 정의를 할 수 있는데 이 값이 마이너스(-)의 값을 가질 수 있으므로 제곱을 해줍니다. 수식으로 표현하면 Cost = (h - y)^2이 되고 아래 그림의 오른쪽 위에 표현식과 비슷하게 됩니다


첫번째 데이터에 대한 것만 보고 표현한 것이니 이것을 모든 Dataset으로 확장해서 표현을 하면 1번째 데이터부터 m번째 데이터까지의 합으로 나타낼 수 있습니다. 또 이 값을 2m으로 나누어주면 평균 값이 됩니다.


이것을 수식으로 아래 그림과 같이 표현 할 수 있습니다. 그리고 이것이 Cost 함수가 됩니다.

우리는 이 cost가 가장 적은 것을 찾아야 하는것이 목표입니다.

목표를 달성하기만 하면 우리는 정확한 값을 에측할 수 있게 되기 때문입니다




Cost 함수를 제이(J)로 표현하였고 이 J함수가 minimize 된 값을 찾는 것이 우리의 목표라고 아래 왼쪽 그림에서 표현이 되어 있습니다.





지금까지 Cost에 대해서 알아보았는데 이제부터는 이 Cost함수가 어떤 의미와 특징을 가지고 있는지 알아봅니다.


Cost함수를 좀더 간단하게 표현하기 위해서 세타zero를 0이라로 가정하여 없앴습니다. ( y = Ax 가 됩니다)

h = Ax를 그래프로 그리면 아래 왼쪽의 그림과 같이 표현이 됩니다.

여기서 또 A = 1 이라고 가정을 하면 h = x가 되니 (1,1), (2,2)의 값을 갖는 직선이 되겠지요. 

실제 결과인 y와 h의 값이 동일하다면 이때 cost 함수를 아래와 같이 풀어보면 값이 0이 됩니다.

다시말하면, A=1이고 B=0일때 Cost=0이 되는 것입니다.




이렇게 하나씩 그래프로 찍어서 보면 아래 오른쪽 그림과 같이 Cost 함수는 이차방정식의 그래프로 나타나는 것을 알 수 있습니다. 이때 minimize 된 값을 찾는 것이 목표이기 때문에 그래프에서 가장 아래쪽인 j=0이 되는 cost가 0이 되는 세타one (혹은 A)를 찾아내는 것이 목표이자 머선이 학습으로 수행하여 찾아야할 파라미터 값이 됩니다. ( A=1 )





이 J 함수를 3차원으로 나타내면 아래 그림과 같이 된다고 합니다. 이쁩니다.




위 3차원 그래프를 등고선의 형태로 표현하면 아래와 같이 된다고 합니다.

만약 왼쪽의 직선과 같은 h를 발견했다면 실제 데이터(점들)과 많이 다르기 때문에 비용함수인 J가 중앙에서 멀리 있는 것(등고선의 바깥쪽에)을 볼 수 있습니다.




그러나 이것은 우리의 목표와 맞지 않으므로 답이 아니지요

아래 그림과 같은 직선으로 표현되는 h를 발견했다면 실졔 데이터와 비슷하기 때문에 비용함수인 J가 중앙에 있는 것을 보실 수 있습니다. 우리가 찾는 minimize라는 의미는 등고선으로 표현 했을때 정중앙에 위치하는 즉, Cost가 0에 가까운 것을 찾는 다는 뜻입니다. 또 Cost가 0에 가깝다는 의미는 실제 데이터의 결과값과의 차이가 거의 나지 않는 다는 똣이고 이는 예측 가능한 정확도가 높다는 것이 됩니다.




이런 과정으로 머신이 학습을 하여 결과를 찾는 것입니다.

많은 수식과 그래프로 표현이 되었지만 요약하자면 알고리즘(머신)이 수행되면서 예측한 값과 실제 값을 비교해서 Cost를 분석하고 이 Cost가 가장 적은 기준을 찾아내는 것입니다.


반응형
반응형

이제 한걸음 들어가게 됩니다.

앞에서 공부했던 Supervised Learning에서 regression 에 대한 예시를 가지고 이것을 수학적인 표현식으로는 어떻게 표현이 되는지를 보겠습니다.


집의 사이즈에 따라서 집의 매매가격의 변화하는 데이터를 그래프로 표현하면 아래와 같습니다.

사이즈가 커지면 가격이 높아지니 선을 하나 그어볼 수 있을 것입니다.

이 직선은 사이즈와 가격에 대한 변화를 아주 잘 나타내는 그래프이자 수학적으로는 일차방정식으로 표현이 됩니다.






데이터셋의 실제 데이터들을 하나씩 열어보면 아래와 같이 사이즈와 가격으로 구성이 된 정보들을 볼 수 있습니다.

저기 지역에서는 사이즈가 2104 피트인 집이 460,000달러인가 봅니다.


DataSet의 크기, 즉 데이터의 수량을 m으로 표현을 하고

집의 사이즈를 x로 표현을 하고

집의 가격을 y로 표현하기로 했습니다.


그래서 첫번째 데이터인 x1이 2104를 표현하게 되고, y1는 460달러를 표현하게 되었습니다.

쉽게 우리가 가장 잘 아는 일차방정식과 동일합니다. ( y = Ax + B )


이 직선이 무엇이였죠? 사이즈에 따른 집의 가격들이였습니다. 이 직선을 알면 우리는 무엇을 할 수 있게 되는걸까요? 사이즈만 알면 집값을 예측할 수 있게 될 것입니다. 

그러면 우리가 알고자 하는 것은 저 직선을 만드는 것일까요? 네 맞습니다. 그런데 이것을 우리가 찾는게 아니라 알고리즘(머신)이 학습해서 찾아줄 것입니다.





개념을 도식화해서 보면 아래 왼쪽의 그림과 같이 dataset이 알고리즘을 통해서 수행이 되는데 h라고 표현이 되어 있는 Hypothesis(가설)을 세우기만 하면 x라는 입력값에서 y라는 우리가 원하는 집값을 예측하는 결과 값이 도출되게 될 것입니다.


여기서 h가 그 직선의 함수가 되고

h = Ax + B인데 아래 교수님은 조금 유식하게 세타(θ)로 표현하셨습니다. 오른쪽 녹색 보이시죠?

세타 zero가 B가 되고 세타 one이 A와 동일합니다.




이번 예제에서는 직선 형태의 regression이라 이를 Linear regression이라고 호칭합니다.

그리고 x라는 입력값(feature)이 하나이기 때문에 one variable 혹은 Univariable이라고 합니다.

이를 합치면 Univariate linear regression 이라고 하고 우리가 배운 것을 표현하는 멋진 용어가 됩니다.


반응형
반응형

머신이 학습을 하는 방식은 Supervised Learning과 Unsupervised Learning의 2가지로 구분이 됩니다.

이는 기초 데이터인 Dataset의 성격과 원하는 결과 값의 성격에 따라 다르게 사용이 됩니다.


Supervised Learning


변역하면 지도식 학습 방법입니다.

선생님이 학생을 교육하듯이 이미 답을 알고 있는 상태에서 학습을 하는 경우입니다.

DataSet이 이미 결과 값을 포함하고 있어 머신이 학습을 수행하여 나온 결과 값이 얼마정도의 오차를 가지고 있는지 알수 있는 경우에 사용될 수 있습니다.


예를들어, 집의 사이즈에 따른 집의 가격을 분석한다면 우리는 이미 평수에 따른 가격이 어떻게 구성이 되는지를 알고 있습니다. 실제로 집이 거래된 가격도 정확하게 알 수 있습니다. 이 집의 사이즈 데이터를 머신이 학습하고 수행한 결과 값은 집의 매매가로 나타나게 될 것이고 이를 실제 값과 비교해서 Cost(오차값)를 비교할 수 있습니다.


집은 사이즈가 커질 수록 매매가가 높아지기 때문에 연속적인 값으로 나타나게 됩니다. 이렇게 연속적인 결과 값으로 나오는 것을 Regression이라고 합니다. 




또는 집의 구조에 따라서 아파트인지 빌라인지 단독주택인지 구분이 되는데 이러한 값을 나타내는 것은 Classification이라고 합니다.


아래 그림은 강의에서 사용한 종양 크기에 대한 암환자 정보를 구분하는 내용입니다. 일정한 사이즈 이하인지 이상인지에 따라 악성종양인지 여부를 구분합니다. 이처럼 구분하여 나타내지는 값에 대한 분석을 Classification으로 처리하면 되는것입니다




어떠한 데이터들을 구분을 한다는 것은 어떤 기준이 필요하게 됩니다.

아래와 같은 데이터들은 선형의 기준선으로 인해 분류가 될 수 있습니다.

이렇게 잘 구분할 수 있는 선을 찾고 하는 것이 supervised에서 머신이 학습을 하여 찾아내는 결과가 됩니다.





두가지의 학습 방식은 다른 성향의 결과 값을 예측하고자 할 때 사용이 되므로 이 차이를 잘 이해해야 합니다.

머신러닝을 이용하여 무엇인가를 예측하고자 할때 적절하게 사용해야 하기 때문입니다.



Unsupervised Learning


자율학습이라고 표현되는 학습 방법입니다.

이것이 supervised와 다른 점은 우리가 답을 알고 있지 않는 상태에서 학습을 하는 경우라는 것입니다.

DataSet에 어떤 정보들이 있는지 우리는 알지 못하고 어떤 데이터로 구성이 되어 있는지도 알지 못할때 사용됩니다. 우리가 원하는 결과들은 비슷한 의미를 가진 데이터들이나 비슷한 주제로 구성된 데이터들을 분류하여 보고자 할 때 사용됩니다. 이를 clustering 혹은 grouping 이라고 표현됩니다.


예를들어, 우리의 물건을 구매한 고객 데이터를 분석한다고 생각해보면 됩니다. 연령대 별로 혹은 소비자의 소득수준으로 구분되어 판매량을 분석할 수 있을 것이고 전체 시장에서 우리 물건에 대한 시장 점유율과 같은 결과로 나타날 수도 있을 것입니다.


또는 비슷한 뉴스나 피드들을 grouping하여 사용자에게 보여주는 서비스도 가능할 것입니다. 같은 주제에 대한 다양한 정보들을 한눈에 볼 수 있어 편리할 겁니다.






또, 음성인식에서도 유용하게 활용이 될 수 있습니다.

사용자가 클럽같이 시끄러운 곳에서 오더를 할때 머신은 주위 사람들의 소리와 음악소리 같은 잡음들은 다 무시하고 사용자가 말하는 음성만 정확하게 인식이 되도록 할 수 있습니다.


아래와 같이 강의에서 분리된 음성을 직접 들려주시면서 이런 알고리즘을 실제 구현하면 저렇게 한줄로 표현이 될 수 있다고 이야기 하고 있습니다. 우리가 처음에 막연하게 생각 했던 것보다 쉬울 것 같지 않습니까?^^



반응형
반응형

Machine Learning


머신 러닝의 기본 방식은 크게 3가지로 구성이 됩니다.

분석하고자 하는 데이터를 기초로 머신이 학습 또는 task를 수행하게 되고 그 수행결과 값이 실제 값과 같은지를 판단하는 과정으로 진행이 됩니다.


여기에서 사용되는 기초 데이터를 Dataset 이라고 하며 데이터는 수량이 많고 다양할 수록 좋은 데이터가 될 것입니다. 이러한 데이터를 수집하는 단계가 있을 것입니다.


그리고 머신이 학습을 수행하는 단계에서 앞으로 공부하게 될 Algorithm 들이 적용이 될 것입니다.


이렇게 수행한 결과 값이 우리가 원하는 값이 되어야 하며, 실제 우리가 원하는 값과 비교를 하여 그 결과가 적절한 것인지 아닌지 여부를 측정하게 됩니다. 만약 원하는 값이 아니라면 수행을 계속 진행하거나 알고리즘의 수정이 필요합니다. 이렇게 수행한 결과 값과 우리가 실제로 기대하는 결과 값의 차이를 Cost로 표현하고 수학적인 함수로 표현이 될 것입니다.



History


머신 러닝에서 하나의 분야인 딥러닝은 인간의 뇌신경계를 연구하면서 발견된 내용들을 토대로 하고 있습니다.

사람의 뇌 구성을 그대로 알고리즘으로 구현했다고 봐도 될 것 같습니다.

뇌 구성은 알아도 뇌가 어떻게 동작해서 생각하고 결정을 하는지까지는 아직 알수 없을 것인데 이러한 신기한 것이 머신에서도 가능한 것이 아닌가 싶습니다. 구성만 되면 원하는 결과가 사람이 수행한 결과보다도 높은 정확도로 나타나고 있으니까 말입니다. 이미 사람보다 똑똑한 머신들이 태어났다고 봐야 할 것입니다.


약 50년전부터 인공지능에 대한 연구가 시작되어 지금까지 많은 전문가들이 발전시켜온 분야라고 하는데 우리는 강의를 통해서 한 두달만에 이런 지식을 배울 수 있다니 그저 놀랍니다.


이미 많은 분야에서 적용이 되어 서비스가 되고 있는데 대표적인 것이 검색엔진, 추천서비스, 음성인식, 얼굴인식, 자율운행 자동차등 입니다. 이러한 변화들을 보면 기존의 플레폼 성격적인 서비스(우리가 이런 서비스를 만들었으니 이렇게 사용해주세요 하는 서비스들)는 지나가고 앞으로는 사용자 개개인의 성향에 맞추어 주는 서비스(사용자마다 성향에 따라 다른 결과를 보여주는 서비스들)들이 발전될 것 같습니다.


상세한 히스토리는 김성훈 교수님의 강좌에서 '딥러닝의 기본개념' 내용을 보시면 재미있게 역사적인 스토리들을 알 수 있습니다. 교수님 좋은 강좌 항상 감사합니다. 시즌2도 기대하고 있겠습니다.^^

https://hunkim.github.io/ml/


반응형
반응형

http://daeson.tistory.com/entry/%EB%A8%B8%EC%8B%A0-%EB%9F%AC%EB%8B%9D%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC


머신러닝 분야에 세계적인 권위를 가지고 계신 Andrew Ng 교수님의 무료강좌를 공부하면서 정리를 해보려고 합니다.

https://www.coursera.org/learn/machine-learning/lecture/RKFpn/welcome

 

초기 몇개의 강의는 한글로 된 transcirpt이 지원이 되고 있습니다. 조금 지나면 모든 강의를 한글 스크릡트로 볼수 있게 될 것 같습니다.

 

아래는 소개글인데 너무 멋지고 별도로 요약정리할 필요도 없을 것 같아서 그냥 퍼왔습니다.

한번씩 읽어만 봐도 왜 우리가 머신러닝을 배워야 하는지 자연스럽게 이해할 수 있게 됩니다.

앞으로는 모든 분야에서 사용하지 않으면 안되는 기술이 될 것 같습니다.

 

 

 

기계학습 무료 온라인 강의에 오신 것을 환영합니다. 기계학습은 최근 기술 중에서 가장 흥미있는 분야중 하나인데요. 이 강의에서 여러분은 실전 연습을 통하여 현재 사용되고 있는 알고리즘을 직접 배치해보는 것을 배우게 될 것입니다. 여러분들은 자기도 모르게 학습알고리즘을 하루에도 수 십번 사용 하고 있습니다. 매일 여러분들은 인터넷 검색을 할 때 구글이나 Bing같은 곳에서 웹 검색 엔진들을 사용할텐데요, 검색엔진들이 검색을 잘 하기 위해서 학습 알고리즘이 사용됩니다. 또 이 알고리즘을 사용하여 구글이나 마이크로소프트에서 웹페이지들을 랭크 하게 됩니다. 여러분들이 페이스북이나 애플의 사진 어플리케이션을 사용 할 때 여러분과 친구들의 사진들을 인식하게 되는데 이것 또한 기계학습입니다. 이메일을 사용 할 때 이메일 스팸필터가 수많은 양의 스팸메일로부터 스팸메일을 걸러 주게 될 텐데요. 이것 또한 학습알고리즘을 사용한 것입니다. 아직 멀었지만, 여러분이나 저와 같은 지능을 가진 기계를 만들기위해서 수많은 인공지능 연구자들의 최선의 목표는 학습 알고리즘을 인간의 뇌를 흉내내서 만들어 인간의 뇌와 비슷하게 학습하게 만드는 것입니다. 이 부분에 대해서는 나중에 더 말씀 드리도록 하겠습니다. 이번 강의에서는 최신의 기계학습 알고리즘에 대하여 배워 보겠습니다. 하지만 단지 어떤 알고리즘이 사용되는지 설명하고 그 알고리즘이 어떻게 유도되는지 수학적으로는 알 필요 없으니 걱정하지마세요. 그럼 우리는 이제 이러한 알고리즘들을 사용하여 예제들을 풀어보고 어떻게 작동되는지 확인하는데 많은 시간을 보내게 될 것입니다. 그럼 왜 기계학습이 오늘날에 사용되고 있는 것 일까요? 기계학습은 인공지능분야에서 발전하여 파생되어 나갔습니다. 우리는 기계가 지능을 가지길 원했고 몇몇 간단한 일들을 스스로 해내길 원했습니다. 가령 A에서 B로갈 때 어디로 가는 게 더 빨리 갈 수 있느냐 하는 것들 말입니다. 하지만 웹검색, 사진태그, 스팸메일필터 말고도 인공지능 프로그램들이 할 수 있는 우리가 모르는 더 많은 부분들이 있습니다 우리가 여기서 알 수 있는 한 가지는 기계가 스스로 학습한다는 사실입니다. 그래서 기계학습은 컴퓨터의 새로운 능력을 불어넣어 향상 시켜주기 때문에 오늘날 기초과학과 산업의 여러 분야에서 사용되고 있습니다. 제가 기계학습분야에서 있는 동안 헬리콥터조종사, 생물학자, 컴퓨터시스템 종사자들 (이곳 스탠포드 학생들)과 얘기하며 그리고 최근에 학습알고리즘을 그들의 시스템에 적용하고 싶어 하는 실리콘밸리회사들로부터 2,3주에 한번 이메일을 받고 있습니다. 이 같은 현상은 기계학습이 필요한 분야가 점차 확산 되고 있다는 뜻이기도 합니다. 자동화로보틱스, 생물학계산, 실리콘밸리의 수많은 일 등.. 이것들은 기계학습의 강력한 이점을 이용하고자 합니다. 여기 기계학습의 간단한 예가 있습니다. 데이터베이스 수집입니다. 기계학습이 발전하게 된 이유 중 하나는 웹과 모든 것이 자동화가 되었기 때문인데요. 이것은 전보다 우리가 가지고 있는 데이터가 훨씬 많아 졌기 때문입니다. 예를 들어, 실리콘밸리의 수 많은 회사들이 웹에서 클릭된 데이터를 수집하려고 합니다. 이것을 클릭스트림데이터라고 하는데 기계학습 알고리즘을 사용하여 이 데이터들을 수집하고 사용자가 어떠한 서버가 더욱 쾌적한지 알아내고 유저에게 더 나은 서비스를 제공할 수 있게 됩니다. 이것은 현재 실리콘밸리에서 여러 핵심분야 중 하나입니다. 의료 기록. 자동화가 되면서 우리는 전자 의료기록부를 가지게 되었습니다. 의료 기록들의 분석을 통하여 병이 낫게 하는데 도움이 되게 되었습니다. 또, 생물학 계산 자동화를 통하여 생물학자들은 엄청난 양의 유전자를 분석할 수 있게 되었고 기계학습알고리즘이 인간 게놈을 이해하는데 도움을 주게 되었습니다. 공학분야 역시 마찬가지로 점점 더 커져가는 데이터를 처리해야하는 상황이 왔습니다. 그래서 현재 그 방대한 데이터들을 학습알고리즘을 사용하여 분석하고 있습니다. 다음으로 수동적으로 프로그래밍을 할 수 없을 때 사용하는 자동화 학습 프로그래밍분야입니다. 예를들면, 저는 자동화 헬리콥터를 수년간 연구 했습니다. 처음에 저는 헬리콥터가 비행하게 만드는 컴퓨터 프로그래밍 법을 몰랐습니다. 연구 끝에 알아낸 한가지 방법은 컴퓨터가 스스로 학습하여 헬리콥터가 날게 하는 방법이었습니다.


이것은 또한 미국에서 해외로 우편물을 발송할 때 비용이 많이 들지 않게 하는 방법으로도 쓰이고 있습니다. 편지봉투에 이렇게 써놓으면 학습알고리즘이 손글씨를 분석하여 자동으로 분류를 하게 됩니다. 이같은 기술을 통하여 불과 몇센트 만으로 수천마일의 거리로 우편을 보낼 수 있게 합니다. 그리고 자연언어처리기법이나 컴퓨터비전분야를 본 적이 있으실 겁니다. 이것 들은 언어를 이해하고 그림들을 식별하는 인공지능 분야입니다. 수많은 자연언어 처리기법과 컴퓨터비전 분야는 오늘날 기계학습에 적용 되고 있습니다. 또한 스스로 프로그래밍을 할 수 있는 학습알고리즘은 널리 이용되고 있습니다. 여러분들은 자주 아마존이나 넷플릭스 또는 아이튠즈 지니어스를 이용 보셨을 겁니다. 그곳에서 영화나 제품, 음악들을 추천하는 서비스를 하고 있습니다. 이것도 학습알고리즘을 이용한 것입니다. 만약 사용자가 수십만이라고 생각해 보세요, 수십만의 사용자를 다루는데 매번 다른 프로그래밍을 할 수는 없을 것입니다. 이것들을 할 수 있는 방법은 오직 기계가 스스로 추천을 할 수 있게끔 만드는 것입니다. 여러분의 취향을 고려해서요. 마지막으로 학습알고리즘은 오늘날 인간이 학습하는 것과 인간의 두뇌를 이해하기 위하여 사용 되고도 있습니다. 앞으로 연구자들이 어떠한 과정으로 인공지능의 꿈을 어떻게 이뤄나가고 있는지 얘기 할 것입니다. 몇 달 전에 한 학생이 상위 12개의 IT기술들이 나온 기사를 보여줬습니다. 그 기술들은 IT기술 분야의 전문가들이 부인 할 수 없는 유망한 기술들 이었습니다. 약간 예전의 기사임에도, 그 상위 12개의 기술들 중 가장 전망 있는 IT기술은 바로 기계학습분야 였습니다. 이곳 스탠포드에서도, 매년 수많은 채용인들이 기계학습분야를 전공한 학생들을 채용하기 위한 수요가 매년 증가 하고 있습니다. 그래서 저는 이 기술의 수요가 매우 급격하게 증가하고 있으며 기계학습을 배우는 것은 매우 가치 있는 시간이 될 것이라 생각합니다. 다음 강의에서 우리는 기계학습이 무엇인가에 대하여 좀 더 보편적인 정의를 알려 드리겠습니다. 그리고 기계학습 문제의 종류들과 알고리즘에 대하여 얘기 해보겠습니다. 여러분은 주요 기계학습기술들을 선택 하고 여러 알고리즘 중 하나를 어떻게 선택해야하는지, 언제 그 알고리즘을 적절하게 사용 할 것인지에 대하여 배워봅시다.

반응형
반응형

Apache Ambari는 손쉬운 웹 UI 및 REST API 사용을 제공하여 Hadoop 클러스터의 관리 및 모니터링을 간소화합니다. Ambari는 Linux 기반 HDInsight 클러스터에 포함되어 있으며 클러스터를 모니터링하고 구성을 변경하는데 사용됩니다.


ubuntu 14 기준으로 설치하는 방법은 다음과 같습니다.


$ cd /etc/apt/sources.list.d

$ sudo wget http://public-repo-1.hortonworks.com/ambari/ubuntu14/2.x/updates/2.2.2.0/ambari.list

$ sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD

$ sudo apt-get update

$ sudo apt-get install ambari-server


$ sudo ambari-server setup

# 설정 변경은 안하는걸로 하는게 속 편합니다.


$ sudo ambari-server start


# 로그 확인

cat /var/log/ambari-server/ambari-server.out


웹 접속

http://<ambari-server-host>:8080.

admin/admin


그런데, 기존에서 구성되어 있는 hadoop과 spark의 cluster를 import 할수는 없는것 같습니다.

아마도 Ambari에서 사용하는 HDP로 새로운 cluster 구성을 생성해야 하는 모양입니다.



참조

https://cwiki.apache.org/confluence/display/AMBARI/Install+Ambari+2.1.2+from+Public+Repositories

반응형
반응형

지금까지 총 4대의 분산 환경 서버에 기본환경을 설정하고 Hadoop을 설치해보았습니다.

이번에는 MapReduce보다 빠른 속도에 분산환경을 지원하는 메모리 기반의 Spark를 설치하고 테스트를 해보겠습니다.



Spark 설치하기



1. Spark 버젼 확인


아래 사이트에 접속하여 설치하고자 하는 spark의 버젼을 확인합니다.

http://spark.apache.org/downloads.html



2. Spark 2.0.2 설치


# home으로 이동

$ cd ~


# 설치파일 다운로드

$ wget http://www.eu.apache.org/dist/spark/spark-2.0.2/spark-2.0.2-bin-hadoop2.7.tgz


# 압축 해제

$ tar -zxf spark-2.0.2-bin-hadoop2.7.tgz


# 디렉토리명 변경

$ mv spark-2.0.2-bin-hadoop2.7/ spark


# 환경 변수 설정

$ vi .bashrc

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

export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

export SPARK_HOME=/home/hduser/spark

export PATH=$PATH:$SPARK_HOME/bin



3. Spark on YARN


yarn 위에서 Spark를 실행할 수 있습니다. 샘플 예제를 한번 실행해보도록 합니다.

cluster 모드는 다른 node에서 driver를 실행시키는 방식이고, client 모드는 자신의 node에서 driver를 실행시키는 방식이니 상황에 따라서 적절하게 사용하면 되겠습니다.


$ spark-submit --class org.apache.spark.examples.SparkPi \

    --master yarn \

    --deploy-mode cluster \

    --driver-memory 4g \

    --executor-memory 2g \

    --executor-cores 1 \

    ~/spark/examples/jars/spark-examples*.jar \

    10


$ spark-submit --class org.apache.spark.examples.SparkPi \

--master yarn \

--deploy-mode client \

    --driver-memory 4g \

    --executor-memory 2g \

    --executor-cores 1 \

    ~/spark/examples/jars/spark-examples*.jar \

10   



4. Spark in Standalone


Spark는 독립적인 모드로도 설치 및 수행이 가능합니다. 


### yarn에서 돌리려면 master에만 설치하면되지만, Standalone mode를 위해서는 모든 slave에 설치/배포

$ scp -r /home/hduser/spark ubuntu1:/home/hduser/spark

$ scp -r /home/hduser/spark ubuntu2:/home/hduser/spark

$ scp -r /home/hduser/spark ubuntu3:/home/hduser/spark


### master 서버에서만 이후 진행

### slave 서버들을 등록

$ vi ~/spark/conf/slaves

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

ubuntu1

ubuntu2

ubuntu3


### 환경 설정

$ vi ~/spark/conf/spark-env.sh

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

SPARK_WORKER_MEMORY=2g


### 서비스 시작/종료

$ ~/spark/sbin/start-all.sh

$ ~/spark/sbin/stop-all.sh


### web ui for spark

http://ubuntu0:8080


### 테스트

$ spark-submit \

     --master spark://ubuntu0:7077 \

     --class org.apache.spark.examples.SparkPi \

     ~/spark/examples/jars/spark-examples*.jar \

     100



예제가 잘 수행이 되면 정상적으로 설치 및 설정이 된것입니다.

web ui에서 해당 application들이 수행되는 모습을 모니터링 할 수 있으며, 결과와 로그도 볼 수 있습니다.


다음에는 간단한 튜토리얼 예제 프로그램을 통해서 분산처리 프로그래밍을 살펴보도록 하겠습니다.

길고 긴 설치과정을 따라 하시는냐 수고가 많으셨습니다.



5. Spark history server


Spark에서 제공하는 history server를 띄워보겠습니다. 디폴트 UI port는 18080입니다.


$ hadoop fs -mkdir -p /user/hduser/spark/history


$ sudo vi ~/spark/conf/spark-defaults.conf

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

park.master                      spark://ubuntu0:7077

spark.eventLog.enabled         true

spark.eventLog.dir               hdfs://ubuntu0:9000/user/hduser/spark/history

spark.history.fs.logDirectory    hdfs://ubuntu0:9000/user/hduser/spark/history

spark.history.provider           org.apache.spark.deploy.history.FsHistoryProvider


$ ~/spark/sbin/start-history-server.sh


반응형
반응형

이전 내용에서 각 서버들에 공통적인 기본환경들을 구성하였습니다.

이번에는 본격적으로 Hadoop을 설치하여 서비스를 기동시키고 Mapreduce 테스트까지 돌려보겠습니다.



Hadoop 설치하기


먼저 master서버인 ubuntu0 서버부터 설치를 진행을 합니다.

그리고 진행 중간부분쯤에 설치된 패키지를 나머지 서버들로 배포를 하고 각 서버별로 재수정을 하도록 하겠습니다.


1. data 디렉토리 생성


hadoop의 HDFS(파일시스템)에 사용될 디렉토리를 생성합니다.


### 모든 서버에 data 디렉토리를 생성합니다.

$ sudo mkdir /data

$ sudo chown -R hduser:hadoop /data


### master 서버에서만 namenode 디렉토리를 생성합니다.

$ mkdir /data/tmp /data/namenode


### slave 서버들에서만 datanode와 userlogs 디렉토리를 생성합니다.

$ mkdir /data/tmp /data/datanode /data/userlogs



2hadoop 2.7.1 설치


하둡 파일을 다운로드하고 설치 및 기본 path 설정을 해줍니다.


$ cd ~


### apache repository로 부터 다운로드

$ wget http://www.us.apache.org/dist/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz


## 압축 해제

$ tar -zxf hadoop-2.7.1.tar.gz


## 디렉토리 이름변경

$ mv hadoop-2.7.1 hadoop


## 유저계정에 path설정

$ vi ~/.bashrc

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

# Java and Hadoop variables

export HADOOP_HOME=/home/hduser/hadoop

export JAVA_HOME=/opt/jdk/jdk1.8.0_111/ 

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar


## 하둡 환경 설정

$ vi ~/hadoop/etc/hadoop/hadoop-env.sh

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

export JAVA_HOME=/opt/jdk/jdk1.8.0_111/ 



3. master서버의 config 파일 설정


우선 master서버의 config 파일들이 있는 디렉토리로 이동하여 설정 xml 파일을 작성해줍니다.


$ cd ~/hadoop/etc/hadoop/



### Configuration for the Master

$ vi core-site.xml

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

<configuration>

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://ubuntu0:9000</value>

    </property>

    <property>

        <name>hadoop.tmp.dir</name>

        <value>/data/tmp</value>

    </property>

</configuration>


### hdfs 환경 설정 (디폴트 복제는 3이지만 2만 해줍니다.)

$ vi hdfs-site.xml

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

<configuration>

    <property>

        <name>dfs.replication</name>

        <value>2</value>

    </property>

    <property>

        <name>dfs.namenode.name.dir</name>

        <value>/data/namenode</value>

    </property>

</configuration>


### yarn 환경 설정 (memory와 core수는 각자의 서버에 적절한 값으로 설정해줍니다.)

$ vi yarn-site.xml

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

<configuration>


    <!-- YARN master hostname -->

    <property>

        <name>yarn.resourcemanager.hostname</name>

        <value>ubuntu0</value>

    </property>


    <!-- YARN settings for lower and upper resource limits -->

    <property>

        <name>yarn.scheduler.minimum-allocation-mb</name>

        <value>512</value>

    </property>

    <property>

        <name>yarn.scheduler.maximum-allocation-mb</name>

        <value>4096</value>

    </property>

    <property>

        <name>yarn.scheduler.minimum-allocation-vcores</name>

        <value>1</value>

    </property>

    <property>

        <name>yarn.scheduler.maximum-allocation-vcores</name>

        <value>2</value>

    </property>


    <!-- Log aggregation settings -->

    <property>

        <name>yarn.log-aggregation-enable</name>

        <value>true</value>

    </property>

    <property>

        <name>yarn.log-aggregation.retain-seconds</name>

        <value>86400</value>

        <description>How long to keep aggregation logs. Used by History Server.</description>

    </property>


</configuration>


### mapreduce 환경 설정 (memory 값은 각자의 서버에 적절하게 지정해주도록 합니다.)

$ vi mapred-site.xml

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

<configuration>


    <property>

        <name>mapreduce.framework.name</name>

        <value>yarn</value>

    </property>


    <!-- MapReduce ApplicationMaster properties -->

    <property>

        <name>yarn.app.mapreduce.am.resource.mb</name>

        <value>1536</value>

    </property>

    <property>

        <name>yarn.app.mapreduce.am.command-opts</name>

        <value>-Xmx1536m</value>

    </property>


    <!-- Mappers and Reducers settings -->

    <property>

        <name>mapreduce.map.memory.mb</name>

        <value>2048</value>

    </property>

    <property>

        <name>mapreduce.map.cpu.vcores</name>

        <value>1</value>

    </property>

    <property>

        <name>mapreduce.reduce.memory.mb</name>

        <value>4096</value>

    </property>

    <property>

        <name>mapreduce.reduce.cpu.vcores</name>

        <value>1</value>

    </property>

    <property>

        <name>mapreduce.job.reduces</name>

        <value>2</value>

    </property>


    <!-- History Server settings -->

    <property>

        <name>mapreduce.jobhistory.address</name>

        <value>ubuntu0:10020</value>

    </property>

    <property>

        <name>mapreduce.jobhistory.webapp.address</name>

        <value>ubuntu0:19888</value>

    </property>



</configuration>


### 마스터 서버에만 slave 서버들을 등록해줍니다.

$ vi slaves

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

ubuntu1

ubuntu2

ubuntu3



4. slave 서버들로 배포


지금까지 기본 설치 및 설정한 hadoop 패키지를 다른 서버로 배포합니다.

개별적으로 설치하는 것보다 시간을 단축시킬 수 있어 편리합니다.


### 서버별 배포

$ scp -r /home/hduser/hadoop ubuntu1:/home/hduser/hadoop

$ scp -r /home/hduser/hadoop ubuntu2:/home/hduser/hadoop

$ scp -r /home/hduser/hadoop ubuntu3:/home/hduser/hadoop



5. slave 서버들의 환경 설정


### Configuration for the Slaves

### Slave1 server에서 수정하여 다른 Slave2, Slave3 server들로 동기화 전송함


$ vi core-site.xml

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

<configuration>

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://ubuntu0:9000</value>

    </property>

    <property>

        <name>hadoop.tmp.dir</name>

        <value>/data/tmp</value>

    </property>

</configuration>



$ vi hdfs-site.xml

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

<configuration>

    <property>

        <name>dfs.datanode.data.dir</name>

        <value>/data/datanode</value>

    </property>

</configuration>



$ vi yarn-site.xml

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

<configuration>


    <property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

    </property>


    <!-- Link to the master node -->

    <property>

        <name>yarn.resourcemanager.hostname</name>

        <value>ubuntu0</value>

    </property>


    <!-- Available resources for YARN containers on this node -->

    <property>

        <name>yarn.nodemanager.resource.memory-mb</name>

        <value>7048</value>

    </property>

    <property>

        <name>yarn.nodemanager.resource.cpu-vcores</name>

        <value>2</value>

    </property>


    <property>

        <name>yarn.nodemanager.vmem-check-enabled</name>

        <value>false</value>

    </property>


    <!-- Log aggregation settings -->

    <property>

        <name>yarn.log-aggregation-enable</name>

        <value>true</value>

    </property>

    <property>

        <name>yarn.nodemanager.log-dirs</name>

        <value>/data/userlogs</value>

    </property>

    <property>

        <name>yarn.log.server.url</name>

        <value>ubuntu0:19888</value>

    </property>

    <property>

        <name>yarn.nodemanager.delete.debug-delay-sec</name>

        <value>86400</value>

    </property>


</configuration>


### 변경사항 동기화 전송

$ rsync -av /home/hduser/hadoop/etc/hadoop ubuntu2:/home/hduser/hadoop/etc

$ rsync -av /home/hduser/hadoop/etc/hadoop ubuntu3:/home/hduser/hadoop/etc



6. HDFS 시작


설치가 모두 완료가 되었으니 이제 hdfs (파일시스템)을 기동합니다.


### namenode를 format 하고 hdfs start.

$ hadoop namenode -format daesonyCluster

$ start-dfs.sh    #서비스 시작

$ stop-dfs.sh    #서비스 종료


### web ui에서 Namenode 1개와 Datanode 3개가 잘 나타나면 정상

http://ubuntu0:50070


### 만약 이상이 있다면 각 서버별로 로그들을 확인

$ cd ~/hadoop/logs


여기서 한가지 주의할 점이 있습니다.

초기 설치시에는 해당사항이 없지만 한번 서비스를 진행하다가 다시 namenode를 format 해야하는 일이 생기면, 반듯이 먼저 datanode 하위 모든 파일을 삭제하고 진행을 해야 합니다. 만약 하위 파일들을 삭제하지 않고 format을 하면 namenode의 clusterId와 datanode의 clusterId가 달라져서 정상적으로 동작하지 않을 수 있습니다.

참고 : http://hadooptutorial.info/incompatible-clusterids/



7. Filesystem 테스트


Hadoop 파일시스템에 디렉토리를 생성하고 테스트 파일(/opt/test.txt)을 업로딩 해봅니다.


$ hadoop fs -mkdir /user

$ hadoop fs -mkdir /user/hduser

$ hadoop fs -put /opt/test.txt /user/hduser

$ hadoop fs -ls /user/hduser



8. Yarn 시작


하둡의 분산환경에서 리소스를 관리해주는 yarn 서비스를 시작합니다.


$ start-yarn.sh    #서비스 시작

$ stop-yarn.sh    #서비스 종료


#web ui for yarn

http://ubuntu0:8088



9. history server 시작


application이 실행이 되면 그 수행 기록들이 history server에 남게 됩니다.


$ mr-jobhistory-daemon.sh start historyserver    #서비스 시작

$ mr-jobhistory-daemon.sh stop historyserver    #서비스 종료


#web ui for history

http://ubuntu0:19888



10. MapReduce 예제 실행


여기까지 잘 진행이 되었다면 설치가 모두 완료가 되었습니다.

정상적으로 동작하는지 테스트를 위해서 PI 값을 구하는 예제를 실행해봅니다.


저는 해당 예제의 실행 속도가 약 1분 30초 정도 걸리는 것을 볼 수 있습니다. 

이는 datanode의 갯수와 cpu, memory에 따라 분산처리 성능의 차이가 발생하니 결과값을 비교해 보시길 바랍니다.


$ yarn jar $HADOOP_HOME/share/hadoop/mapreduce/*examples*.jar pi 50 100

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

Job Finished in 82.415 seconds

Estimated value of Pi is 3.14160000000000000000


# ResourceManager UI or History Server UI 에서 해당 log를 볼수있게됨

$ yarn logs --applicationId application_1482330106523_0001 > pi_app.log


만약에 실행중에 container-is-running-beyond-memory-limits 와 같은 오류가 발생을 한다면 yarn 환경설정에서 메모리 설정에 문제가 발생한 경우입니다. 각 서버별로 로그들을 확인하고 충분한 메모리를 할당해주도록 합니다.

참조 : http://stackoverflow.com/questions/21005643/container-is-running-beyond-memory-limits


수고하셨습니다~ Hadoop 설치가 모두 완료되었습니다.

MapReduce를 사용해서도 많은 것을 수행할 수 있지만, 디스크 IO 작업이 많이 발생하기에 최근에는 메모리 기반의 Spark을 많이 사용하고 있습니다. 다음에는 Spark에 대해서 알아보도록 하겠습니다.



반응형
반응형

http://daeson.tistory.com/entry/Hadoop-Cluster-Spark-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-1%EC%84%9C%EB%B2%84-%ED%99%98%EA%B2%BD%EA%B5%AC%EC%84%B1



분산환경의 빅데이터 서버를 구성하기 위해서는 apache hadoop을 많이 사용하고 있습니다.

데이터가 점차 중요해지는 시기가 되고 있고 엄청나게 많은 데이터가 넘쳐나고 있는 지금의 세상에서 어쩌면 가장 필수적인 서버 환경이 되지 않을까 싶은 생각이 듭니다.


그래서, 올해 마지막이자, 개인적인 연말 프로젝트로 시작하는 분산컴퓨팅 환경을 구축하려고 합니다.

ubuntu 14 서버 총 4대를 가지고 hadoop cluster 환경을 구축하고 이어서 spark까지 해보도록 하겠습니다.


워낙 길고 긴 여정이 될 내용인지라 너무 길어서 조금 나눠서 올릴 계획입니다. 

아마 3~4부 정도 되지 않을까 싶으네요.




서버 환경 구성하기


일단 hadoop을 설치하기 전에,

4대의 ubuntu 서버들 모두에게 공통적으로 기본 환경 구성에 필요한 내용들을 먼저 해주어야 합니다.



1. user/usergroup 생성


모든 서버에 hadoop 사용자 그룹과 유저를 생성하고 권한을 부여해 줍니다.


### 모든 서버에 hadoop 유저그룹과 hduser 유저 생성
$ sudo addgroup hadoop
$ sudo adduser --ingroup hadoop hduser

### sudoers file에 hduser 추가
$ sudo visudo
----------------------------------------------------------------------------------

hduser ALL=(ALL:ALL) ALL

### hduser로 로그인
$ su - hduser


2. ssh 설정


hadoop은 분산처리시에 서버들간에 ssh 통신을 자동적으로 수행하게 됩니다.

이를 위해서 암호입력 없이 접속이 가능하도록 ubuntu0 서버에서 공개키를 생성하고 생성된 키를 각 서버들에 배포해줍니다.


### ssh 설정 변경

$ sudo vi /etc/ssh/sshd_config

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

PubkeyAuthentication yes

AuthorizedKeysFile      .ssh/authorized_keys


### 공개키를 생성

$ mkdir ~/.ssh

$ chmod 700 ~/.ssh

$ ssh-keygen -t rsa -P ""

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys


### 공개키를 각 서버에 배포

$ ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu1

$ ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu2

$ ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu3


### 접속 테스트

$ ssh ubuntu1



3. java 설치


Hadoop이 JVM을 사용하기 때문에 모든 서버에 java SDK를 설치하도록 합니다.

현재 Hadoop 버젼이 2.7.* 이며, 버젼 2 이상부터는 java 1.7 이상에서만 지원이 되기에 이미 설치가 되어 있다면 버젼확인을 해보시길 바랍니다.


여기서는 현재 최신 버젼인 java 1.8을 설치하겠습니다.


### directory 생성
$ sudo mkdir /opt/jdk
$ cd /opt

### Download archive
$ sudo wget --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111-linux-x64.tar.gz"

### Unpack
$ sudo tar -zxf jdk-8u111-linux-x64.tar.gz -C /opt/jdk

### Update Ubuntu alternatives symbolic links
$ sudo update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_111/bin/java 100
$ sudo update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk1.8.0_111/bin/javac 100

$ java -version


java 버젼정보가 보여지면 정상적으로 설치가 잘 되었습니다.



4. locale 확인(옵션)


모든 서버의 locale 정보를 확인해보고 en_US.UTF-8 혹은 ko_KR.UTF-8 이 아닌 경우에만 변경을 해주면 됩니다.

일반적으로는 변경할 필요가 없으니 옵션사항으로 생각하시고 skip 하시면 되겠습니다.


### 정보 확인

$ locale
$ cat /etc/default/locale

### locale 변경하기
$ sudo locale-gen ko_KR.UTF-8
$ vi /etc/default/locale
----------------------------------------------------------------------------------
LANG="ko_KR.UTF-8"
LANGUAGE="ko_KR:ko:en_US:en"

### 변경된 locale을 적용하기 (서버 재부팅 필요없음)
$ source /etc/default/locale

### 만약 언어 설정이 제대로 적용이 되지 않으면 아래의 설치 여부를 확인해보세요
### 설치된 언어팩 리스트 확인
$ sudo apt list --installed | grep language*

### 설치 가능한 리스트 확인

$ sudo apt-cache pkgnames | grep language-pack-ko



5. hosts 파일 수정


분산 환경이기 때문에 4대의 서버 모두에 접속이 자유롭게 되어야 합니다.

이를 위해서 모든 서버들의 hosts 파일에 ip와 host 이름을 생성해 주도록 합니다.

참고로 여기서는 ubuntu0이 master 서버가 될 예정이고, 그외 서버들은 slave 서버가 될 예정입니다.


### hosts 파일 수정

$ sudo vi /etc/hosts
----------------------------------------------------------------------------------
10.1.1.58        ubuntu0
10.1.1.13       ubuntu1
10.1.1.15       ubuntu2
10.1.1.221      ubuntu3

### 확인

$ cat /etc/hosts



6. hostname 변경


각각 4대 서버들의 이름을 위에서 지정한 host 이름과 동일하게 맞춰주도록 합니다.


### ubuntu0 서버의 경우

$ sudo vi /etc/hostname

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

ubuntu0


### 변경사항 적용하기 (서버 재부팅 필요없음)

$ sudo /bin/hostname -F /etc/hostname



여기까지 되면 기본적인 서버들의 환경설정이 모두 완료되었습니다.

다음에는 Hadoop을 설치하고 구동해보도록 하겠습니다.



반응형
반응형

빅데이터 저장소


- 1테라 바이트를 약 100MB/S 로 전송한다면 2시간 반 이상 걸린다.

- 100개의 드라이브가 있고, 각 드라이브는 100/1씩 저장하고 병렬로 동작한다면 2분내에 데이터를 읽을 수 있다

- 병렬 분산처리를 위해서는 하드웨어 장애와 데이터 분할 결합에 대한 고려가 필요하다.

- 하둡은 안정적인 공유저장소(HDFS)와 분산 프로그래밍 프레임웍(맵리듀스)을 제공한다.



HDFS


- 파일시스템(Storage)

- FILE은 Block 단위(64MB or 128MB)로 분할되고 분산되어 저장됨

- 분할된 정보는 Name node(master)에 메타정보가 기록이 되고, 실제 분할된 파일은 Data node(Slave)들에 분산되어 저장이 됨

- Name node 가 없으면 Data node에 저장된 분할된 파일을 찾을 수 없다.

- 각 Block은 장애 복구 용도로 복제본이 생성(default 3 copy) 되어 여러 Data node에 분산되어 저장이 된다.

- HDFS 접근 방법 : Shell 사용(hadoop fs), Java API, Ecosystem(Hue, Sqoop, Flume)

- A.log 파일을 hadoop fs -get 하여 가져올때 Name node에서 해당 파일의 메타 정보를 기준으로 분산저장이 되어 있는 Data node에 저장된 파일을 찾아온다. 이때, 복제본중에서 리소스가 여유있는 서버(혹은 Data node)에 저장되어 있는 파일을 찾아준다.

- Job tracker(master) 데몬이 각각의 task들을 관리해주고 있고, Task tracker(slave) 데몬은 각 Data node에 있는 분산파일 처리를 담당하고 있다.

- Task tracker는 mapper task와 reducer task로 구성이 되어 있으며 해당 task가 위치한 Data node의 데이터를 사용해서 MapReduce를 수행한다.



MapReduce


- Hadoop 클러스터의 분산 데이터를 처리하기 위한 방식(computation)

- 큰 파일을 분할(map)하여 저장하고, 분할된 파일을 다시 하나로 병합(reduce)하는 프레임웍

- 예시, wordcount(단어 갯수 세기), 1억개 단어를 가지고 있는 하나의 파일을 단일 프로세스로 수행하는 것보다 100개 단어를 가지는 100만개 파일로 분할하여 각각 수행하고 이 결과를 최종 병합하여 수행하는 개념이다.

- map은 다수의 data node에 동일한 작업을 수행한다.

- HDFS(Disk)에서 데이터를 read하여 MapReduce 수행하고 완료되면 HDFS(Disk)에 데이터를 다시 write한다.

- Disk IO는 비용이 크기 때문에 이를 Memory로 대체하는 방법이 대안으로 제시된다. (Spark)

- 각 data node의 task들이 모두 완료가 되어야 Reduce를 수행할 수 있다. (하나라도 늦게 끝나면 전체적으로 처리시간이 늦어지는 문제점이 있다.)

- Mapper는 Key/Value 형태로 데이터를 읽어서 처리하고 그 결과를 [Key/Value] List 형태로 출력한다.

- Mapper 출력의 Key 값은 중요하게 사용할 수도 있고 무시할 수도 있고 변경하여 새로운 key를 생성할 수도 있다.

- Mapper는 각 pc에서 memory를 사용해서 처리됨으로 시간이 짧게 걸린다.

- Reducer는 shuffle, sort가 이루어지고 최종적으로 원하는 결과를 출력하도록 수행이 된다.

- shuffle은 Mapper가 출력한 데이터를 Reducer에게 적절히 배분하여 전달해주어야 함으로 시간이 상당히 오래걸린다.(하둡이 해줌)

- sort는 key 값을 cache하여 같은 key 값을 갖는 데이터는 같은 reducer로 전달이 된다.

- Reducer의 입력은 Mapper의 출력인 [Key/Value] List 형태가 되고, 출력은 Key/Value 가 된다.

- Reducer의 출력은 다시 HDFS에 저장된다.

- MapReduce 프로그램은 Java or Python으로 한다.





HIVE


- MapReduce 프로그램을 통해서 데이터를 처리하거나 분석해야하는데 데이터 분석자는 프로그램을 할줄 모른다.

- 페이스북에서 이에 대한 고민을 통해서 Hive를 만들었다.

- RDBMS의 Sql와 비슷하게 작성된 문장(HiveQL)을 Hive가 이를 Mapreduce로 converting 하여 수행해준다.

- structured data 를 Hadoop file system에 저장하기 위한 data warehousing system이다.

- MapReduce를 몰라도 대용량 데이터를 처리하기 용이하다.

- high level 언어임으로 단점이 발생함.(개별 record의 insert, update, delete, transaction이 지원안됨)

- 로그 분석, Data/Text mining(기계학습), 광고배달, 스팸방지등에 활용된다.

- Local PC에 mysql DB를 생성하고 메타데이터(테이블)를 생성 한후 HDFS로 올리는 방법을 많이 사용한다. 직접 HDFS에 생성하는 것은 힘듬

- RDBMS Table을 Hadoop HDFS File로 올릴때에는 Sqoop을 사용한다.

- Hive도 Metastore(master)가 있고, Hive Tables(slave)가 있다. HDFS의 구성과 비슷하게 생성이 됨.

- 기존의 RDBMS 데이터를 HDFS에서 사용이 가능하다.

- Hive에서 ngrams를 지원해준다.

- Hive에서 sentences() 함수는 문장을 array of words로 변환해준다. 2개 이상의 문장은 2-dimensional로 변환해준다.



n-grams


- 검색엔진과 같은 application에서 검색결과의 spelling 교정에 사용

- 웹 페이지에서 가장 중요한 topics 찾는데 사용

- SNS message등에서 트랜드 topics 검색에 사용



Python Basics


http://ai.berkeley.edu/tutorial.html#PythonBasics



pySpark


- RDD(Resilient Distributed Dataset) : 메모리에 데이터 손실이 되어도 다시 생성이 가능하고, 메모리에 분산 저장되어 있고, 초기 데이터는 파일을 통해 가져온다.

- RDD는 spark의 기본적인 데이터 단위이다.

- RDD를 생성하는 방법

sc.textFile("text.txt") #from file to RDD

sc.parallelize(num) #from memory(list) to RDD

objectRDD.map(lambda line: line.upper()) #from RDD to new RDD

- RDD Operations

Actions : RDD의 값을 리턴하거나 내장함수를 사용한다.

Transformations : 현재 RDD로 부터 새로운 RDD를 생성한다.

- RDD는 immutable이여야 하며, 절대로 값이 불변이다. 그러므로 변경하고자 할때에는 transformation을 통해 새로운 RDD로 생성해야 한다.

- transformation에 사용되는 대표적인 함수는 map(f), filter(f), flatMap(f), distinct() 이다.

http://spark.apache.org/docs/latest/programming-guide.html#transformations

- action에 사용되는 대표적인 함수는 count(), take(n), collect(n), saveAsTextFile(path) 이다.

http://spark.apache.org/docs/latest/programming-guide.html#actions

- RDD 데이터는 action 함수로 인한 작업을 만날때까지는 실제적으로 수행/처리되지 않는다. transformations는 즉시 수행이 되지 않는다. (Lazy Execution)

- 복잡한 처리를 한번에 수행하게 되면 시간이 오래걸리므로, 중간에 적절하게 action 함수를 혼용해서 프로그래밍 한다.

- transformations 구문들은 chaining 하여 1라인으로 작성해도 된다.


- Spark 에서는 driver와 executors로 구성이 되고 이 둘 사이에는 통신을 한다.

- Spark Application 을 시작할때 SparkContext 생성으로 부터 시작되고 Master node에서는 동작 가능한 cores을 사용자의 spark application에 할당한다.

- 사용자는 보통 Spark Context를 사용해서 RDD 생성하고 사용한다.

- SparkContext 사용 방법 : sc = SparkContext(conf = conf)

- Partition 갯수 변경 및 확인 방법 : repartition(n), getNumPartitions() <- number만 지정해주면 spark이 알아서 분배해준다.

- python의 range(10,21) 함수는 선언 즉시 메모리를 할당하고 list 값을 갖지만, xrange 함수는 실행되는 시점에 메모리를 할당(lazy evaluation)한다.

- RDD의 lineage 확인하는 방법 : RDD.toDebugString()

- RDD의 type 확인하는 방법 : print 'type of RDD: {0}',format(type(RDD))


- map 함수를 사용하는 방법 : RDD.map(f), f 함수는 partition별로 처리할 로직의 함수이며 새로 생성되는 RDD는 동일한 partition 수를 갖는다.

- filter 함수를 사용하는 방법 : RDD.filter(f), f 함수는 true or false 값을 리턴해주어야 하며 true에 해당하는 data만 남게된다. data가 없어도 partition 수는 그대로 유지가 된다.

- reduce 함수는 파라메터로 function을 전달 받는데 이 function은 항상 associative(더하기 연산) 하고 commutative(곱하기 연산) 해야한다. (마이너스나 나누기 연산은 partition 변경에 따라 값이 달라지므로 사용 불가)

- takeSample 함수는 중복 허용 여부에 따라 num 갯수만큼 샘플링한다. seed 값을 사용하면 항상 같은 샘플링 값이 나오도록 할 수 있다.


- key/value 데이터의 경우에는 reduceByKey(f) 를 사용할 수 있다. 동일node의 같은key기준으로 병합한다. 이는 shuffling 할 때 네트워크 부하를 줄여주는 효과가 있다. (groupByKey()는 데이터가 많이 몰릴경우 네트워크 부하발생 및 out of memory가 발생할 수 있어 주의해야한다.)

- mapValues(sum) 이나 mapValues(list)를 사용해서 pySpark에서 처리도 가능하다.

- pySpark wordcount

text = sc.textFile("test")

wc = text.flatMap(lambda line : line.split()).map(lambda word : (word,1)).reduceByKey(lambda c1,c2 : c1+c2)

wc.collect()

print wc.sortByKey(ascending=True).collect()

print wc.map(lambda (w,c) : (c,w)).sortByKey(ascending=False).collect()

- file 기반의 검색 및 split 하기 위해서 정규화표현식(Regexp)을 사용한다.



(참고)

http://www.kocw.net/home/search/kemView.do?kemId=1174002

http://wiki.gurubee.net/pages/viewpage.action?pageId=28116079

http://hadoop.apache.org/

http://spark.apache.org/docs/latest/programming-guide.html

반응형
반응형

[유저관련 지표]

  • UV (Unique visitor) : 일정기간 내에 게임의 접속(방문)한 실제 유저 수로 한 유저가 여러번 방문해도 1로 카운트 한다.

  • DAU (Daily Active User) : 일단위로 측정한 UV

  • WAU (Week Active User) : 주단위로 측정한 UV

  • MAU (Monthly Active User) : 월 단위로 UV 측정

  • RU (Registered User) : 일정기간내에 게임에 등록된 유저 수

  • NRU (New Registered User) : 일정기간내에 등록된 신규 유저 수.

  • ARU (Accumulate Register User): 해당 기간까지의 등록된 누적 유저 수

  • 재방문 UV : 해당 기간 동안 게임 클라이언트에 2회 이상 로그인한 회원 수

  • MUV (Multigame Unique Visitor): 해당 기간 동안 게임 클라이언트에 로그인하여 실제 게임을 플레이 한 회원 수

  • MTS (Mutigame Time Spent): 해당 기간 동안의 평균 실제 플레이 타임

  • TS(Time Spent) : 해당기간 동안의 유저1인당 플레이 타임

  • CCU (Concurrent User) : 특정 시점에 접속한 동시 접속자 수

  • MCU (Maxium Concurrent User) : 하루 동안 가장 높은 동시접속자 수치.

  • PCU (Peak Concurrent User) : MCU 동일어

  • ACU (Average Concurrent User) : 1일 동안의 평균 동시 접속자 수

  • Stickness : 고착도

  • EU (Executed User) : 인게임을 플레이한 유저로 UV와 같이 비교대상으로 분석

 

 

 [매출 관련 지표]

  • BU (Buying user) : 구매유저일정기간내에 게임에 아이템 구매월정액 결제 등 돈을 지불한 유저

  • PU (Paying User) : BU 동일어

  • BU rate = BU/UV (순방문자대비 결제 유저 비율)

  • CAC(Customer Acquisition Cost) : 유저 확보 비용으로 유저 1인을 확보하는데 소모되는 비용

  • CRC (Customer Retention Cost) : 유저 유지 비용으로 일정기간내에 유저1인을 유지하는데 소모되는 비용

  • ARPU (Average Revenue Per User) : 일정 기간 내 유저 1인당 평균 수입

  • ARPPU (Average Revenue Per Paying User) : 일정 기간내에 게임에 비용을 지불한 유저의 1인당 평균 수입

  • PPU (Percentage of Paying Users) : DAU 내에서 결제한 비율 또는 비율

  • LTV (Life time value) : 유저 1인당 게임에서 완전히 이탈할 때까지 지불하는 비용

  • Entry Cost : 여러 가지 가격대의 상품을 제공할 때 유저의 최초 구매가 어떤 가격대에서 많이 일어나는지 측정

  • Sales by Purchase : 사용자의 구매 활동을 통해 집계된 매출

  • Sales by Advertisement : 광고 노출을 통해 집계된 매출

  • CPI (Cost per Install) : 게임 다운로드 후 설치하면 보상

  • CPA (Cost per Action) : 설치된 앱을 실행하면 보상

  • CPP (Cost per Play) : CPA 이후 일정 기간 한번씩 실행할 때마다 보상

  • CPL (Cost per Level) : 정량적인 플레이에 대한 레벨을 설정한 뒤 보상

 

 

[투자 퍼블리싱 관련 용어]

MOU (Memorandum of understanding) : 투자 등 거래에 관해 합의한 사항을 명시한 사전 협의문서로 법적 구속력이 없으며 정식 계약 전 업무 준비/친선관계 개선/대외 홍보의 역할로 활용 한다.

Initial fee : 판권 제공/계약 체결 시 판권 부여를 대가로 수령하는 금액으로 흔히 계약금이라고 한다.

Running Royalty : 퍼블리셔가 개발사에게 매출액의 일정 비율을 지급하는 비용으로 러닝 개런티랑 동일하다.

MG(Minimum Guarantee) :  판권 제공자의 최소 러닝 로얄티를 보장해 주는 금액

RS (Revenue Share) : 판권제공사/퍼블리셔 간의 수익 분배 비율

PF (Project Financing) : 회사 지분에 대한 투자가 아닌 프로젝트 성공 수익에 대해 투자하는 투자 방식

KPI(Key Performance Indicator) : 핵심실행지표로 기업이나 조직의 목표달성과 전략을 위한 핵심측정지표

 

 

[참고자료]

http://blog.naver.com/minopie/220362749342

 

 

용어는 업계마다 약간씩 다르지만 의미는 거의 유사하기 때문에 정리된 내용을 알아두면 많은 도움이 되리라 생각한다앞으로 포스팅 예정인 게임 통계 내용도 정리된 용어를 기반으로 설명한다.

 

 

 

게임마케팅게임용어마케팅 용어게임기획게임 분석게임이야기마케팅이야기동시접자수재방문율결제유저, ARPU, ARPPU, DAU, NU, UV, PV MCU, PCU, CCU


반응형

'연구개발 > Etc..' 카테고리의 다른 글

[Docker] 생성 및 실행  (0) 2018.07.04
운영체제 개론  (0) 2017.05.29
unity key  (0) 2016.05.07
RAID 1+0 과 0+1의 차이점  (0) 2011.07.11
윈도우 보안취약점 보완 강화  (0) 2011.05.04
반응형

MS-SQL 에서 MY-SQL 서버를 연결된 서버 ( Linked Server ) 로 등록하는 방법 


1. 제어판 - 관리 도구 - 데이터 원본(ODBC) 실행.

( mysql ODBC 설치가 안되어 있다면 http://dev.mysql.com/downloads/connector/odbc/Viewer 환경에 맞는 ODBC 설치 )






2. SSMS 에서 연결된 서버 - 새 연결된 서버 선택





3. 아래와 같이 입력.


일반 탭



보안 탭




완료 후 테스트 방법은 

OpenQuery 를 이용해서 쿼리를 날려봅니다.


오픈 쿼리에 대한 정보는 http://msdn.microsoft.com/ko-kr/library/ms188427.aspxViewer

반응형
반응형

Java용 인증서의 경우 .p12로 된 인증서를 만드는 방법을 소개합니다.


인증서 생성을 위해서 일단 Cert파일(aps_development.cer)과 개인키(mykey.p12) 두개 파일이 필요합니다.

1. 개발자센터에서 개발용 인증서파일을 다운로드 받습니다. 기본적으로 파일명은 aps_development.cer으로 생성됩니다.




2. 키체인 접근에서 개인용 인증서를 내보내기로 받습니다.

내보내실때 꼭 인증서 비번을 넣으셔야 생성이 가능하니 만들실때 비번을 넣어서 추출하시기 바랍니다~!



이제 바탕화면에 파일을 옮겨놓으시고 터미널을 엽니다.


4. 터미널에서 개발자센터에서 받은 aps_development.cer파일을 .pem파일로 변환합니다.

아래와 같이 openssl명령어를 입력하시면 developer_identity.pem파일이 생성되신것을 확인 하실 수 있습니다.

openssl x509 -in aps_development.cer -inform DER -out developer_identity.pem -outform PEM


5. 다음으로 개발자의 개인키 mykey.p12파일을 .pem으로 변환합니다.

변환하실때 비번입력을 3번 물어보게 되는데요 첫번째 입력에는 내보내기할 때 입력했던 비밀번호를 입력하시고 나머지 2번,3번째에는 .p12파일로 변환할때 사용할 비밀번호를 입력하시면 됩니다. 

openssl pkcs12 -nocerts -in mykey.p12 -out mykey.pem


6. 마지막으로 .pem로 변환한 인증서과 개인키를 .p12파일로 변환합니다.

변환할때 5번의 2,3번째 입력했던 비밀번호를 입력하시면 변환이 완료됩니다.

openssl pkcs12 -export -inkey mykey.pem -in developer_identity.pem -out dev_push_cert.p12


기존에는 간단하게 키체인 접근에서 cert파일과개인키를 .p12파일로 내보내기 해서 생성했던 방식에 비해 굉장히 번거롭고 어렵네요.


그럼 Java apns을 위한 인증서 생성방법을 맞치겠습니다.~


핵심부분만 설명을 해서 처음인증서를 생성하시려는 분들에게는 어려움이 있을것같아 레퍼런스URL을 알려드리겠습니다.

http://ddirty.tistory.com/50


-인증서 생성을 위해 참고했던 링크

http://stackoverflow.com/questions/20077626/whats-the-correct-format-for-java-apns-certificate

- java apns 오픈소스
- 예전방식으로는 이제 Push가 발송되지 않으니 참고바랍니다


반응형

'연구개발 > IOS' 카테고리의 다른 글

ios  (0) 2017.07.18
APNS 따라하기 시리즈 (인증서 만들기)  (0) 2016.03.21
반응형

  102  locale

  103  apt-get install lanuage-pack-ko

  104  apt-get update

  105  apt-get install language-pack-ko

  106  locale

  107  locale-gen ko_KR.UTF-8

  108  dpkg-reconfigure locales

  109  locale

  110  vi /etc/default/locale -> 


#LANG="en_US.UTF-8"


LANG="ko_KR.UTF-8"

LANGUAGE="ko_KR:ko:en_US:en"


  111  reboot




반응형

'연구개발 > Ubuntu' 카테고리의 다른 글

jenkins (젠킨스) 설치  (0) 2017.07.06
우분투 계정 관리  (0) 2017.06.13
[Ubuntu] 시간 동기화 - ntpdate  (0) 2014.12.12
ubuntu mysql 삭제  (0) 2014.10.27
Ubuntu 12.04에서 chkconfig 사용  (0) 2014.10.01
반응형

- AWS에서 우분투 돌려서 공부용으로 사용하고 있는데 한글 입력이 안된다. 문제의 원인은 시스템 locale이 미국 영어로 되어있기 때문인데, 이것을 변경해주면 한글을 사용할 수 있다.

- 일단 locale을 확인해본다. 아마 미국 영어로 되어 있을 것이다.

    $ locale

- 우선 첫번째 할 일은 한글 입력 패키지를 다운받아 설치해야한다. apt-get으로 간단히 설치할 수 있는데, 문제는 어떤 패키지가 있는지 알기 힘들다는것... 구글링 결과 여러가지 썰이 있었는데 아래의 것을 설치하면 된다.

    $ sudo apt-get install language-pack-ko

- 다음으로 시스템 전체의 locale을 변경한 후 설정한다.

    $ sudo locale-gen ko_KR.UTF-8

    $ sudo dpkg-reconfigure locales


- 그리고 다음번 부팅할 때도 기본적으로 한글을 사용하기 위해 /etc/default/locale 파일을 아래와 같이 변경해준다.

    LANG="ko_KR.UTF-8"
    LANGUAGE="ko_KR:ko:en_US:en"

- 이제 다시 접속할 때마다 자동으로 한글을 사용할 수 있다.

- 단! 이렇게 했음에도 한글이 제대로 표시/입력되지 않을 수 있는데 그건 사용하는 터미널 프로그램의 설정이 잘못되어있기 때문이다. 아마존 클라우드는 SSH를 사용하고, 아무래도 많이 사용하는 프로그램이 putty 일테니 putty 기준으로 설명하면(사실 본인이 putty를 쓰기 때문), putty 설정창의 Window->Translation 항목을 보면 Remote character set이 있다. 이게 기본값이 Use font encoding으로 되어 있는데 이걸 UTF-8으로 바꾸면 정상적으로 한글을 사용할 수 있다.

반응형

'연구개발 > AWS' 카테고리의 다른 글

[AWS] EC2 Linux(Ubuntu) 계정 추가 & 설정  (0) 2017.06.22
centos lrzsz  (0) 2017.06.12
aws. instance. clone. 복제  (0) 2016.02.19
리눅스 시간 동기화  (0) 2015.11.06
[AWS]EC2 centOS 인스턴스 스토리지 확장하기  (0) 2015.11.06
반응형

R3-EERM-DWN7-GFWT-ZA47-RD2P

반응형

'연구개발 > Etc..' 카테고리의 다른 글

운영체제 개론  (0) 2017.05.29
지표 관련 용어  (0) 2016.08.22
RAID 1+0 과 0+1의 차이점  (0) 2011.07.11
윈도우 보안취약점 보완 강화  (0) 2011.05.04
페이스북 소셜 앱 개발 가이드 2011  (0) 2011.03.28
반응형

응용 프로그램별 권한 설정에서 CLSID가 
{806835AE-FD04-4870-A1E8-D65535358293}
이고 APPID가 
{EE4171E6-C37E-4D04-AF4C-8617BC7D4914}인 COM 서버 응용 프로그램에 대한 로컬 활성화 사용 권한을
응용 프로그램 컨테이너 사용할 수 없음 SID(사용할 수 없음)에서 실행 중인 주소 LocalHost(LRPC 사용)의 
사용자 NT SERVICE\SQLSERVERAGENT SID(S-1-5-80-344959196-2060754871-2302487193-2804545603-1466107430)에게 부여하지 않았습니다. 
구성 요소 서비스 관리 도구를 사용하여 이 보안 권한을 수정할 수 있습니다.

(영문)

The application-specific permission settings do not grant Local Activation permission for the COM Server application with CLSID 
{806835AE-FD04-4870-A1E8-D65535358293}
 and APPID 
{EE4171E6-C37E-4D04-AF4C-8617BC7D4914}
 to the user MyDomain\MyLogin SID (S-1-5-21-1688516961-3049443350-111816674-1126) from address LocalHost (Using LRPC). This security permission can be modified using the Component Services administrative tool.





구성요소 서비스 -> 컴퓨터 -> 내컴퓨터 -> DCOM구성에서 Microsoft SQL Server Integration Services 12.0를 찾습니다.

응용 프로그램 ID가 {EE4171E6-C37E-4D04-AF4C-8617BC7D4914} 인지 확인합니다.

속성 -> 보안 -> 시작 및 활성화 권한에서 편집 버튼을 클릭합니다.

추가버튼을 클릭하고 계정을 추가합니다.

위 오류에서 보면 계정은 NT SERVICE\SQLSERVERAGENT가 되어야 겠네요.

로컬 시작과 로컬 활성화 권한을 부여합니다.

확인 버튼을 클릭하고 마무리 합니다.



NT SERVICE\SQLSERVERAGENT 계정 입력방법은 처음 답변했던 내용 대로입니다.

선택할 개체이름을 입력하세요 부분에서 NT SERVICE\SQLSERVERAGENT를 직접 입력해주시면 됩니다.

고급 버튼을 눌러서 검색해봐도 NT SERVICE\SQLSERVERAGENT 계정이 나오지 않습니다. 직접 입력해야 합니다.



반응형

'연구개발 > DBA' 카테고리의 다른 글

oracle mssql linked server  (0) 2018.04.17
select 처리순서  (0) 2017.08.02
mssql 권한설정  (0) 2016.03.16
tempdb 분리  (0) 2016.03.15
성능 모니터  (0) 2015.12.16
반응형

APNS 포스팅 개요

1년만에 다시 푸쉬서비스를 만들려고 하니 기억도 안나고 검색해서 찾아보니 너무 옛날 데이터들이라 헷갈리기도 해서 “이참에 좀 자세하게 기록해놓자!!” 하는 마음에 포스팅을 했습니다. 총 3단계로 나누어 인증서 설치, 서버단에서 푸시 보내기, 앱단에서 푸시 처리하기로 해서 포스팅을 시작하고자 합니다.
APNS란 용어는 애플 개발자 레퍼런스에도 너무 자세하게 나와있고 검색해도 수도 없이 나오기때문에 생략하고 철저하게 개발 적용에만 촛점을 맞추도록 하겠습니다.

 

APNS 인증서 발급 조건

  • 발급일 2013년 7월경
  • Mac OS  X 버전 10.8.4 (산사자)
  • Xcode 버전 4.6.3
  • iOS7이 베타3까지 출시

 

APNS 인증서 발급을 위한 개인 인증서 만들기

우선 애플(Apple) 사이트에서 Notification 인증서를 만들기 위해서는 아래와 같이 키체인을 이용해
CertificateSigningRequest.certSigningRequest 라는 인증서를 만들어야 합니다.

이 인증서는 Notification 인증서를 발급받을 때 반드시 필요하니 우선 따라서 만들어 봅시다.
키체인(Keychain)을 실행한 후 다음과 같이 따라 해보세요!



키체인을 실행한 후 키체인접근> 인증서지원 > 인증 기관에서 인증서 요청을 누릅니다.

 



디스크저장됨을 선택하고 본인이 키 쌍 정보 저장을 체크하세요! 특히 이메일은 개발하는 애플 개발자 아이디를 넣어주시기 바랍니다.





그림과 같이 설정하시고 다음으로 넘어가세요!



인증서 서명을 하기 위한 요청 파일이 완성되었습니다.

이렇게 작업을 완료하시고 Finder에서 보기를 눌러 보시면 다음과 같은 파일이 만들어집니다.

CertificateSigningRequest.certSigningRequest

 

 

APNS 인증서 발급받기

반드시 애플 개발자 계정을 가지고 계셔야 접근하실 수 있습니다. 일반 애플 계정과는 다르니 안되시는 분은 개발자 등록부터 해주시기 바랍니다.

이제 개인 인증서를 만들었으니 애플 개발자 사이트로 이동합니다.
개발자 사이트에 접속하시면 상단에 Member Center라는 곳이 있습니다.
접속하시면 바로 아래의 이미지와 같은 화면을 보실 수 있습니다. 그림을 보시면서 순서대로 따라하시면 금방 APNS용 인증서를 발급받을 수 있습니다.
그럼, 멤버센터에서 Certificates, Identifiers & Profiles > Identifiers > APP ID’s 메뉴로 이동하세요!

 



멤버센터 메인 화면에서 빨간 박스의 Certificates, Identifiers & Profiles를 클릭하세요!



APP IDs 메뉴를 눌러 들어온 화면입니다. 자신이 만들어놓은 앱아이디를 한눈에 보실 수 있습니다. 그럼, 노티를 원하는 앱아이디를 선택하세요!



선택하시면 해당 앱에서 무슨 서비스가 연동되고 사용되는지 한눈에 보실 수 있습니다. 그중 Push Notification 서비스가 Enable 되어있는지 확인하고 Disable 되어있으면 하단의 Edit 버튼을 누릅니다.



저는 이미 만들어 놓아 인증서 내역이 보이지만 몇개고 만들 수 있습니다. 개발용과 배포용으로 만들 수 있으며 우선 개발용으로 해보겠습니다. 자 그럼, Create Certificate를 눌러주세요!



이과정은 아까 맥에서 만들었던 인증서를 만드는 방법에 대해서 안내해주는 화면입니다. 우린 이미 만들었으니 다음 단계로 넘어가시죠!



아까 만들었던 인증서를 업로드해야 합니다. Choose File을 눌러 CertificateSigningRequest.certSigningRequest 파일을 연결해주세요!



자! 그럼 Generate를 눌러 APNS 인증서를 발급받아보세요!



드디어 인증서가 만들어졌습니다. 다운로드를 눌러주세요!



인증서가 이제 다운되었습니다. 다음은 인증서를 클릭해 실행해주세요! 그럼 키체인에 인증서가 추가됩니다.

 

이렇게 해서 인증서 발급을 과정을 마쳤습니다. 생각보다 어렵지 않습니다.
자 그럼, 이제부터가 중요한데요! 서버에 직접 설치할 인증서를 만들어 보겠습니다.

 

APNS 서버인증서 만들기

서버인증서를 만드는 작업을 하기전에 우선 키체인을 열어 방금 설치한 Apple Development(or Production) iOS Push Services: kr.co.godo.godo 인증서를 찾아서 Export(내보내기)를 해서 .p12 파일로 만들어줘야 합니다.
다음의 그림을 보면서 따라하시면 되겠습니다. 그림과 같이 인증서 옆에 화살표 아이콘이 있고 그걸 누르면 개인키가 나타나오니 참고하시면서 작업하시기 바랍니다.



저는 개발과 출시용 Push Service 인증서를 둘다 설치해서 2개가 나타나며 원하는 것을 선택해서 만들어주시면 됩니다.



우선 그림과 같이 마우스 오른쪽을 눌러 보내기 메뉴를 눌러주세요!



그럼 이러한 창이 뜰 것이고 별도저장(Save as)에 cert라고 넣어주세요!



저장을 누르면 패스워드를 넣으라는 창이 나타납니다. 이곳에 원하는 패스워드를 넣고 승인을 눌러주세요!



다음은 개인키입니다. 그림과 같이 열쇠모양의 개인키를 선택해 오른쪽 마우스 눌러 보내기를 클릭합니다.



별도저장(Save as)에 key라고 입력하고 저장을 눌러줍니다.



외우기 쉽도록 cert에서 만든 패스워드를 동일하게 넣어주세요!

 

이작업을 하시면 바탕화면(여러분이 지정한 경로)에 cert.p12와 key.p12 파일들이 만들어집니다.
이제부터 중요합니다. 인증서 형식을 변환하기 위한 작업으로 Terminal에서 작업을 할 것 입니다.
딱 4가지 명령만 실행하시면 됩니다.  ———- 이걸로 표시된 부분은 결과값을 보여주려고 나타낸 것이니 터미널에서는 입력하지 말아주세요!

다음과 같이 입력하고 엔터를 치면 비밀번호를 물어봅니다.
이 비밀번호는 아까 cert.p12 만들때 작성하신 패스워드를 넣어주시면 됩니다.
이렇게 하고 나면 해당 경로에 cert.pem 이라는 파일이 생깁니다.

 

위 코드는 key.p12를 key.pem으로 만들어주는 작업입니다.
바로 윗부분에 cert.pem 만드는 작업과 동일하지만 마지막에 패스워드를 생성하는 작업을 해주셔야 합니다.

 

위에서 만들어진 key.pem을 가지고 key.unencrypted.pem을 만드는 코드입니다.
하단의 출력결과에도 써있다 시피 윗단계에서 새로 생성한 패스워드를 입력하시면 됩니다.
이제 마지막 하나가 남았습니다.

 

마지막부분에 apns.pem이라고 적어놓은 부분은 여러분이 만들고 싶은 이름으로 변경해서 작성해주시면 됩니다.
이렇게 마무리 하시면 작업하신 해당 경로에 아래리스트와 같이 6개의 파일들이 생성되어 있을 것이니 꼭 확인해주시기 바랍니다.

  • cert.p12
  • key.p12
  • cert.pem
  • key.pem
  • key.unencrypted.pem
  • apns.pem

 

윗 단계를 하나의 이미지로 보면 다음과 같습니다.



총 6개의 파일이 생성되며 터미널 안에 보시면 타이핑한 내역이 그대로 있습니다.

 

이제 모든 것이 끝났습니다. 결국 apns.pem 이 파일 하나 만들고자 이짓을 했던 것 입니다.
푸시서버로 구성할 곳으로 apns.pem 파일을 업로드 해주시면 됩니다.
위치는 아무곳에나 하셔도 상관없지만 경로만 알면 다운로드가 가능한 웹루트는 피하시기 바랍니다.

이렇게 만들어진 인증서를 이용해 SSL Connect의 연결을 유지한 상태에서 Push메시지를 발송하면 됩니다.
개발에 관련된 부분은 다음 스텝에서 안내해드리겠습니다.

 

http://qnibus.com/blog/how-to-make-certification-for-apns/

반응형

'연구개발 > IOS' 카테고리의 다른 글

ios  (0) 2017.07.18
java apns용 인증서(.p12)생성법  (0) 2016.07.14
반응형

USE [master]

GO

CREATE LOGIN [GulsAdmin] WITH PASSWORD=N'!@#dpaqhTld04', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

GO

USE [Game]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Game]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [GameInfo]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [GameInfo]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Guild]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Guild]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [GuildInfo]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [GuildInfo]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Log]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Log]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Login]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Login]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [LoginInfo]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [LoginInfo]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Rank]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Rank]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'


USE [Tool]

GO

CREATE USER [GulsAdmin] FOR LOGIN [GulsAdmin]

GO

USE [Tool]

GO

EXEC sp_addrolemember N'db_owner', N'GulsAdmin'





USE [master]

GO

CREATE LOGIN [GulsWeb] WITH PASSWORD=N'qordjqvlftn$#@!', DEFAULT_DATABASE=[Guild], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

GO

USE [Game]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Game]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [GameInfo]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [GameInfo]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Guild]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Guild]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [GuildInfo]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [GuildInfo]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Log]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Log]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Login]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Login]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [LoginInfo]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [LoginInfo]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Rank]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Rank]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;


USE [Tool]

GO

CREATE USER [GulsWeb] FOR LOGIN [GulsWeb] WITH DEFAULT_SCHEMA = DBO;

GO

USE [Tool]

GO

GRANT EXECUTE TO GulsWeb;

GRANT SELECT TO GulsWeb;

반응형

'연구개발 > DBA' 카테고리의 다른 글

select 처리순서  (0) 2017.08.02
Microsoft Windows DistributedCOM 오류 로그  (0) 2016.03.23
tempdb 분리  (0) 2016.03.15
성능 모니터  (0) 2015.12.16
성능 관련 기초 이론  (0) 2015.11.04
반응형

USE master

GO

--1. tempdb의논리파일이름확인

SELECT name, physical_name, state_desc

FROM sys.master_files

WHERE database_id = DB_ID(N'tempdb')

GO


--2. ALTER DATABASE 사용하여파일위치변경

ALTER DATABASE tempdb

MODIFY FILE(NAME = tempdev, FILENAME = 'C:\TempDB\tempdb.mdf')

ALTER DATABASE tempdb

MODIFY FILE(NAME = templog, FILENAME = 'C:\TempDB\templog.ldf')

GO


--3. Processor만큼파일분할및사이즈변경및파일사이즈, 증가옵션설정

ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev', SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev2', FILENAME = N'C:\TempDB\tempdev2.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev3', FILENAME = N'C:\TempDB\tempdev3.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev4', FILENAME = N'C:\TempDB\tempdev4.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev5', FILENAME = N'C:\TempDB\tempdev5.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev6', FILENAME = N'C:\TempDB\tempdev6.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev7', FILENAME = N'C:\TempDB\tempdev7.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev8', FILENAME = N'C:\TempDB\tempdev8.ndf' , SIZE = 20480KB , FILEGROWTH = 10240KB )

GO

ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'templog', SIZE = 163840KB )

GO

--4.SQL Server 서비스 재시작.

 


--5.SQL Server 서비스가 시작된것을확인후 정사 이동 확인 

SELECT name, physical_name, state_desc 

FROM sys.master_files

WHERE database_id = DB_ID(N'tempdb')

GO



반응형

'연구개발 > DBA' 카테고리의 다른 글

Microsoft Windows DistributedCOM 오류 로그  (0) 2016.03.23
mssql 권한설정  (0) 2016.03.16
성능 모니터  (0) 2015.12.16
성능 관련 기초 이론  (0) 2015.11.04
리소스 잠금 및 리소스 확인  (0) 2015.09.07
반응형

ubuntu 방화벽 설정


ufw enable 활성화

ufw disable 비활성화


ufw status 상태확인


ufw allow 22/tcp 허용


ufw deny 80/tcp 거부


ufw status verbose 확인

반응형

'연구개발 > Linux' 카테고리의 다른 글

VirtualEnv Wrapper를 이용한 파이썬 가상환경 설정  (0) 2017.04.05
centos fdisk  (0) 2017.03.30
zabbix mail setting  (0) 2016.03.03
swap  (0) 2016.03.02
zabbix 3.0 설치  (0) 2016.02.23
반응형


http://www.tecmint.com/configure-zabbix-to-send-email-alerts-to-gmail/


This tutorial will briefly discuss you on how to setup Zabbix server to send mail reports to a Gmailaddress by using SSMTP program, without the need to install and configure any local MTA daemon, such as PostfixExim etc.

Requirements

  1. Install Zabbix Monitoring Server

Step 1: Install and Configure SSMTP

1. SSMTP is a small software, which does not fulfill any of the functionality of a mail server, but only delivers emails from a local machine to an external email address on a mailhub.

To install SSMTP program alongside with mailutils package that you will use it to send mails, issue the following command on your RedHat and Debian like server:

# yum install ssmtp mailx                    [On RHEL/CentOS 7] 
$ sudo apt-get install ssmtp mailutils       [On Debian 8]

2. After the packages are installed on the system, configure SSMTP program to send local emails to your Gmail account by opening the main configuration file for editing with your favorite text editor and root privileges and use the following parameter settings:

# vi /etc/ssmtp/ssmtp.conf                   [On RHEL/CentOS 7]
$ sudo nano /etc/ssmtp/ssmtp.conf            [On Debian 8]

SSMTP settings for GMAIL account

root=gmail-username@gmail.com
mailhub=smtp.gmail.com:587
rewriteDomain=your_local_domain
hostname=your_local_FQDN
UseTLS=Yes
UseSTARTTLS=Yes
AuthUser=Gmail_username
AuthPass=Gmail_password
FromLineOverride=YES
Configure Zabbix Email Alerts

Configure Zabbix Email Alerts

Step 2: Gmail Tests for Zabbix Email Alerts

3. On the next step it’s time to send a local generated email to Gmail account by issuing the below command.

# echo "Body test email from 'hostname -f' "| mail -s "subject here" gmail_user@gmail.com
Gmail Tests

Gmail Tests

4. Normally, Gmail prevents different types of authentications to their servers from your account, so, in case you get the error “mail: cannot send message: Process exited with non-zero status”, then login to your Gmail account from browser and navigate to the following linkhttps://www.google.com/settings/security/lesssecureapps in order to allow access for less secure apps as in the following screen.

Manage Secure Gmail Apps

Manage Secure Gmail Apps

5. After you have turned on Less Secure Apps feature on your Gmail account, run the above mail command again and verify your Inbox after a few seconds to check if the locally generated email has been successfully delivered – you should normally see the email has incoming from Gmail.

Mail Delivery Confirm

Mail Delivery Confirm

Step 3: Configure Zabbix Sendmail Script

6. Further, based on the $(which mail) command create the following Bash script to Zabbixalertscripts directory with the following content and give it execute permissions:

# vi /usr/local/share/zabbix/alertscripts/zabbix-sendmail            [On RHEL/CentOS 7]
$ sudo nano /usr/local/share/zabbix/alertscripts/zabbix-sendmail     [On Debian 8]

Script content:

#!/bin/bash
echo "$3" | /usr/bin/mail -s "$2" $1
Configure Sendmail Zabbix

Configure Sendmail Zabbix

Next, set the execute permission on the script file.

# chmod +x /usr/local/share/zabbix/alertscripts/zabbix-sendmail

7. Next, as previously, test the script functionality by sending a local email to Gmail account. The way to run the script with positional parameters is explained above:

# /usr/local/share/zabbix/alertscripts/zabbix-sendmail gmail_username@gmail.com "Subject here" "Body of the message here"
Send Mail to Gmail Account from Linux

Send Mail to Gmail Account

Afterwards, verify Gmail Inbox and check if the new local message has arrived.

Verify Mail Delivery

Verify Mail Delivery

Step 4: Configure Zabbix to Send Alerts to Gmail

8. If the tests so far were successful, then you can move to next step and setup Zabbix to send generated email alerts to Gmail. First, login to Zabbix web interface and navigate to the following menu: Administration -> Media types -> Create media type.

Zabbix Administration

Zabbix Administration

9. On the next screen enter an arbitrary Name to uniquely identify for the script in the Zabbixconfigurations (in this example Send-Email-Script is used), choose Script as Type from the list and enter the name of the Bash script created earlier (zabbix-sendmail used in this tutorial) to send email from command line (don’t use the path for the script, only the script name). When you’re done, hit the Add button below to reflect changes.

Create Zabbix Email Alerts

Create Zabbix Email Alerts

10. Further, let’s configure an email address to which you will send Zabbix alerts. Go to Profile ->Media -> Add and a new pop-up window should appear.

Here, select the name of the script that you have earlier named (in this example Send-Email-Scriptis used) for Type, enter the Gmail address to which you will send emails, choose the time period (week, hours) when email reports should be active for sending, choose the severity of the messages that you want to receive on your Gmail address, select Enabled as Status and hit the Addbutton to add the media. Finally hit the Update button to apply configuration.

Configure Zabbix Mail Address

Configure Zabbix Mail Address

Zabbix Update Configuration

Zabbix Update Configuration

11. On the next step, enable the defult zabbix alerts by navigating to Configuration -> Actions, select as the Event Source – > Triggers from the right menu and hit on Disabled Status in order to enable it. Repeat the step for Event Source – > Internal or other custom created Actions and you’re done.

Enable Default Zabbix Mail Alert

Enable Default Zabbix Mail Alert

Zabbix Enabled Actions

Zabbix Enabled Actions

Wait for a while for Zabbix to start gather information and generate some reports, then verify yourGmail Inbox and you should see some Zabbix alerts submitted so far.

Zabbix Monitoring Mail Alerts

Zabbix Monitoring Mail Alerts

That’s all! Although this guide was mainly focused on sending Zabbix alerts to a Gmail account using Gmail SMTP server as a mailhub, using the same configuration you can, also, push zabbix email alerts further to other valid internet email accounts by relying on Gmail to route your emails through SMTP servers.

반응형

'연구개발 > Linux' 카테고리의 다른 글

centos fdisk  (0) 2017.03.30
ubuntu 방화벽  (0) 2016.03.14
swap  (0) 2016.03.02
zabbix 3.0 설치  (0) 2016.02.23
zabbix 설치  (0) 2015.11.17
반응형

http://banasun.tistory.com/91

composer를 update 중에 composer가 뻗어버리는 일이 발생하였습니다. 개발용으로 Virtual server를 이용하고 있는데, 아무래도 메모리가 적어서 그런 것 같습니다.

구글링을 해보니, swap 설정을 해주어야 한다고 하니 오늘은 이 척박한(!) 서버에 스왑으로 일단 돌아가게는 해놔야 하겠습니다.


1. 일단 free 명령으로 swap 파일이 있는지 확인부터 해줍니다. :

sudo free -m


위와 같이 swap이 0 0 이 나옵니다. 


2. 그러면 일단, 스왑 파일을 생성하겠습니다. 아래와 같이 해주면 4기가 크기의 파일이 생성됩니다:

sudo fallocate -4G /swapfile

이렇게 해주면 /swapfile 이라는 4G짜리 파일이 만들어지겠지요.


3. 이제 이 파일을 swap으로 이용하도록 설정하겠습니다. 그 전에 안전을 위해서 생성한 파일의 permission을 root만 읽고 쓸 수 있게 변경하겠습니다:

sudo chmod 600 /swapfile


4. 이제 이 파일을 swap 파일로 인식하게 해주면 되겠습니다.

sudo mkswap /swapfile

이러면 아래와 같이 반응이 옵니다.




5. 이제 swapon으로 스왑 파일을 활성화시키면 됩니다.

sudo swapon /swapfile

-s 옵션을 주면 이제 스왑이 실행되고 있는지 확인 가능합니다.

sudo swapon -s


vi /etc/fstab

/swapfile    none    swap    defaults    0 0

출처: http://boricha.springnote.com/pages/7091447

https://help.ubuntu.com/community/SwapFaq

영어 잘하는 사람은 링크를 보는게 훨씬 낫다.

 

  • swap 필요한 이유
  • Memory consuming programs. 많은 메모리를 필요로 하는 프로그램
  • Hibernation (suspend-to-disk). 절전모드 진입시 메모리(RAM)를 디스크로 저장.
  • Unforeseeable Circumstances. 예측하지 못한 이벤트발생시 문제를 해결하거나 작업을 저장할 수 있는 시간 확보.
  • Optimizing memory usage. 빠른 응답속도를 위한 cached memory. 그 확장을 더 효율적으로 하기 위함.. (???)
  • Optimizing Swap performance. 시스템영역과 스왑영역을 같은 디스크에 두면 성능에 좋지않다.. 이건 스왑이 필요한 이유가 아닌데...?

 

  • swap 용량을 얼마나 잡아야 하는가?
  • 최소한, 물리적으로 장작된 RAM 용량과 같을 것을 매우 권장(highly recommended) 한다.
  • 물리적으로 장착된 RAM 용량의 두배정도를 걍 권장(Also, it's recommended) 한다.
    옛날 메모리가 넘 비쌀때... 그런 권장사항이 생겼단다
  • 근데 예를 든 경우를 보니까 2G RAM 에 30G disk 인 경우 1G 쯤 잡아도 되나보다.
    그러니까..... 디스크용량이 메모리에 비해 너무 적은 경우에는 별수 없다..쯤 될까...아씨..;;;
  • 그냥.. 메모리 2G 쯤 되면 자기 메모리 만큼만 잡으면 되지 않을까 싶다. 아, 이건 만고 내생각.

 

  • 어떻게 swap 을 추가할 수 있나?
    - 대부분, OS설치시 스왑파티션을 만들지만 이미 설치된 시스템에서 추가하는 경우를 말한다.
    - 적용된 후에는 free 명령으로 확인 가능하다.
  1. Creating a file the size you want.

    • sudo dd if=/dev/zero of=/mnt/512Mb.swap bs=1M count=512

  2. Formatting that file to create a swapping device.

    • sudo mkswap /mnt/512Mb.swap

  3. Adding the swap to the running system.

    • sudo swapon /mnt/512Mb.swap

  4. Making the change permanent.

    • gksudo gedit /etc/fstab

    • Add this line at the end of the file:
      /mnt/512Mb.swap  none  swap  sw  0 0

 

  • swappiness 변경 방법
    - 커널이 프로세스를 메모리영역에서 스왑영역으로 이동시키는 정도를 설정하는 파라미터값.
    - 0 에서 100 사이 (우분투 기본값 60). 0 에 가까울 수록 사용정도가 적어진다.
  1. 현재 값 체크 (To check the swappiness value)

    • cat /proc/sys/vm/swappiness

  2. 현재 시스템에 변경값 바로 적용 - 재부팅시 반영안됨.  (To change the swappiness value A temporary change (lost on reboot) with a swappiness value of 10 can be made with)

    • sudo sysctl vm.swappiness=10

  3. 부팅시마다 적용하기 위해 설정파일 수정 (To make a change permanent, edit the configuration file with your favorite editor:)

    • gksudo gedit /etc/sysctl.conf

  4. vm.swappiness 항목을 찾아서 수정하거나, 없다면 추가한다. (Search for vm.swappiness and change its value as desired. If vm.swappiness does not exist, add it to the end of the file like so:)

    • vm.swappiness=10

  5. 저장 후 재부팅. (Save the file and reboot.)





Ubuntu swap를 사용하지 않는 방법입니다.
저는 메모리가 많이 남아서 swap를 사용안하다가 최대 절전모드를 사용하지 않기에 swap를 제거하려고 합니다.
최대 절전모드를 사용할려면 swap 이 꼭 필요합니다. 용량은 메모리 크기만큼만 잡아주셔도 문제가 없습니다.

명령어에서 아래의 명령어를 입력합니다. swapon 명령어를 통해 swap 를 다시 사용 할 수도 있습니다.

명령어는 sudo swapoff -a 를 해주면 됩니다.
그외 명령은 아래 사진을 참고하시면 됩니다.

디스크를 로드하지 않아야 완전히 사용하지 않는 것이라고 생각됩니다. 그리고 그 swap 공간을 다른 디스크로 활용도 가능하구요. 

터미널 명령어에
  sudo vi /etc/fstab 을 입력하시거나 vi 편집기가 익숙하지 않으시다면 sudo gedit /etc/fstab 을 사용하셔도 됩니다.
 그리고 아래 화면에서 # swap was on ........ 의 내용 아래에 UUID 앞에 #을 붙여넣으시면 됩니다.

위의 명령어로 swap 사용을 하지 않고, auto mount도 해제됩니다. 이제 이 swap를 가지고 다른 백업폴더나 리눅스 디스크로 사용하지면 됩니다.

http://thdev.net/127



반응형

'연구개발 > Linux' 카테고리의 다른 글

ubuntu 방화벽  (0) 2016.03.14
zabbix mail setting  (0) 2016.03.03
zabbix 3.0 설치  (0) 2016.02.23
zabbix 설치  (0) 2015.11.17
리눅스 하드디스크 추가하기  (0) 2015.04.09
반응형


https://www.fl-ops.com/mori-dojo/archives/92





Zabbix 코라 보 기획 「제 2 탄 Redmine과 함께하자 !! ~ Part1 ~ "

https://www.fl-ops.com/mori-dojo/archives/62




 "제목"는 "이벤트 ID"와 "호스트 이름"을 등록합니다. 

 "내용"은 "트리거의 이름"을 등록합니다.










Alexei Vladishev - Opening Speech

http://www.slideshare.net/Zabbix/alexei-vladishev-opening-speech



출처 : http://blog.naver.com/junix/220610357399


반응형

'연구개발 > Linux' 카테고리의 다른 글

zabbix mail setting  (0) 2016.03.03
swap  (0) 2016.03.02
zabbix 설치  (0) 2015.11.17
리눅스 하드디스크 추가하기  (0) 2015.04.09
CentOS 7.0에서 네트워크 설정  (0) 2015.03.19
반응형

http://stonerain.tistory.com/118



* aws 에 서로다른 2개의 계정을 가지고 있고,

a 계정의 instance 를 복제해서, b 계정으로 가져오고 싶은 경우


* b 계정에 로그인한다.

계정정보 > Security Credentials > Account Identifiers 에 들어가서

AWS Account ID 를 알아낸다

(0000-0000-0000-0000 이런 형태임)


* a 계정에 로그인한다.


INSTANCES > Instances > Actions > Image > Create Image 한다.

IMAGES > AMIs 에 들어가서

이미지가 완성될때까지 기다린다.


* 만약 a계정과 b계정의 리전이 다르다면

a 계정에서 만들어진 이미지 Actions > Copy AMI 하여

b 계정의 리전과 동일한 곳으로 복사한다.


* a 계정에서 만들어진 이미지 Actions > Modify Image Permissions

private으로 놓고, AWS Account Number 에 b계정의 AWS Account ID 를 넣는다

(아까 b계정에서 알아낸 id)

Add create volume permissions... 에 체크한다.


* 잠시후, b계정으로 들어가서

IMAGES > AMIs > Private images 에 보면

a계정에서 공유해준 이미지가 보인다.

Actions > Launch 해서, 새로운 instance를 만든다.

(Volume 도 자동으로 만들어 진다)


* ELASTIC BLOCK STORE > Volumes > Actions > Create Snapshot 한다.

* ELASTIC BLOCK STORE > Snapshots > Actions > Create Image 한다.

* 끝

* a 계정으로 들어가서, 아까 공유한 것을 지워도 된다.

반응형

+ Recent posts

반응형