인공 신경망은 인간의 뇌가 패턴을 인식하는 방식을 모사한 알고리즘 이다. 인공 신경망은 시각, 청각 입력 데이터를 퍼셉ㅌ트론이나 분류 , 군집을 이요하여 해석하는데, 이렇게 해석한 결과를 이용하여 이미지, 소리,문자, 시계열 데이터에서 특정 패턴을 인식할 수 있습니다.


인공 신경망을 이용하면 각종 분류(Classification)및 군집화(Clustering)가 가능합니다. 지금부터 자세히 살펴 보겠지만, 단순하게 표현하면 ㅂㄴ류나 군집화를 원하는데이터 위에 여러가지 층(Layer)을 얹어서 원하는 작업을 하게됩니다. 각 층에서 라벨링이 되어있지 않은 데이터를 서로 비교하여 유사도를 구해주거나, 라벨링이 되어있는 데이터를 기반으로 분류기를 학습하여 자동으로 데이터를 분류하도록 할 수 있습니다. ( 구체적으로 이야기 하자면, 인공신뎡망으로 특징을 추출하고 그 특징을 다시 다른기계학습 알고리즘의 입력으로 사용하여 분류나 군집화를 할 수 있습니다. 즉 심층 신경망은 전체 기계학습 시스템의 구성요소로 생각하면 됩니다. 여기서 전체 시스템이란 강화하습, 분류 및 회귀를 말합니다.)


심층 신경망을 이용해보고 싶다면 우선 어떤 문제를 해결하고 싶은지 생각해보십시오. 즉 어떤 분류를 하고싶은지, 그리고 내가 어떤 정보를 취할 수 잇는지를 정해야 합니다. 예를들면 이메일 데이터를 과 으로 분류한다던지 고객을 과, 과로 분류할 수 잇씁니다. 이렇게 어떤 분류를 원하는 지 지정한뒤 분류에 필요한 데이터가 있는지생각해 보아야 합니다. 예를들어 이미과으로 라벨링된 이메일 데이터가 있는지 없다면 내가 직접 데이터셋을 만들 수 있는지를 고민해야 합니다.

또, 이 데이터로 원하는 라벨링이 과연 가능한 것인지도 생각해봐야 합니다.


예를들어, 암 고위험군에 속하는 사람들을 분류하는 알고리즘을 만들기위해서는 우선 암환자의 아닌 사람의 데이터가 필요합니다.

데이터는 사람들의 나이,흡연습관 같은 쉬운특징이나 일일활동량, 온라인 활동 로그같은 간접적인 특징등 무엇이든 가능합니다. 그러나 사람들의 건강과 관련된 개인정보가 전혀없는 상태라면 아무리 좋은 알고리즘이 있어도 암을 예측하니느 어려울것이다.


필요한 데이터가 잇따면 이제 인공신경망이 사람들의 암발병률을 예측허도록 학습을 할 수 있습니다.

즉, 암에 걸린/걸리지 않은 사람들이 각각 어떤 행동 패턴을 갖는지, 어떤 것을 기준으로 어떻게 분류하면 된는지를 신경망이 학습하도록 하는것입니다. 가지고 있는 데이터로 학습이 잘되었다면 이젠 사람들의 행동패턴을 이용해 그 사람들이 암에 걸릴 확률을 예상할 수 있습니다.


