반응형

출처: http://blog.ncsoft.com/?p=248

 

엔씨가 사용하는 오픈소스 #1

 

빅데이터 처리기술 :

     ‘하둡(HADOOP)’

 

 

 

Q2. 엔씨소프트 속 하둡을 다루기 전에 하둡이란 오픈소스에 대해 간단히 설명 부탁 드립니다.

노재호 : 하둡의 약자를 설명 드리면 (HADOOP/High-Availability Distributed Object-Oriented Platform)입니다. 재미나게도 하둡이 만들어진 다음에 붙여졌다고 합니다. 간단하게 설명을 드리면 대용량 자료를 처리할 수 있는 컴퓨터 클러스터에서 동작하는 분산 응용 프로그램을 지원하는 오픈소스 자바 프레임워크입니다.

박수혁 : 하둡은 더그 커팅(Doug Cutting)이라는 개발자가 넛치(Nutch)라는 검색엔진을 개발하는 과정에서 탄생되었습니다. 하둡은 크게 분산 저장과 병렬 처리, 2개의 프레임워크로 구성되어 있습니다. 분산 저장은 클러스터 환경에서 대용량 데이터를 분산하여 안정적으로 저장하는 프레임워크이고, 병렬 처리는 저장 환경 위에서 병렬로 데이터 Processing하는 프레임워크입니다.

박경재 : 여러 대의 컴퓨터를 모아 디스크를 묶어서 쓸 수 있게 하는 분산 저장소와, CPU를 동시에 쓸 수 있는 병렬 처리 소프트웨어 라이브러리입니다. 다만 어려운 점은 하둡에서 지정한 방식으로만 사용하는 것입니다.

노재호 : 요약하자면 하둡은 동시다발적으로 발생한 데이터를 분산해서 저장하는 것입니다.

 

 

 

Q3. 아! 하둡 좋은 거군요. 그럼 여기 계시는 전문가 분들은 하둡으로 무엇을 하고 있나요?

노재호 : 게임에서 발생하는 게임로그와 정보계 쪽에서 발생하는 데이터를 적재하고 있습니다. 그리고 하둡 에코 시스템 전체 플랫폼의 서비스를 관리, 운영하고 있습니다. 이외에도 장애 처리, 성능 튜닝까지 담당하고 있습니다.

박수혁 : ETL이라는 데이터 수집, 변환, 적재 작업을 하고 있습니다. 기존 상용툴로 하던 작업, 예를 들면 비즈니스 로직, 데이터 리포트, 서머리 팩트 생성 등을 하둡 에코 시스템 위에 존재하는 Scoop, Plum, Pig와 같은 오픈소스로 개발 운영하고 있습니다.

박경재 : 하둡 관리를 하고 있습니다. 버그픽스 및 버그패치 적용 등 오픈소스를 계속 따라가는 작업을 하고 있습니다. 이외에도 성능 향상을 위한 적재와 조회 전용 도구 개발을 하고 있습니다. 현재 실시간 처리 개발에 주력하고 있습니다.

 

 

Q4. 언제부터 하둡을 사용하셨나요? 규모는 어느 정도죠?

노재호 : 엔씨소프트에서 라이브서비스 수준으로 사용한 것은 2011년도부터였습니다. 서버 50대로 시작하였습니다. 2014년 현재는 대략 300여대 규모까지 늘어난 상태입니다. 페이스북이나 야후의 경우 몇 천대 규모 단위로 이야기하고 있습니다. 현재 저장할 수 있는 스토리지 용량은 2.6PB(페타바이트) 입니다. 이는 대략 노래 5억 6천만 곡 혹은 영화 400만 편을 담을 수 있는 용량입니다. 또한 하둡 뿐만 아니라 에코시스템 안에서 오픈소스 9종과 실에서 개발된 인하우스(in-house) 5종을 운영하고 있습니다.

Q5. 하둡을 사용하면서 힘들었던 점이 있다면?

