한땀한땀 정성들인 코딩

[HBase]text 파일 hbase에 input하기 1. 맵퍼 클래스 본문

빅데이터

[HBase]text 파일 hbase에 input하기 1. 맵퍼 클래스

romance penguin 2017. 1. 4. 03:17
반응형


   

package insertCsv;

import java.io.BufferedReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

//import org.apache.hadoop.fs.FileSystem;
//import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Mapper;

public class AirMapper extends Mapper<LongWritable, Text, ImmutableBytesWritable, Put> {
    // longWritable은 텍스트 라인번호, text는 한줄 string 타입
    // 출력은 (불변)바이트코드 타입 -->로우키, put은 ??
   
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    private BufferedReader br = null;
    private Date date = null;
   
    private HTable table =null; //테이블 인스턴스, HTable 선언은 리소스를 많이 쓰므로 각 쓰레드당 한번씩만 선언하는게 좋다.

    private final byte[] COLUMN_FAMILY = "AIRFLIGHT_DATA".getBytes(); //컬럼 패밀리선언 바이트형식으로 변환시켜 놓는다.
   
    @Override
    public void setup(Context context) throws IOException,InterruptedException{
        table = new HTable(context.getConfiguration(),"AIRFLIGHT_TABLE"); //테이블 선언
        table.setAutoFlush(false, true); //메모리데이터 --> 디스크로 설정
    }
    @Override
    public void cleanup(Context context) throws IOException, InterruptedException{
        br.close(); //스트림닫기
        table.flushCommits(); //테이블 내용을 플러쉬후
        table.close(); //종료
    }
   
    @Override
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
       
            parseCsv parser = new parseCsv(value); //한줄 씩 읽어서 분리
           
            String rowKey = new String(parser.getYear()+","+parser.getMonth()+","+
            parser.getDay_of_month()+","+parser.getUnique_carrier()+","+
            parser.getFlightnum()); //key는 년도 월 일 항공사번호 항공기 번호로 구성
                //key를 정하는 전략은 매우 중요하다,!! 서로 관련된것이 인접하게 정렬되게끔 하는것 이 좋다.
               
            List<Put> puts = new ArrayList<Put>(); //리스트 puts 객체를 선언해 rpc로 인한 부하를 줄여준다.
               
            Put put = new Put(Bytes.toBytes(rowKey)); //row키로 put객체 선언
           
            put.add(COLUMN_FAMILY, Bytes.toBytes("ad"), Bytes.toBytes(parser.getArrdelay()));
            puts.add(put);
            put.add(COLUMN_FAMILY, Bytes.toBytes("dd"), Bytes.toBytes(parser.getDepdelay()));
            puts.add(put);
            put.add(COLUMN_FAMILY, Bytes.toBytes("di"), Bytes.toBytes(parser.getDistance()));
            puts.add(put);
           
            //put.add(COLUMN_FAMILY, Bytes.toBytes("data"), ts, Bytes.toBytes(valueColumns[1]));
            //형식을 잘보자 (컬럼패밀리, 컬럼명(quliafier), 타임스탬프, 데이터값)
            //모든 값은 바이트로 전환하여 put객체에 추가 한다.
            //생성자는 여러가지가 존재한다. ts는 시스템시간상으로 설정 할수도 있다..4
                                           
            table.put(puts);
    }

}


오늘 책을 응용하여 만든 맵퍼 클래스...

책에 있는 데이터 예제는 메타데이터 text파일에서 참조를 해 디렉토리경로를 찾아가 삽입하는 예제다.


내가 쓰는 예제는 하나의 csv파일에 모든 data가 들어가 있는 비교적 다루기 쉬운 예제.

데이터 분해 잘되고 로우키도 잘 들어간다.! 타임스탬프는 시스템 시간으로 잘 들어가고 문제는 컬럼 패밀리의 데이터값

데이터 형태를 더 볼 필요가 있다. ( type이 맞지 않는 값이 들어가 있나보다 ... )


**그나저나 컴파일해 작동 시키면 노트북이 바로 항공기 소리를 낸다 ..,, 웅웅우우우웅

반응형

'빅데이터' 카테고리의 다른 글

[HBase]shell명령어  (0) 2017.01.06
[맵리듀스] map클래스  (0) 2017.01.05
[HBase] HBase 맵리듀스 하기  (0) 2017.01.05
[맵리듀스]parse 클래스  (0) 2017.01.05
hbase를 이용한 jsp 웹서버  (0) 2017.01.03