심층 신경망은 신경망 알고리즘 중에서 여러개의 층으로 이루어진신경망을 의미합니다. 한층은 여러개의 노드로 이루어져있습니다. 노드에서는 실제로 연산이 일어나는데, 이연산과정은 인간의 신경망을 구성하는 뉴런에서 일어나는 과정을 모사하도록 설계되어있습니다. 노드는 일정 크기 이상의 자그 받으면 일어나도록 되어있는데 그 반응의 크기는 입력값과 노드의 계수(또는 가중치(weight) 를 곱한값와 비례합니다. 일반적으로 노드는 여러개의 입력을 받으면 입력의 개수만큼 계수를 가지고 있습니다. 따라서 이계수를 조절함으로써 여러입력에 다른 가중치를 부여할 수 있습니다. 최종적으로 곱한값들은 전부 더해지고 그하바은 활성함수(activation function)의 입력으로 들어가게 됩니다. 활성 함수의 결과가 노드의 출력에 해당하며 이 출력값이 궁극적으로 분류나 회귀분석에 쓰이게 됩니다.

노드에서 일어나는 계산과정이 아래 다이어그램에 정리되어있습니다. 


Alt text


층은 여러개의 노드로 이루어져 잇으며 입력갑셍 따라 각노드의 활성화/ 비활성화 여부가 결정됩니다. 입력데이터는 첫번째 층의 입력이 되며 그이후엔 각층의 출력이 다시 다음층의 입력이 됩니다.

Alt text


이렇게 심층 신경망에서는 층마다 다른 층위의 특징이 학습이 됩니다. 낮은 층위의 특징은 단순하고 구체적이며 (예:이미지를 이루는 수평선, 수직선, 대각선) 높은 층위의 특징은 더욱 복잡하고 추상적입니다 (예:사람 모양, 자동차 모양, 고양이 모양, 얼굴 모양..). 이런 추상화 과정을 통해 심층 신경망이 아주 큰, 고차원의 데이터를 이해하며 이 과정은 수 억, 수 십억 개의 계수가 관여합니다. (이 과정에서 비선형함수를 사용합니다.)

또한 심층 신경망은 데이터를 이용해 데이터의 잠재적인 구조(latent structures)를 파악할 수 있습니다. 즉, 사진, 글, 비디오, 음성, 음악의 잠재적인 구조(어떤 물체가 사진에 있는지, 글의 내용과 감정이 무엇인지, 음성의 내용과 감정이 무엇인지 등)를 파악할 수 있습니다. 이를 통해 데이터가 라벨링되어있지 않아도 데이터간의 유사성을 효과적으로 파악할 수 있으며, 결과적으로 심층 신경망은 데이터 군집화에 아주 좋은 성능을 발휘합니다.

예를 들어 신경망을 이용해 대량의 사진 데이터를 받아서 비슷한 사진끼리 모아줄 수 있습니다. 구글 포토나 각종 사진 관리 앱의 스마트 사진 앨범 기능은 이런 기능을 이용한 것 입니다.

이런 군집화 기술은 다른 데이터에도 적용할 수 있습니다. 예를 들어 이메일에 이 기술을 적용하면 이메일의 내용에 따라 불만/항의 메일, 감사 메일, 문의 메일, 전혀 관계없는 스팸 메일 등 메일의 내용에 따른 분류를 할 수 있습니다. 이 분류 결과를 이용하면 고객관리에 큰 도움이 될 것입니다. 같은 방법을 전화 통화 녹음 데이터에도 적용할 수 있습니다. 사용자 로그같은 시계열 데이터를 사용하면 비정상 행위 탐지가 가능합니다. 스마트폰의 위치 데이터로는 사용자의 건강 상태 진단이 가능합니다.

심층 신경망이 일반적인 기계 학습과 다른 점은 특징 추출(feature extraction)이 자동적으로 이루어지는 점 입니다. 기존에는 효과적인 특징을 추출하기 위해 관련 분야 전문가가 오랜 시간동안 직접 특징을 추출하는 수식이나 방법을 고안해야 했습니다. 이 방법은 개발, 평가 및 보완에 많은 시간이 걸립니다. 심층 신경망은 이런 과정을 컴퓨터가 대신 하도록 알고리즘을 짠 것으로, 사람에 비해 훨씬 빠르고 효과적으로 수행해도록 학습시켜줍니다.

라벨링이 되어있지 않은 데이터를 학습하는 경우에 신경망은 데이터의 특징을 자동적으로 추출합니다. 이 자동 추출은 여러 가지 방법이 있는데, 보통 이 과정은 신경망을 통과시켰을 때의 출력이 입력과 같아지도록 학습합니다. 결과적으로 이 신경망은 입력을 효율적으로 인코딩하고 다시 이를 디코딩하는 - 간단하게 말하면 재구성(reconstruct)하는 - 작업을 합니다. RBM(Restricted Boltzmann machines)의 학습 과정도 이런 구조로 이루어져있습니다.


예제 인공신경망과 역전파(back prop)

인공신경망 학습의 목적은 출력의 오류를 최소화 하는것입니다. 운동장 주변의 트랙을 뛰는 달리기 경기를 생가해보자. 트랙을 여러ㅂ퀴 달리다보면 같은지점을 여러번 지나게 됩니다. 신경망 학습과정도 비슷하다. 우선 학습이 시작되면 뉴럴넷은  모든 계수를 초기화 합니다. 그리고 반복적으로 데이터를 보여주어서 학습을 합니다. 만일 학습이 잘되었다면 계수는 적절한 값으로 업데이트가 되어있을것이고, 이 인공신경망으로 각종 분류와 예측이 가능합니다.

학습과정 내부에선 같은 원리의 계수 업데이트가 반복적으로 일어납니다. 계수 업데잍의 원리는 우선 계수를 추정하고 그 계수를 사용했을때 발생하는 에러를 측정한 뒤 그에러에 기반해서 계수를 약간씩 업데이트 하는것입니다.

우리는 신경망의 여러계수를 합쳐서 모델이라고 부릅니다. 모델은 초기화 된 상태일 수도 있고, 학습이 완료된 상태일 수 도 있습니다. 실제로 데이터가 생성되는 원리는 알 수 없기 때문에 이것을 모사한 말그대로 모델인 셈입니다. 초기화된 모델은 의미있는 작업을 하지 못하지만, 학습이 진행될수록 모델은 임의의 값이 아닌, 실제와 유사한 결과를 출력하게 됩니다.

이는 인공 신경망이 데이터를 보기전까지는 아무것도 모르는상태이기 때문입니다. 계수를 임의의 값으로 초기화하는 이유도 마찬가지 입니다. 그리고 데이터를 읽어가면서 계수를 조금씩 올바른 방향을 업데이트 합니다.

이제 정말 단순하게 이과정을 식으로 표현하겠습니다.

입력값이 신경망에 들어오면 현재상태의 계수를 이용해 결과를 출력합니다.

그리고 이렇게 추정한 값을 실제정답과 비교합니다.

정답과 추정하는 차이가 바로 오차입니다. differ = (f(x) - y)^2 신경망은 오차를 측정하고 이오차를 반영해서 예수를 보정합니다. 이 아주 간략한 관계식에 인공신경망의 가장 중요한 내용이있습니다. 입력을 받아 출력을 내고, 오차를 계산한뒤 이를 반영해 계수를 업데이트 하는것입니다. 이 과정을 계속 반복하는 것이 학습과정 입니다.

이제 단계별로 자세히 살펴봅시다. 우선 입력을 받아서 출력을 추정하는 과정을 보겠습니다.


다중 회귀분석

인공신경망은 사람의 신경망을 모사한 측면이 있습니다. 하지만 결과적으로 인공신경망은 숫자와 수식으로이루어진 머신러닝 알고리즘 입니다. 사실 원리자체는 매우 간단해서 선형 회귀를 아는사람이라면 누구나 인공신경망을 이해할 수 잇ㅆ브니다. 선형회귀를 간단한 수식으로 표현하면 아래와 같습니다.

Y = b*X + a 

예를들면 X는 일일 운동량이고 Y는 발병률 , 또는 X는 비료 사용량이고 Y는 수확량이 될 수 있씁니다. Yrk ㅌ에 영향받는 모든 경우 이식으로 모델링 할 수 있습니다.

이제 회귀 분석식을 다중 회귀 분석으로 바꿔봅시다. 다중 회귀 분석은 회귀분석과 유사하지만 입력 변수가 여러개 입니다. 즉, 아래와 같은 식으로 표현가능합니다.

수확량을 예측경우라면 이 비료 사용량은 강루량은 일조량을 가정할 수있습니다. 이 세가지 변수는 모두 수확량에영향을 \끼칩니다.

사실 인공신경망의 모든 노드마다 별도의 다중 회귀분석이 이루어 집니다. 층의 출력은다음단계 층의 ㅇ입력이 된다고 이야기했었는데, 이 입력값이 바로위의 에 해당합니다. 그리고 노드가 갖고 있는 계수는 ...입니다. 다시말해 계수는 입력값을 얼마나 반영할 것인지를 정하는 가중치입니다. 그리고 신경망의 학습은 각 층의 입력 데이터중 어떤 값을 얼마나 반영할 것인지를정하는 과정입니다.

이렇게 계산된 추력은 나가진까지 비선형 함수를 한번 통과합니다. 여기에서 비선형 함수를 사용하는 이유는 여러가지 있습니다. 일반적으로, 출력의 범위를 제한하는 비선형 함수를 써서 노드의 출력값이 너무 크게 발산하지 않게합니다.( 이것보다 더중요한 목적은 함수의 비선형성이 필요하기때문입니다. 미분시 0으로 날아가버렷)

이렇게 회귀 분석과 비선형함수를 조합하면 노드는 켜고 끌수 잇는 스위치같은 역할을 합니다. (인간의 뉴런도 마찬가지입니다.) 이 스위치는 입력신호를 얼마나 출력에 전달하지를 정하고, 수많은 스위치의 조합이 최종 출력단에서 분류작업을 합니다.

전체 최종 출력단의 출력을 1/0제한하면 (binary decision)특정라벨에 대한 분류가 됩니다. 반면 로지스틱 회귀분석을 출력단에 붙이면 출력값이 0과 1사이의 연속적인 값이 나올수 있게됩니다.

각노드에서 비선형함수는 S자 모양의 비선형을 갖는 경우가 대부분입니다. Sigmoid 함수나 하이퍼 탄젠셜 함수가 여기에 해당합니다. 그리고 이 비선형 함수의 출력이 다음층의 입력값이 됩니다.

Gradient Descent

모델의 학습과정에서는 각 계수의값이 반복적으로 업데이트 됩니다. 이 업데이트 방법중 가장 널리 쓰이는 방법은"gradient descent" (경사 하강법)입니다.

Gradient는 경사 혹은 기울기를 의미합니다. x-y평면에서 기울기는 두변수의 관계를 설명해줍니다. x의 변화량에 따른 y의 변화량 - 예를 들어 시간에 따른 통장잔고의 변화량을 함수의 기울기로 설명할 수 있게됩니다. 인공신경망에서 우리는 신경망의 오차와 각 계수의 관심이 잇습니다. 즉, 각 계수의 값을 증가 혹은 감소시켰을때 신경망의 오차가 어떻게 변하는지 그 관계에 주목합니다.

조금 더 자세히 들여다봅시다. 계수를 어떤값으로 결정하면 전체에러가 가장 작앚질까요?

어떻게 노드의 계수를 설정해야 입력데이터에서 의미있는 정보를 추출할 수 있을까요?어떻게 해야 사진의 물체가 사람인지 자동차인지 고양이인지 알아낼수 있을까요?

인공신경망의 학습과정은 수많은 계수를 보정해나가는 과정입니다. 이계수는 오차를 ㅈㄹ이는 방향으로 보정되어야 하는 데이터에서 의미있는 추출 할 수 잇씁니다. 그리고 오차와 계수의 관계는 편미분으로 정의 할 수 있습니다. dE.dw가 계수의 변화량의 따른 오차의 변화량, 즉 우리에게 중요한 그 기울기에 해당합니다.

심층 신경망은 여러층으로 이루어져 있기 때문에 각 노드의 계수는 신호에 곱해지는 여러계수중 하나입니다. 따라서 이 관계를 미적분학의 Chain Rule을 사용해 설명할수 있습니다. 이 를 이용하면 신경망의 출력이 여러층과 갖는 관계를 구할수 잇씁니다. 그리고 결과적 각층의 계수와 최오 출력 과의 관계가 나옵니다.

Alt text

Alt text

즉 오차와 계수가 활성함수를 통해 정해지는 경우 최종적으로 계수값의 변화가 오차를 증가할지 혹은 감소할지를 구할수 잇씁니다. 반대로 활성함수를 바꾸는것이 어떤영향을 끼칠지도 구할수 잇씁니다.

이것이 심층신경망 학습 핵심입니다. 모델의 학습은 모델의 계수를 업데이트해서 오차를 줄이는 과정입니다.


로지스틱 회귀 함수

심층 신경망의 여러 층 중 마지막 층, 즉 출력층은 다른 층과 조금 다릅니다. 가장 흔한 작업인 분류(classification) 작업의 경우 출력 층은 데이터의 각 샘플이 여러 범주에 속할 확률을 구한 뒤 확률을 비교하여 그 중 하나의 범주를 선택합니다. 출력 층의 노드는 각각 하나의 범주에 해당하고 이 노드가 활성화 되는 정도를 비교하여 하나의 노드를, 즉 하나의 범주를 고릅니다.

분류 작업의 경우 최종적으로 출력 노드는 0 또는 1의 값을 가지게 됩니다. 즉, 무조건 해당 범주에 속하거나(1) 혹은 속하지 않는다(0)는 결론을 내리게 설계됩니다.

한편 입력 데이터는 출력과 달리 연속적인 값을 가지는 경우가 대부분입니다. 즉 입력 신호는 특정 범위에서 연속적인 값을 갖는 값으로 이루어져 있습니다.

예를 들어 추천 엔진을 구현하는 경우 최종 결과는 해당 아이템을 추천할 것 인지 아닌지로 딱 떨어지게 나와야 합니다. 하지만 입력 데이터는 고객이 해당 페이지에서 머무른 시간, 고객의 구매력 등 연속된 값을 갖습니다.

즉 입력으로 들어온 온갖 범위의 값(예: 3만원짜리 티셔츠, 고객이 과거에 구매한 내역, 고객이 웹사이트에 머무른 시간 등)을 압축해서 최종적으로 이 아이템을 어떤 범주에 넣을 것인지, 혹은 사용자가 어떤 타입의 고객인지 등 어떤 범주에 넣을지를 결정합니다.

이렇게 넓은 범위의 값을 0 또는 1의 값으로 결정해주는 과정을 로지스틱 회귀라고 합니다. 이 이름이 굉장히 헷갈리기 쉬운데, 회귀(연속된 값을 예측하는 작업)라는 이름이 붙여져 있지만 실제로는 분류 작업을 한다는 것을 유의하시기 바랍니다.

Alt text

로지스틱 회귀의 공식을 조금 들여다 보겠습니다.

연속된 값(예: -100, -0.5, 1.0, e^4, 300,…)을 확률로 표현해주려면 입력 값을 양수로 바꿔야 합니다. (확률은 0에서 1사이의 값을 가집니다.) 이렇게 양수로 바꿔주기 위해 분모에 e^(-x)가 들어갑니다. 왜냐하면 e^(-x)의 경우 x에 어떤 값이 들어오더라도 그 결과는 양수가 되기 때문입니다.

또 한 가지 고려할 내용은 바로 입력값 x가 클 경우 확률이 점점 증가하도록 설계해야 한다는 것 입니다. 그래서 e^(-x)가 분모에 포함되어 있습니다. 만일 x가 점점 커지면 e^(-x)는 (여전히 양수지만) 점점 작아집니다. 그러면 F(x)는 (확률의 최대 값인) 1에 가까워집니다. 반대로 x가 점점 작아지면 (-1, -10, -100…) e^(-x)의 값이 매우 커지고, F(x)는 0에 가까워집니다.

만일 이렇게 지수 함수로 처리를 하지 않는다면 결과를 0과 1 사이에 압축시키기가 매우 까다롭습니다. 따라서 지수 함수를 사용한 로지스틱 회귀를 인공 신경망의 출력층에 사용합니다.

최종적인 판단을 위해서 확률의 기준값을 세워주면 됩니다. 예를 들어 어떤 노드의 확률이 0.5보다 크다면 그 노드에 해당하는 범주에 속한다고 판별한다고 규칙을 만드는 것 입니다. 만일 이 기준값이 너무 작다면(예:0.0001을 넘기면 이 범주에 해당한다) false positive(긍정 오류, 거짓 양성: 실제로는 이 범주에 해당하지 않는데 이 범주라고 예측을 하는 것)가 많아지고, 기준값이 너무 크다면 반대로 false negative(부정 오류, 거짓 음성)이 많아집니다.

인공 신경망과 인공 지능

이렇게 임의의 값에서 출발해서 시행착오를 거듭하는 학습 과정 때문에 인공 신겸앙은 단순 무식한 방법(brute force)라고 비판받기도 합니다. 학습한 모델의 결과가 좋더라도 과정이 비효율적이라는 단점을 지적하는 사람들이 있기 때문입니다.

그러나 경사 하강법은 존재하는 모든 경우의 수를 다 따지는 것이 아닙니다. 계속해서 가능한 경우의 수를 줄여나가며 최적의 답을 찾는 과정이기 때문에 사실은 굉장히 효율적인 방법입니다.

학습 자료

인공 신경망 초보자들을 위한 강좌를 모아놓았으니 참고하시기 바랍니다.

Copyrig


Posted by MIDDLE
,



전체적인 하둡 커버로스 동작의 주요 단계는 다음과 같다.

- 모든 하둡 서비스는 KDC에 자신을 인증하고, 데이터노드를 네임노드에 등록한다. 이와 유사하게 태스크트래커도 잡트래커에 자신을 등록하고 노드매니저는 리소스 매니저에 등록한다?

- 클라이언트는 KDC에 인증한다. 클라이언트는 네임노드와 잡 트래커/리소스 매니저에 대한 서비스 티켓을 요청한다.

- HDFS내의 파일 접근을 위해 클라이언트는 네임노드 서버에 접속하고 파일을 요청한다. 네임 노드서버에 접속하고 파일을 요청한다. 네임노드는 클라이언트를 인증한 후, 블록 접근 토큰으로 클라이언트에게 인증정보를 제공한다. 데이터노드는 사용자에게블록 접근 토큰을 요청해서 클라이언트의 권한을 확인하고 요청한 블록에 대한 접근을 제공한다.

- 하둡 클러스터에 맵리듀스 잡을 제출하기전에, 잡 트래커는 클라이언트에게 위임 토큰을 요청한다. 이 위임 토큰은 클러스터에 맵리듀스잡을 제출할 때 이용된다. 잡트래커는 긴 시간 수행되는 잡을 위해 위임 토큰을 갱신한다.



'Cloud Service > Kerberos' 카테고리의 다른 글

CentOS6.6환경 Kerberos 설치 및 HDFS 연동  (1) 2016.05.09
Kerberos란?  (0) 2016.05.09
Posted by MIDDLE
,

리눅스는 쥐뿔도 모르지만.. Kerberos 설치를 시도해보겠습니다.


http://web.mit.edu/Kerberos/krb5-latest/doc/admin/install_kdc.html

CentOS 6에 MIT에서 docu로 제공되는 installation guide를 따라 설치를 진행해보겠습니다.


시작부터 Master KDC와 Slave KDCs를 가져야 된다고 하는데 저는 

Master KDC용 VM 하나와 Slave KDC용 VM 하나를 이용하여 제작하겠습니다.


주의 사항 

1. Kerberos system은 시간정보에 의존적이기 때문에 정확한 시간 정보가 필요하다. 

즉 Master와 Slave의 시간은 동기화가 되어져야 한다.


2. 설치및 액세스 보안을 KDC를 통하여 실행하는 것이 좋습니다. KDC는 파일서버, FTP서버, 웹서버 클라이언트, Kerberos 데이터베이스에 액세스할 수 있는 지역에 보안을 설정 할 수 있습니다.


3. Kerberos는 네임노드및 모든 데이터 노드에도 설치가 되어야 한다.

Master KDC 설치 및 설정

Kerberos 설치는 OS에 맞춰 제공되어지는 패키지를 통해 설치하여야 한다.


Kerberos 설치는 다음과 같은 과정으로 진행한다.

 - 보안된 하둡 클러스터 설치를 위한 선행조건

 - 커버로스 설치

 - 커버로스 인증을 위한 하둡 설정

 - 다중 영역 환경에서 사용자 설정



(1) 선행조건

다음은 보안된 하둡 클러스터를 설치하기 위한 선행 조건이다.

 - 클러스터를 설치하는 사용자에게 Root나 sudo접근권한 필요하다. (계정이 root라...)

 - 하둡 클러스터가 설정되어있고, 비 안전모드로 수행되고 있다. (기본 설정이 none secure)

 - 적절한 파일 권한이 로컬과 하둡 시스템 디렉토리에 할당 되어 있다. (이것도 Hadoop 실행계정이 root라..)

 - 만약을 위해 소스 코드로 부터 Kerberos를 빌드한다. 커버로스 소스코드를 컴파일 하려면 GCC 컴파일러가 필요하다. RHEL/CentOS에서는 yum groupinstall 'Development Tools' 명령어를 실행해서 필요한 모든 패키지를 설치한다.

 - 클러스터에 있는 모든 머신에서 DNS검색과 호스트 맵핑이 작동하고 있다. 커버로스는 IP로는 동작하지 않는다. 모든 노드에서 역 DNS검색이 되어 전체 주소 호스트명을 리턴해야 한다.

 - 커버로스가 사용하는 포트는 KDC를 위한 88번 포트와 관리서버를 위한 749번 포트다. 모든 노드가 KDC에 연결해서 인증하므로 88번 포트는 하둡 데몬을을 구성하는 클러스터의 모든 노드에게 열려야 한다.

      ☆ Port 설정 잘못해서.. 3일동안 시간만 버렸다. 주의 필요 

 - 하둡 클러스터 인증에 쓰일 커버로스 영역명이 있어야 한다.


(2) Kerberos Build 

a. Kerberos 설치를 위한 Source 를 받아보자.

다운로드 : http://web.mit.edu/kerberos/dist/index.html

빌드 가이드 : http://web.mit.edu/Kerberos/krb5-latest/doc/build/index.html

다운로드 페이지에서 Kerberos를 받은뒤 빌드가이드에서 지시하는데로 따라 설치하면 된다.

본인은 /root 에서

wget http://web.mit.edu/kerberos/dist/krb5/1.14/krb5-1.14.2.tar.gz

tar xvzf krb5-1.14.2.tar.gz

/root/krb5-1.14.2

b. 소스 디렉토리 설명

appl : Kerberos app Client와 server programs 있는곳

ccapi : 자격증명 cache services

clients : Kerberos V5 user Programs (User Commands 모아놓은곳 )

 - http://web.mit.edu/Kerberos/krb5-latest/doc/user/user_commands/index.html#user-commands

config : scripts 설정

config-files : Kerberos 설정 sample files

include : kerberos system build에 필요한 파일 넣는곳

kadmin : Kerberos master database에 접근하기 위한 인터페이스

kdc : Kerberos 인증 서비스와 키 배포 센터

lib : Kerberos Lib 모음

plugins : Kerberos Plugins directory

po : Localization Infrastructure

prototype: Template과 MIT copyright Message 수록

slave : slave KDC database에 propagating 하기 위한 유틸(kprop, kpropd)수록 (Forward propagation, back propagation 이런걸 의미하는 건가..)

tests : Test Suite

util :  building 하거나, 설정하기위한 다양한 유틸 코드 수록

windows : Windows에서 Kerberos를 Build하기위한 소스 수록


c. Build 해보자. ( 설치과정 a만 하고 올것 a설치 않하고 올경우 정상적인 빌드가 되지않는다.)

Using Autoconf (If you are not a developer, You can skip this section) 음... 지나가도 될까요.

Kerberos V5 source directory에서는 설정 script를 자동적으로 설정해주는 과정이 존재한다. 

이 설정 script는 autoconf 을 이용하여 생성 가능하다. 이미 설치 되어있으면.


사용자라면 autoconf를 할 필요가 없다. 이미 설정 script는 먼저 빌드가 되어있을것이다.

이 명령어는 반드시 source 디렉토리 최상위에서 실행 되어져야 한다.

ex) cd /root/krb5-1.14.2/src

     ./util/reconf --force

