Mapreduce导入数据到HBase中

MapReuce导入数据文件到HBASE表中

1. 代码编写

 

/**
 * 参考 org.apache.hadoop.hbase.mapreduce.ImportTsv
 * org.apache.hadoop.hbase.mapreduce.TsvImporterMapper
 * @author Hyman
 */
public class ImportEmp  extends Configured implements Tool{
	
	public static final String COLUMN_FAMILY = "info";
	public static final String[] COLUMNS = new String[]{"rowkey","name","deptname","leader","joindate","sal","exp","deptno"};
	
	//7499    ALLEN   SALESMAN        7698    1981-2-20       1600.00 300.00  30
	static class ImportEmpMapper extends Mapper<LongWritable, Text, ImmutableBytesWritable, Put>{
		
		ImmutableBytesWritable outkey = new ImmutableBytesWritable();

		@Override
		protected void map(LongWritable key, Text value,
				Mapper<LongWritable, Text, ImmutableBytesWritable, Put>.Context context)
						throws IOException, InterruptedException {
			
			String line = value.toString();
			
			//TODO validate data
			// .... 
			
			String[] fields = new String[8];
				StringTokenizer token = new StringTokenizer(line);
			int i = 0;
			while (token.hasMoreTokens()){
				fields[i++] = token.nextToken();
			}
			
			outkey.set(Bytes.toBytes(fields[0]));
			Put put = new Put(Bytes.toBytes(fields[0]));
			
			for(int index=1;index<8 ;index++){
				if(StringUtils.isNotEmpty(fields[index]))
					put.add(Bytes.toBytes(COLUMN_FAMILY),Bytes.toBytes(COLUMNS[index]), Bytes.toBytes(fields[index]));
			}
			
			context.write(outkey,put);
		}
		
	}

	public int run(String[] args) throws Exception {
		
		Job job = Job.getInstance(this.getConf(), this.getClass().getSimpleName());
        job.setJarByClass(this.getClass());

		
        job.setMapperClass(ImportEmpMapper.class);
        
        job.setMapOutputKeyClass(ImmutableBytesWritable.class);
        job.setMapOutputValueClass(Put.class);
        
        FileInputFormat.addInputPath(job, new Path(args[1]));
        
		TableMapReduceUtil.initTableReducerJob(
		  args[0],        // output table
		  null,    // reducer class
		  job//
		);
		
		job.setNumReduceTasks(0);   // at least one, adjust as required
		
        int exitcode = job.waitForCompletion(true) ? 0 : 1;
		return exitcode;
	}
	
	public static void main(String[] args) throws Exception{
		
		Configuration conf = HBaseConfiguration.create();
		
		int exitcode = ToolRunner.run(//
				conf, //
				new ImportEmp(), //
				args//
			);
        System.exit(exitcode);
	}
}

 2.打包运行

在hbase中创建emp表(create 'emp','info')。export  jar包($HADOOP_HOME/jars/mapred.jar)

准备数据:上传到HDFS文件系统中(/user/ehp/hbase/importtsv/emp/input)

数据文件 emp.txt

7369	HEHE	CLERK	7902	1980-12-17	800.00		20
7499	ALLEN	SALESMAN	7698	1981-2-20	1600.00	300.00	30
7521	WARD	SALESMAN	7698	1981-2-22	1250.00	500.00	30
7566	JONES	MANAGER	7839	1981-4-2	2975.00		20
7654	MARTIN	SALESMAN	7698	1981-9-28	1250.00	1400.00	30
7698	BLAKE	MANAGER	7839	1981-5-1	2850.00		30
7782	CLARK	MANAGER	7839	1981-6-9	2450.00		10
7788	SCOTT	ANALYST	7566	1987-4-19	3000.00		20
7839	KING	PRESIDENT		1981-11-17	5000.00		10
7844	TURNER	SALESMAN	7698	1981-9-8	1500.00	0.00	30
7876	ADAMS	CLERK	7788	1987-5-23	1100.00		20
7900	JAMES	CLERK	7698	1981-12-3	950.00		30
7902	FORD	ANALYST	7566	1981-12-3	3000.00		20

 

HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`:${HBASE_HOME}/conf \
yarn jar $HADOOP_HOME/jars/mapred.jar \
com.hyman.ehp.mapred.hbase.ImportEmp \
emp \
/user/ehp/hbase/importtsv/emp/input

 

 相关内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下两种方式将HDFS数据导入HBase: 1. 使用HBase提供的工具类:HBase提供了hbase org.apache.hadoop.hbase.mapreduce.ImportTsv这个工具类,可以将TSV、CSV、SequenceFile等格式的数据导入HBase。 使用该工具进行数据导入的步骤如下: (1) 将待导入数据转化为逗号分隔的文本文件(CSV文件),例如: id,name,age 1,张三,18 2,李四,20 3,王五,22 (2) 使用以下命令进行数据导入: $ hadoop jar /path/to/hbase.jar \ org.apache.hadoop.hbase.mapreduce.ImportTsv \ -Dimporttsv.separator=',' \ -Dimporttsv.columns=HBASE_ROW_KEY,cf:name,cf:age \ test_table \ /path/to/data.csv 其,-Dimporttsv.separator=','表示CSV文件字段之间的分隔符为逗号;-Dimporttsv.columns=HBASE_ROW_KEY,cf:name,cf:age表示将CSV文件的第一列作为行键,第二列和第三列分别放入名为cf:name和cf:age的列族。 2. 使用自定义MapReduce程序:如果需要对数据进行自定义转换或多步处理,可以使用自定义的MapReduce程序将数据从HDFS导入HBase。 具体步骤如下: (1) 编写自定义Mapper类,将HDFS数据转换为HBase数据格式。 (2) 编写自定义Reducer类,将Mapper阶段输出的键值对写入HBase。 (3) 配置MapReduce作业,并提交到Hadoop集群上运行。在作业配置指定HBase表的名称、列族以及行键。 (4) 等待MapReduce作业完成,检查HBase数据是否正确导入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值