반응형

출처: http://www.devblog.kr/r/8y0gFPAvJ2e9YusO2zkCjl9yRvrgsWxq08MkPeBRH0PF8XOX51Oh1RP9ZBacWBDcSz8C55JnqHSwB249T13HZ9j

 

위에서 언급한 수집기 오픈 소스중 3가지 Flume, Scribe, Chukwa를 간단 비교요약하면 아래와 같다.

  Apache Flume Facebook Scribe Apache Chukwa
Overview 대용량의 로그 데이터를 분산,안정성,가용성을 바탕으로 효율적으로 수집,집계,이동이 가능한 로그수집 솔루션 Facebook이 개발하여 오픈소스화한 로그수집서버. 대량의 서버로 부터 실시간으로 스트리밍 로그 수집을 위한 솔루션  Apache Hadoop의 서브 프로젝트로 분산되어 있는 서버에서 로그 데이터를 수집, 저장, 분석하기 위한 솔루션
Home http://flume.apache.org/ https://github.com/facebook/scribe http://chukwa.apache.org/
Last Version 1.4.0 (2013.7.2) 2.2(2010) 0.5.0 (2012.1.26)
Status Cloudera -> Apache Top-Level Project Facebook -> Open Source Yahoo -> Apache Incubator project
WIKI https://cwiki.apache.org/confluence/display/FLUME/Home https://github.com/facebook/scribe/wiki http://wiki.apache.org/hadoop/Chukwa/
Document 풍부 빈약 풍부
Implementation Java C++ Java
Community 활발 활발 보통
Summary
  • 다양한 소스로 부터 데이터를 수집하여 다양한 방식으로 데이터를 전송이 가능하지만, 아키텍처가 단순하고 유연하며 확장 가능한 데이터 모델을 제공하여, 실시간 분석 애플리케이션을 쉽게 개발할 수 있다.
  • 최근 국내의 빅데이터 솔루션에서 수집부분의 기반이 되는 솔루션.
  • 각종 Source,Sink등 제공으로 쉽게 확장 가능
  • Facebook의 자체 Scaling 작업을 위해 설계되어 현재 매일 수백 억건의 메시지를 처리하고 있다. 클라이언트 서버의 타입에 상관없이 다양한 방식으로 로그를 읽어 들일수 있다.
  • 단, Apache Thrift는 필수.
  • Thrift 기반 Scribe API를 활용하여 확장 가능
  • 수집된 로그 파일을 HDFS에 저장한다. HDFS의 장점을 그대로 수용하고 실시간 분석도 가능하다.
  • 반면에 Hadoop에 너무 의존적이라는 단점도 있다.
Outline apache_flume facebook_scribe apache_chukwa

반응형

'프로젝트 관련 조사 > 로그 관련' 카테고리의 다른 글

flume 설치 및 예제  (2) 2015.09.09
flume windows install  (0) 2015.09.07
flume 관련 내용  (0) 2015.09.07
java install  (0) 2015.09.07
Flume  (0) 2015.09.01
반응형

Flume은 Log aggregator 즉 로그 수집기입니다. 수많은 서버에 분산되어 있는 많은 양의 로그 데이터를 flume을 통해서 한 곳(기본적으로는 HDFS)으로 모을 수 있도록 해줍니다.

 

Flume의 아키텍처
다음 그림처럼 Flume은 3 계층으로 구성되어 있습니다. 에이전트 계층, 컬렉터 계층, 스토리지 계층 3가지입니다.

flume architecture


에이전트 계층에서 각 에이전트 노드는 수집할 로그데이터가 생성되는 머신에 설치하는 것이 일반적입니다. 머신이 여러개 일 경우 각 머신마다 에이전트 노드를 설치하고 이 에이전트 노드가 에이전트 계층을 형성합니다. 에이전트노드에서 수집한 데이터는 컬렉터노드로 전송이 됩니다. 컬렉터노드는 보통 다른 머신에 있으며 당연히 여러 컬렉터노드로 구성할 수 있습니다. 에이전트 노드에서 컬렉터노드로 데이터를 전송할 때는 어떤 데이터를 어디로 보내고 어떻게 처리할 것인지 등에 대한 데이터흐름(data flow)를 설정할 수 있고 이 설정대로 데이터를 이동시켜 스토리지 계층에 저장합니다.

이 데이터흐름의 설정을 담당하는 것이 마스터노드입니다. 마스터는 각 논리적 노드를 런타임에서 설정할 수 있습니다.(이 부분이 플럼의 가장 큰 장점이라고 생각합니다.) 각 노드를 실행해 놓은 상태에서 마스터 노드를 통해서 자유롭게 설정을 변경할 수 있습니다. 즉 이는 어디서 로그데이터를 가져오고 어떻게 처리하고 어디에 저장할 것인지를 동적으로 계속 변경할 수 있습니다.

노드는 물리적 노드와 논리적 노드로 구분할 수 있습니다. 물리적 노드는 머신의 한 JVM위에서 동작하는 하나의 자바 프로세스입니다. 물리적 노드도 논리적 노드와 동일하게 동작하지만 물리적 노드위에는 다수의 논리적 노드를 생성할 수 있습니다. 그래서 필요한 용도에 따라 여러가지 논리적 노드를 생성해서 데이터 흐름을 구성할 수 있습니다. 각 논리적 노드(에이전트와 컬렉터 모두 포함)은 상당히 유연한 추상화입니다. 모든 논리적 노드는 2가지 컴포넌트를 가지고 있는데 이벤트를 생산하는 source와 이벤트를 소비하는 sink입니다. source는 어디서 데이터를 수집하는 지를 지정하고 sink는 어디로 데이터를 보내야 하는지를 지정합니다.(추가적으로 source와 sink에는 decorator를 설정해서 데이터를 전달하는 중에 어떤 처리를 할 수 있습니다.) 컬렉터와 에이전트는 사실 동일한 노드 소프트웨어에서 동작합니다. 즉, 동일한 노드이지만 설정이 다를 뿐입니다.



Flume의 신뢰도와 확장성
Flume은 신뢰할 수 있는 데이터 전송을 위해서 3가지 수준의 신뢰도를 지원합니다.

  • end-to-end 신뢰도는 flume이 이벤트를 받으면 최종지점까지 보장한다는 의미입니다.
  • store on failure 신뢰도는 데이터를 보내다가 실패했을 때 로컬디스크에 저장했을 때 다시 보낼수 있게 되거나 다른 컬렉터를 선택할 때까지 기다린 후에 다시 보냅니다.
  • best-effort 신뢰도는 처리중인 데이터가 실패했을 때 잃어버릴 수도 있다는 의미입니다. 이는 가장 약한 신뢰도이지만 가장 경량입니다.


Flume은 수평적 확장을 지원합니다. 이는 시스템에 추가적인 머신을 추가함으로써 전체 쓰루풋을 향상시킬수 있다는 의미입니다. 각 계층별로 부하량에 따라 노드를 추가해서 전체적인 성능을 향상시킬 수 있습니다.

반응형

'프로젝트 관련 조사 > 로그 관련' 카테고리의 다른 글

flume 설치 및 예제  (2) 2015.09.09
flume windows install  (0) 2015.09.07
flume 관련 내용  (0) 2015.09.07
java install  (0) 2015.09.07
오픈 소스 로그 수집기  (0) 2015.09.01
반응형

출처: 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)

반응형

+ Recent posts