그리고 source package를 build해야 한다. 

ex) make all

     make install DESTDIR=somewhere-else

하면 빌드가 완성 된다~?

않되는데... (make *** no rule to make target all'. stop. ) 이러한 에러 발생 검색해보니


Build within a single tree

Kerberos build를 하나의 플랫폼에서 구성하고자 하면 이 명령으로 진행하면 된다. 

그러나 Kerberos를 통해 많은 숫자의 플랫폼을 구성하려 한다면 이 명령어는 적합하지 않다.

separate build trees for each platform 을 이용하여 진행해라.

ex)  cd /root/krb5-1.14.2/src

./configure

     make

끝이다..

ps) make check를 통해 make된걸 검사해보았다. 그랬더니  이전에 내가 지정한 hostname kdc.cw.com 이게 not known error가 발생 되어졌다.

vi /etc/hosts

127.0.0.1 에 kdc.cw.com 을 추가하니 문제는 해결되었다.


재 빌드 하고싶을경우

make clean 

make distclean 

이용하여 clean 한후 빌드 하자.


(3) Kerberos 설치

빌드되어진 package를 이용하여 설치를 진행해보자.

kdc.cw.com - master KDC

kclient.cw.com - slave KDC

CW.COM - realm name

.k5 hsa.cw.com - stash file