노재호 : 오픈소스의 경우 서비스 지원을 받을 수 없기 때문에 장애 발생 시 원인 파악이 어렵고 패치도 쉽지 않아 힘들었습니다. 게다가 오픈소스가 9종이다보니 하둡 뿐 아니라 여기저기 문제가 발생하기도 했습니다. 힘이 들기도 하지만, 최신 트렌드를 끌어가고 있다는 점에서 자부심을 가지고 있습니다.

Q6. 엔씨소프트에 맞는 하둡 플랫폼은 어떤 것인가요? 개발자 혹은 운영자의 역할은 무엇이라 생각하나요?

박수혁 : 어느 회사든 마찬가지겠지만, 모든 비즈니스에 딱 맞아떨어지는 오픈소스 플랫폼이란 없는 것 같습니다. 회사의 데이터 크기, 응답 속도, 데이터 생성 속도와 빈도에 따른 스택이 별도로 설계 되어야 합니다. 결국에는 비즈니스에 대한 이해와 오픈소스에 대한 분석 능력을 통해 균형 맞는 오픈소스 플랫폼을 만드는 것이 중요합니다. 회사의 상황에 가장 적절한 형태로 수정이나 재조합을 하는 셈이죠. 다양한 형태의 레고 블록을 조합하여 완성품을 만드는 것처럼 회사의 상황에 가장 적절한 소스를 선정하고, 기존 소스를 수정하거나 재조합 하는 일이 개발자 혹은 운영자의 역할이 아닌가 싶습니다. 제 개인적인 목표이기도 하고요.

Q7. 말씀주신 레고 블록을 만드는 것처럼 필요한 부분을 결합하여 사용할 수 있는 개발자가 있다면 오픈소스 플랫폼을 가져가는 것이 회사의 경쟁력이 될까요?

박수혁 : 오픈소스를 다루는 일이 개발자에게는 부담도 크고, 비용이 적은 것도 아닙니다. 하지만 적절한 오픈소스 플랫폼을 가져가게 된다면 개발자나 운영자의 입장에서 필요한 부분에 집중할 수 있게 해주기 때문에 IT 경쟁력 제고에 큰 역할을 할 것이라고 생각합니다. 가장 중요한 부분이기도 하고요.

Q8. 하둡이 오픈소스라 내재하고 있는 버그가 많은데, 어떤 버그가 있었고 어떤 방식으로 해결하셨나요?

