이슈사항
Flume 1.4.1에서 Hbase로 갖고 올 경우 hbaseSink.serializer =
org.apache.flume.sink.hbase.RegexHbaseEventSerializer 옵션을 사용하면 Regex로 로그를 파싱하여 가져 올 수 있다고 하였다. 허나 정규식은 전혀 먹히지 않아 소스코드 수정 후 성공하였다.
RegexHbaseEventSerializer.java 소스코드를 살펴보면
다음과 같이 기본 정규식이 세팅되 있다. 즉 문자의 모든 것을 가져온다는 의미인데
public static final String REGEX_DEFAULT = "(.*)";
conf에서
hbaseSink.serializer.colNames = a 와 같이 컬럼을 하나만 줬을 경우에는 잘 들어간다. 이유는 위에 있는 정규식 때문에 오로지 한개의 컬럼 쭉 잘들어간다.
하지만
hbaseSink.serializer.regex = ([^',']+); 구분자를 콤마로 주는 정규식을
hbaseSink.serializer.colNames = a,b,c; 와 같이 3개의 컬럼으로 불러와 저장할 경우 전혀 먹히질 않는다.
해결방법
Flume 1.3.1에 있는 RegexHbaseEventSerializer.java 소스코드를 수정해야한다. 해당 파일은
/flume-1.3.1/flume-ng-sinks/flume-ng-hbase-sink/src/main/java/org/apache/flume/sink/hbase/ 이 밑에 있다.
아래의 구문에 있는 부분이 정규식 매칭과 hbase로 입력하는 값을 전달하는 부분이다.
정규식을 매칭하는 부분에 있어서 엔터값이나 무슨 문자 때문인지는 몰라도 공백 값이 마지막에 들어가기에 그 값을 인식해버려 정규식이 잘 매칭이 된다 하더라도 컬럼에 들어가지지 않는다.
때문에 위와 같이 arrayList를 하나 더 추가해서 만들고 매칭된 문자열을 추가된 list에 넣어 버리면 끝이다.
put.add에는 추가한 list의 값들을 넣어주면 잘 추가가 되고 더불어 conf에서 colnames를 지정하지 않아도Regex가 콤마라면 콤마만큼 분리하여 컬럼을 생성하기 때문에 동적으로 넣을 수도 있다. 또한 rowkey 생성도 default로된 숫자에서 컬럼의 첫번째로 지정할 수 있고, 컬럼명을 Col_순차적 숫자로 바꿔놓았다.
실행할 때는 이클립스에서 빌드해서 생성된 jar파일을 -c 옵션을 주고 jar경로를 추가해주면 된다.