admin/admin - admin principal

a. build 과정 이전에 Key Distributed center를 설치 해야 한다.

RHEL/ CentOS

 : yum install krb5-server krb5-libs krb5-workstation

Ubuntu

 : sudo apt-get install krb5-kdc krb5-admin-server

명령을 이용하여 설치를 진행하면 된다.


b. Build 과정 진행


c. KDC 설치가 완료 되어지면 다음 단계는 적절한 KDC 환경설정을 진행해야한다. 

Build에서도 보시다시피 Master Slaves 관계를 맺을수 있지만, 

지금은 Master 단독 Node 관계로 진행하겠다.

vi /etc/krb5.conf

[libdefaults]

    default_realm = CW.COM

    dns_lookup_realm = false

    dns_lookup_kdc = false

    ticket_lifetime = 24h

    forwardable = true

    udp_preference_limit = 1000000

    default_tkt_enctypes = des-cbc-md5 des-cbc-crc des3-cbc-sha1

    default_tgs_enctypes = des-cbc-md5 des-cbc-crc des3-cbc-sha1

    permitted_enctypes = des-cbc-md5 des-cbc-crc des3-cbc-sha1


[kdc]

 profile = /var/kerberos/krb5kdc/kdc.conf


[realms]

    CW.COM = {

        kdc = kdc.cw.com:88

        admin_server = kdc.cw.com:749

        default_domain = cw.com

    }