박경재 : 하둡은 오픈소스이기 때문에 현재 알려진 버그만 수천 개입니다. 하지만 모든 버그가 저희 시스템에 해당되진 않으니 나머지는 무시하고 저희 시스템에 맞는 내용만 보완하고 있습니다. 하둡의 운영 중에 버그가 발생하면 버그가 리포트되는 하둡 JIRA (https://issues.apache.org/jira/browse/HADOOP)에서 내용을 참고하여 문제를 해결하고 있습니다. 한 번 저희 작업 중에 하둡 JIRA에서 확인할 수 없는 버그가 발생했었는데 새로운 버그로 확인되어 공식적으로 등록된 사례도 있습니다.

 

Q9. 하둡은 소규모나 작은 회사에는 어울리지 않다고 하는데, 어느 정도 규모가 되어야 쓸만할까요?

박경재 : 하둡이 유용한 기술이기는 하지만 섣불리 도입해서는 안 된다고 생각합니다. 소규모 회사에서 처리할 데이터가 DBMS로는 감당이 안 되는 경우에만 하둡의 도입을 검토해야 합니다. 적용하더라도 장비와 개발자 비용을 감내할 수 있어야 합니다.

박수혁 : 하둡이 성숙함에 따라 새로운 오픈소스를 도입하고 있습니다. 하지만 이미 공개된 오픈소스의 종류가 수백 가지나 되기 때문에 시스템에 맞는 소스를 선정하기에 어려움이 많습니다. 급하게 도입하려 하지 말고 많은 테스트를 거쳐 신중하게 진행하는 것이 중요한 것 같습니다.

노재호 : 하둡을 도입하는 데에는 사전 지식보다는 오픈소스의 험난한 파도를 넘을 수 있는 인내력이 필요합니다. 오픈소스는 버그가 많고 기술 지원이 없다 보니 해결책을 찾기가 쉽지 않습니다. 그러니 끝이 보이지 않는 바다 위에 혼자 있는듯한 느낌을 받을 때가 있습니다. 개발자로서 이를 극복할 수 있는 자세가 중요합니다.


 

반응형
반응형

출처: http://ememomo.tistory.com/36


/*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.text;

/**
 * When an object of a type is attached to an Editable, its methods will
 * be called when the text is changed.
 */
public interface TextWatcher extends NoCopySpan {
    /**
     * This method is called to notify you that, within <code>s</code>,
     * the <code>count</code> characters beginning at <code>start</code>
     * are about to be replaced by new text with length <code>after</code>.
     * It is an error to attempt to make changes to <code>s</code> from
     * this callback.
     */
    public void beforeTextChanged(CharSequence s, int start,
                                  int count, int after);
    /**
     * This method is called to notify you that, within <code>s</code>,
     * the <code>count</code> characters beginning at <code>start</code>
     * have just replaced old text that had length <code>before</code>.
     * It is an error to attempt to make changes to <code>s</code> from
     * this callback.
     */
    public void onTextChanged(CharSequence s, int start, int before, int count);

    /**
     * This method is called to notify you that, somewhere within
     * <code>s</code>, the text has been changed.
     * It is legitimate to make further changes to <code>s</code> from
     * this callback, but be careful not to get yourself into an infinite
     * loop, because any changes you make will cause this method to be
     * called again recursively.
     * (You are not told where the change took place because other
     * afterTextChanged() methods may already have made other changes
     * and invalidated the offsets.  But if you need to know here,
     * you can use {@link Spannable#setSpan} in {@link #onTextChanged}
     * to mark your place and then look up from here where the span
     * ended up.
     */
    public void afterTextChanged(Editable s);
}


TextWatcher 인터페이스를 보면 beforeTextChanged / onTextChanged /  afterTextChanged 함수를 오버라이딩 하여야 한다.

각각의 함수는 이름을 보면 대충 언제 구동되는지 알 수 있을 것이다. 

이 인터페이스를 이용해서 입력값에 대한 실시간 변화를 감지해 낼 수 잇다. 예를 들어 가격을 입력하는 창이라던지, 글자를 

입력하는 창에서 조건을 걸어 검사를 할때 유용하게 사용 할 수 있다. 

이번예제는 TextWatcher 인터페이스를 이용해서 글자수를 제한 해 보는 예제이다. 

하나의 입력창이 있고 , 그 입력창을 글자수를 실시간으로 반영 하며, 50자 이상일때 입력을 제한하는 Toast 메시지를 띄우는 

예제이다.

화면을 살펴 보면 


이런식의 예제이다. 이를 응용하면 가격표에 자동으로 , 표시를 추가하는등의 함수도 작성 할 수 있다.

쓰는 법은 간단하니 코드를 살펴 보자. 


main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical"
 android:background="#ffffff"
 android:gravity="center"
 >
 <LinearLayout
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal">
  <TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginLeft="9dip"
   android:layout_marginTop="10dip" />
  <TextView
   android:id="@+id/review_length"
   android:layout_marginTop="15dip"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:paddingRight="5dip"
   android:layout_marginLeft="240dip"
   android:text="0/50자" />
 </LinearLayout>
 <EditText
  android:id="@+id/estimate_review_content"
  android:layout_marginLeft="8dip"
  android:layout_marginTop="1dip"
  android:maxLength="50"
  android:padding="7dip"
  android:layout_width="200dip"
  android:layout_height="75dip" />
</LinearLayout>



Strudy_0522.java

package com.tistory.ememomo;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class Strudy_0522 extends Activity implements TextWatcher{
    
 private EditText   review_content;
    private TextView  review_length;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        review_content     = (EditText) findViewById(R.id.estimate_review_content);
        review_length     = (TextView) findViewById(R.id.review_length);
        review_content.addTextChangedListener(this);
    }
    
    @Override
 public void afterTextChanged(Editable s) {
  
 }
 @Override
 public void beforeTextChanged(CharSequence s, int start, int count,
   int after) {
  
 }
 @Override
 public void onTextChanged(CharSequence s, int start, int before, int count) {
  
  if(s.length() >= 50)
  {
   Toast.makeText(Strudy_0522.this, "글은 50자 까지 입력 가능합니다.", Toast.LENGTH_SHORT).show();
  }
  review_length.setText( s.length() + "/50자");
 }
}