[domain_realm]

   .cw.com = CW.COM

    cw.com = CW.COM


[logging]

    kdc = FILE:/var/log/krb5kdc.log

    admin_server = FILE:/var/log/kadmin.log

    default = FILE:/var/log/krb5lib.log


위와같이 처리 진행하여야 한다.

vi /var/kerberos/krb5kdc/kdc.conf
default_realm = CW.COM

[kdcdefaults]
    v4_mode = nopreauth
    kdc_ports = 88

[realms]
    CW.COM = {
        kdc_ports = 88
        kadmind_port = 749
        admin_keytab =  /var/kerberos/krb5kdc/kadm5.keytab
        database_name = /var/kerberos/krb5kdc/principal
        acl_file = /var/kerberos/krb5kdc/kadm5.acl
        key_stash_file = /var/kerberos/krb5kdc/stash
        max_life = 10h 0m 0s
        max_renewable_life = 7d 0h 0m 0s
        master_key_type = des3-hmac-sha1
        supported_enctypes = arcfour-hmac:normal des3-hmac-sha1:normal des-cbc-crc:normal des:normal des:v4 des:norealm des:onlyrealm des:afs3
        default_principal_flags = +preauth
    }


와 같이 설정한뒤
KDC는 KDC데이터베이스내에 각 사용자의 자격증명을 저장한다. 데이터베이스는 파일일 수도 LDAP 저장소 일수도 있다. 파일 기반 KDC 데이터베이스를 설정하려면 영역명을 이용해서 다음과 같은 명령을 실행한다.
root@kdc ~#kdb5_util create -r CW.COM -s
실행한다. (CPU에따라 다르지만 엄청 걸린다. 인내심을 가지고 기다리자. 제경우는 30분)


이제 kdc Server를 실행 시켜보자.
/etc/init.d/krb5kdc start

netstat -au | grep k
udp        0      0 *:kerberos                  *:*
udp        0      0 fe80::5054:ff:fe7e::kerberos *:*
위와같은 상태를 확인 가능하다.

d. 최초 커버로스 관리자 설치 
마스터 KDC 서버에서 kadmin.local 명령어로 KDC 데이터베이스 내 Principal의 패스워드를 설정한다. 관리자 pricipal을 설치하고 관리자 principal 패스워드를 제공하려면 다음 명령어를 실행한다.

kadmin.local -p admin/admin

kinit 명령어는 사용자를 인증하기 위해 사용한다. KDC가 사용자를 인증 할 수 있도록 kinit를 써서 관리자 인증을 확인할 수 있다.
kinit admin@CW.COM

e. 사용자 또는 서비스 Principal 추가
관리 사용자 설치가 끝나고 커버로스 데몬이 구동되면, kadmin 유틸리티를 사용해 커버로스 데이터베이스에 Principal을 추가할 수 있다.
add_principal -randkey user/mydomain.com@CW.COM


f. Hadoop과 Kerberos
이제부터 본격적으로 Hadoop과 Kerberos를 연동하기 위한 설정을 진행해보자.