EditText 입력창에 addTextChangedListener 리스너를 달아 주고 그 리스너를 이용하는건 TextView에다 넘겨주었다.

내가 처리한곳은 onTextChanged 함수 내에서 처리 했지만, 입력받기 전 중 후로 처리를 할 수 있으니 잘 살펴 보길 바란다.

반응형
반응형

출처 - http://blog.naver.com/PostView.nhn?blogId=sukuns&logNo=70114459329


에디트 텍스트 안의 글자 수를 셀때 가장 중요한 역할을 하는 것은 바로 TextWatcher라는 인터페이스이다

 

에디트텍스트는 사용자가 입력한 문자열의 상태가 바뀌는 것을 에디트텍스트 밖으로 알리기 위해 TextWatcher 객체를 addTextChangedListener()메서드의 인자로 사용한다.

 

...(생략)..

TextWatch watch = new TextWatcher(){

@Override

public void beforeTextChanged(CharSequence s, int start, int count, int after){

 CharSequence s : 현재 에디트텍스트에 입력된 문자열을 담고 있다.

 int start : s 에 저장된 문자열 내에 새로 추가될 문자열의 위치값을 담고있다.

 int count : s 에 담긴 문자열 가운데 새로 사용자가 입력할 문자열에 의해 변경될 문자열의 수가 담겨있다.

  int after : 새로 추가될 문자열의 수

}

@Override

public void onTextChanged(CharSequence s, int start, int before, int count){

 CharSequence s : 사용자가 새로 입력한 문자열을 포함한 에디트텍스트의 문자열이 들어있음

 int start : 새로 추가된 문자열의 시작 위치의 값 

int before : 새 문자열 대신 삭제된 기존 문자열의 수가 들어 있다

int count : 새로 추가된 문자열의 수가 들어있다.

}

@Override

public void afterTextChanged(Editable s){}

...(생략)..

Edittext editext = (EditText)findViewById(R.id.edittext);

edittext.addTextChangedListener(watch);

 

}

 

상위 코드가 실행되면 에디트 텍스트 문자 입력 상태가 변경될 때마다 beforeTextChanged().

onTextChanged(),afterTextChanged() 메서드를 순서대로 하나씩 호출한다.

즉, 사용자가 키보드에서 글자 한나를 누른 뒤에 손가락을 떼면 그 사이에 아래와 같은 순서를 거쳐서 글자 하나가 입력된다.

 

예 :

abcde 라는 문자열이 있다.

 이때 cde를 선택한다음

abcde

키보드에서 t를 찾아 누르면 에디트텍스트 내 문자열은 다음과같이 

abt 로 변한다

beforeTextChanged()

CharSequence s : abcde (에디트 텍스트에 들어있던 문자열

int start : (abced에서 변경될 텍스트가 c에서 시작하므로 start 값은 2 이다. 참고로 첫 문자열 a 는 0, b는 1)

int count : 3 (cde를 선택했으므로 cde의 길이는 3)

int after : 1(t가 입력되었으므로 t의 길이 1)

 

onTextChanged()

CharSequence s : abt (병경된 후 에디트 텍스트 내의 문자열 abt)

int start : 2(t는 a와 b다음이므로  위치 값은 2)

int before : 3(처음 abced에서 cde가 대신에 t 가 들어왔으므로 ced의 길이인3)

int count : 1 (새로 추가되었으므로 t의 길이 1)

반응형
반응형

https://drive.google.com/folderview?id=0B7rtSe_PH_fTWDQ0RC1DeWVoVUE&usp=sharing

반응형

+ Recent posts