하둡 커버로스 인증 설정 단계

(1) HDFS, 맵리듀스, YARN Principal 생성


(2) HDFS, 맵리듀스, Yarn Keytab 생성


(3) 모든 슬레이브로 키탭 복사


(4) 키탭 파일을 위한 적절한 권한 설정


(5) 하둡 환경설정 업데이트


(6) 보안된 데이터노드와 테스크 트래커 설정


g.모든 하둡 노드에 Kerberos Client 설치

yum install krb5-libs krb5-workstation

위의 명령어를 각 하둡 노드 (마스터노드, 슬레이브 노드)에 커버로스 클라이언트를 설치하여야 한다.


h. 하둡 서비스 Principal 설치
하둡 데몬 실행에 이용되는 세 사용자 hdfs, mapred, yarn가 있다. 네임노드와 데이터 노드 그리고 세컨더리 네임노드와 같은 모든 하둡 분산 파일시스템 관련 데몬은 hdfs사용자에 의해 수행된다. 이와 달리 MRV2에서는 mapred사용자가 JobHistory Server 와 Mapreduce Application 실행하고, yarn 사용자가 resource manager와 nodemanager를 실행한다.

Hadoop 데몬의 커버로스 인증이 가능하려면 KDC안에 hdfs, mapred, yarn 프린시플을 생성 해야한다.
이 서비스들은 모두 http를 이용하므로 http 서비스 principal도 생성 해야 한다.
Principal 생성을 위해 kadmin 을 이용한다.
근데......
kadmin 치니
Authenticating as principal root/admin@MYREALM.COM with password.
kadmin: Client not found in Kerberos database while initializing kadmin interface
이러한 에러가 발생한다. 
이 에러의 발생 이유는 
kadmin.local 에서 root/admin@MYREALM.COM가 등록 되어있지 않기 때문에 발생 되는 문제였습니다.
[root@kdc ~]# kadmin.local
Authenticating as principal root/admin@CW.COM with password.
kadmin.local:  add_principal root/admin@CW.COM
WARNING: no policy specified for root/admin@CW.COM; defaulting to no policy
Enter password for principal "root/admin@CW.COM":
Re-enter password for principal "root/admin@CW.COM":
Principal "root/admin@CW.COM" created.

등록하게 되면 이후 부터 kadmin에 접근이 가능해진다.

i. 하둡 KeyTab 파일 생성
kadmin
kadmin: xst -k hdfs-unmerged.keytab hadoop/cw.com@CW.COM 
을 이용하여 hadoop 생성

ktutil
ktutil:  rkt hdfs-unmerged.keytab
ktutil:  wkt hdfs.keytab
ktutil:  clear
을 통하여 keytab 적용
klist -e -k -t hdfs.keytab
만들어진 Keytab 확인 가능하다.

j. SSH 를 Kerberos를 통하여 제어를 해보자.
문서를 참조 하였다.
문서의 순서대로 따라 오게 된다면 
keytab까지는 등록이 완료된 상태가 되어진다.
하지만!!!!!!! Keytab으로 등록하게 된다면 random key로 생성이 되어지기 때문에 
kinit host/kdc.cw.com@CW.COM
password 입력 : 
하게 될 경우 incorrect라는 말만 계속해서 볼 수 있다.
이 경우 해결 방안은 2가지가 있다.
(1) Keytab을 이용하여 인증을 받느냐.

Without Keytab하여 Random key가 아닌 사용자 지정 비밀번호를 이용하여 
(2) kinit host/kdc.cw.com@CW.COM
password 입력 : ******
인증하는가.
선택하여 진행하면된다.


----------------------------------- SSH 까지는 연결 완료 ----------------------------------------------

k. Hadoop과 Kerberos와의 연동을 진행 해보자.

'Cloud Service > Kerberos' 카테고리의 다른 글

Hadoop과 Kerberos  (3) 2016.05.10
Kerberos란?  (0) 2016.05.09
Posted by MIDDLE
,