hadoop执行hdfs文件到hbase表插入操作(xjl456852原创)

时间:2021-11-11 00:45:58

本例中需要将hdfs上的文本文件,解析后插入到hbase的表中.

本例用到的hadoop版本2.7.2 hbase版本1.2.2

hbase的表如下:
  1. create 'ns2:user', 'info'
hdfs上的文本文件如下[data/hbase_input/hbase.txt]
  1. 1,xiejl,20
  2. 2,haha,30
  3. 3,liudehua,40
  4. 4,daoming,41
可以通过命令查看hadoop的classpath现在包含哪些jar包:
  1. [hadoop@master ~]$ hdfs classpath

java的主方法:
  1. package com.xjl456852.mapreduce;
  2. import org.apache.hadoop.fs.Path;
  3. import org.apache.hadoop.hbase.client.Put;
  4. import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
  5. import org.apache.hadoop.hbase.mapreduce.TableOutputFormat;
  6. import org.apache.hadoop.io.Text;
  7. import org.apache.hadoop.mapreduce.Job;
  8. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  9. import java.io.IOException;
  10. /**
  11. * 将hdfs中的文本文件写入到hbase的表中
  12. * 程序的运行需要加入hadoop的配置文件和hbase的配置文件到jar包中
  13. * 对应的hbase的表
  14. * create 'ns2:user','info'
  15. *
  16. * Created by xiejl on 2016/8/10.
  17. */
  18. public class HBaseApp {
  19. public static void main(String [] args) {
  20. try {
  21. Job job = Job.getInstance();
  22. job.setJobName("text into hbase table");
  23. job.setJarByClass(HBaseApp.class);
  24. FileInputFormat.addInputPath(job, new Path(args[0]));
  25. //设置表名
  26. job.getConfiguration().set(TableOutputFormat.OUTPUT_TABLE, args[1]);
  27. //设置输出格式为table
  28. job.setOutputFormatClass(TableOutputFormat.class);
  29. //设置输出的key类型为ImmutableBytesWritable
  30. job.setOutputKeyClass(ImmutableBytesWritable.class);
  31. //设置输出的value类型为Put
  32. job.setOutputValueClass(Put.class);
  33. //因为map输出key和reduce输出的key类型不一致,所以需要再设置map的key输出类型为Text
  34. job.setMapOutputKeyClass(Text.class);
  35. //因为map输出value和reduce输出的value类型不一致,所以需要再设置map的value输出类型为Text
  36. job.setMapOutputValueClass(Text.class);
  37. //Mapper
  38. job.setMapperClass(MyMapper.class);
  39. //Reducer
  40. job.setReducerClass(MyReducer.class);
  41. System.exit(job.waitForCompletion(true) ? 0 : 1);
  42. } catch (InterruptedException e) {
  43. e.printStackTrace();
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. } catch (ClassNotFoundException e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. }
Mapper类:
  1. package com.xjl456852.mapreduce;
  2. import org.apache.hadoop.io.LongWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Mapper;
  5. import java.io.IOException;
  6. /**
  7. * Created by xiejl on 2016/8/10.
  8. */
  9. public class MyMapper extends Mapper<LongWritable, Text, Text, Text> {
  10. @Override
  11. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  12. String line = value.toString();
  13. int index = line.indexOf(",");
  14. String rowKey = line.substring(0, index);
  15. //跳过逗号
  16. String valueLine = line.substring(index+1);
  17. context.write(new Text(rowKey), new Text(valueLine));
  18. }
  19. }
Reducer类:
  1. package com.xjl456852.mapreduce;
  2. import org.apache.hadoop.hbase.client.Put;
  3. import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
  4. import org.apache.hadoop.hbase.util.Bytes;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Reducer;
  7. import java.io.IOException;
  8. /**
  9. * Created by xiejl on 2016/8/11.
  10. */
  11. public class MyReducer extends Reducer<Text, Text, ImmutableBytesWritable, Put> {
  12. @Override
  13. protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
  14. byte[] rowKey = Bytes.toBytes(key.toString());
  15. for(Text text : values) {
  16. //设置put对象的行键
  17. Put put = new Put(rowKey);
  18. String line = text.toString();
  19. int index = line.indexOf(",");
  20. String name = line.substring(0, index);
  21. String age = line.substring(index+1);
  22. //列族的是建表时固定的,列和值是插入时添加的.
  23. put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"),Bytes.toBytes(name));
  24. put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age"),Bytes.toBytes(age));
  25. context.write(new ImmutableBytesWritable(Bytes.toBytes(key.toString())), put);
  26. }
  27. }
  28. }
将程序打为jar包,jar包中需要加入hadoop的配置文件和hbase的配置 (有人将程序打成胖包,就是将依赖的jar,依赖的四个类库hbase-client,hbase-server,hbase-common,hbsae-protocol放入lib目录中,我试验不行,会出现map和reduce任务都执行到100%时卡住不动,等十分钟又出现 FAILED AttemptID:attempt_xxx Timed out after 600 secs,然后又重新执行mapreduce任务,然后又卡住,得结束掉mapreduce进程才能终止)

需要修改集群的配置文件,以满足hadoop执行hbase表插入操作时,能找到相关的类库.

将HBase的类jar包加到hadoop的classpath下, 修改${HADOOP_HOME}/etc/hadoop/hadoop-env.sh。配置好这个文件,分发到各个节点,改这个配置不用重启集群.

  1. TEMP=`ls /opt/modules/hbase/lib/*.jar`
  2. HBASE_JARS=`echo $TEMP | sed 's/ /:/g'`
  3. HADOOP_CLASSPATH=$HBASE_JARS

如果现在运行程序还是会出错,详情可以看我的另一篇文章.hadoop执行hbase插入表操作,出错:Stack trace: ExitCodeException exitCode=1:(xjl456852原创)

还需要在${HADOOP_HOME}/etc/hadoop/yarn-site.xml中加入mapreduce运行时需要的类库,需要设置yarn.application.classpath:
所以我在yarn-site.xml中加入了如下配置,并加入了hbase的lib目录,配置好这个文件,分发到各个节点,这个配置需要重启集群
  1. <property>
  2. <name>yarn.application.classpath</name>
  3. <value>
  4. /opt/modules/hadoop/etc/*,
  5. /opt/modules/hadoop/etc/hadoop/*,
  6. /opt/modules/hadoop/lib/*,
  7. /opt/modules/hadoop/share/hadoop/common/*,
  8. /opt/modules/hadoop/share/hadoop/common/lib/*,
  9. /opt/modules/hadoop/share/hadoop/mapreduce/*,
  10. /opt/modules/hadoop/share/hadoop/mapreduce/lib/*,
  11. /opt/modules/hadoop/share/hadoop/hdfs/*,
  12. /opt/modules/hadoop/share/hadoop/hdfs/lib/*,
  13. /opt/modules/hadoop/share/hadoop/yarn/*,
  14. /opt/modules/hadoop/share/hadoop/yarn/lib/*,
  15. /opt/modules/hbase/lib/*
  16. </value>
  17. </property>

然后执行:
  1. hadoop jar hbase.jar com.xjl456852.mapreduce.HBaseApp data/hbase_input ns2:user
查看hbase的表内容:
  1. hbase(main):001:0> scan 'ns2:user'
  2. ROW COLUMN+CELL
  3. 1 column=info:age, timestamp=1470966325326, value=20
  4. 1 column=info:name, timestamp=1470966325326, value=xiejl
  5. 2 column=info:age, timestamp=1470966325326, value=30
  6. 2 column=info:name, timestamp=1470966325326, value=haha
  7. 3 column=info:age, timestamp=1470966325326, value=40
  8. 3 column=info:name, timestamp=1470966325326, value=liudehua
  9. 4 column=info:age, timestamp=1470966325326, value=41
  10. 4 column=info:name, timestamp=1470966325326, value=daoming
  11. 4 row(s) in 0.3100 seconds
可以看到数据已经插入到hbase表中.


还可以将Reducer类写成继承TableReducer方式,代码如下,执行后会有同样的结果:
  1. package com.xjl456852.mapreduce;
  2. import org.apache.hadoop.hbase.client.Put;
  3. import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
  4. import org.apache.hadoop.hbase.mapreduce.TableReducer;
  5. import org.apache.hadoop.hbase.util.Bytes;
  6. import org.apache.hadoop.io.Text;
  7. import java.io.IOException;
  8. /**
  9. * 如果继承TableReducer,从源码中可以看到,输出的value是Mutation类型,也就是输出的值可以是Put,Delete之类的类型
  10. * Created by xiejl on 2016/8/11.
  11. */
  12. public class MyReducer2 extends TableReducer<Text, Text, ImmutableBytesWritable> {
  13. @Override
  14. protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
  15. byte[] rowKey = Bytes.toBytes(key.toString());
  16. for(Text text : values) {
  17. //设置put对象的行键
  18. Put put = new Put(rowKey);
  19. String line = text.toString();
  20. int index = line.indexOf(",");
  21. String name = line.substring(0, index);
  22. String age = line.substring(index+1);
  23. //列族的是建表时固定的,列和值是插入时添加的.
  24. put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"),Bytes.toBytes(name));
  25. put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age"),Bytes.toBytes(age));
  26. context.write(new ImmutableBytesWritable(Bytes.toBytes(key.toString())), put);
  27. }
  28. context.getCounter("reduce", "over").increment(1);
  29. }
  30. }


hadoop执行hdfs文件到hbase表插入操作(xjl456852原创)的更多相关文章

  1. BulkLoad加载本地文件到HBase表

    BulkLoad加载文件到HBase表 1.功能 将本地数据导入到HBase中 2.原理 BulkLoad会将tsv/csv格式的文件编程hfile文件,然后再进行数据的导入,这样可以避免大量数据导入 ...

  2. Hadoop之HDFS文件操作常有两种方式(转载)

    摘要:Hadoop之HDFS文件操作常有两种方式,命令行方式和JavaAPI方式.本文介绍如何利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件    命令行     Java API HD ...

  3. Hadoop之HDFS文件操作

    摘要:Hadoop之HDFS文件操作常有两种方式.命令行方式和JavaAPI方式.本文介绍怎样利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件    命令行     Java API HD ...

  4. HDFS文件和HIVE表的一些操作

    1. hadoop fs -ls  可以查看HDFS文件 后面不加目录参数的话,默认当前用户的目录./user/当前用户 $ hadoop fs -ls 16/05/19 10:40:10 WARN ...

  5. hadoop的hdfs文件操作实现上传文件到hdfs

    这篇文章主要介绍了使用hadoop的API对HDFS上的文件访问,其中包括上传文件到HDFS上.从HDFS上下载文件和删除HDFS上的文件,需要的朋友可以参考下hdfs文件操作操作示例,包括上传文件到 ...

  6. Hadoop 执行 hdfs 命令烦人的警告信息

    问题描述: 安装完 hadoop,执行 hdfs dfs -ls 命令时,报警告如下: -- ::, WARN util.NativeCodeLoader: Unable to load native ...

  7. Java 向Hbase表插入数据报(org&period;apache&period;hadoop&period;hbase&period;client&period;HTablePool&dollar;PooledHTable cannot be cast to org&period;apac)

    org.apache.hadoop.hbase.client.HTablePool$PooledHTable cannot be cast to org.apac 代码: //1.create HTa ...

  8. Java 向Hbase表插入数据报(org&period;apache&period;hadoop&period;hbase&period;client&period;HTablePool&dollar;PooledHTable cannot be cast to org&period;apac

    org.apache.hadoop.hbase.client.HTablePool$PooledHTable cannot be cast to org.apac 代码: //1.create HTa ...

  9. Java 向Hbase表插入数据异常org&period;apache&period;hadoop&period;hbase&period;client&period;HTablePool&dollar;PooledHTable cannot be cast to org&period;apache&period;client&period;HTable

    出错代码如下: //1.create HTablePool HTablePool hp=new HTablePool(con, 1000); //2.get HTable from HTablepoo ...

随机推荐

  1. DDD开发框架ABP之本地化资源的数据库存储扩展

    在上一篇<DDD开发框架ABP之本地化/多语言支持>中,我们知道,ABP开发框架中本地化资源存储可以采用XML文件,RESX资源文件,也提供了其他自定义的存储方式的扩展接口.ABP框架默认 ...

  2. socket 中午吃的啥

    http://www.cnblogs.com/thinksasa/archive/2013/02/26/2934206.html

  3. 农村的&OpenCurlyDoubleQuote;无为教育” &lpar;FW&rpar;

    农村的“无为教育” 发布时间:2009年11月5日 11时33分 “以孩子影响孩子”,准确地说,是以偏远乡村贫困家庭的进取孩子,影响城市有相当收入的“问题孩子”.有两点值得注意,一是农村孩子影响城市孩 ...

  4. C&plus;&plus; Code&lowbar;HotKey

            Code::使用HotKeyCtrl定义一个系统热键 // 关联HotKeyCtrl控件变量 m_HotKey1       BEGIN_MESSAGE_MAP(CXyzDlg, CD ...

  5. 《深入Java虚拟机学习笔记》- 第14章 浮点运算

    <深入Java虚拟机学习笔记>- 第13章 浮点运算

  6. calc&lpar;&rpar; ---一个会计算的css属性

    最近这个月一直在赶项目开发,遇到的问题和学到的前端知识没有更新到博客园,现在闲了下来,就整理一下前端知识. 在项目开发中,在样式这方面花费的时间较多,因为针对于数字的变化特别多,本人不爱记数字,在看设 ...

  7. 英语口语练习系列-C01-好棒

    古诗 来自百度 It's cool. It is neat. It's righteous! It's righteous! 酷毙了! righteous是 cool 的高级了 如果一件事让你无法用 ...

  8. URLConnection(互联网)

    一.urlconnection连接Servlet 1:> URL请求的类别:           分为二类,GET与POST请求.二者的区别在于:                         ...

  9. opencv3——ANN算法的使用

    最近刚转用opencv3,使用ANN算法时遇到了一些问题,记录下来. 训练神经网络的代码如下: //创建ANN Ptr<ANN_MLP> bp = ANN_MLP::create(); 设 ...

  10. am335x ti SDK6&period;0 kernel 时钟源码文件记录

    源码流程记录 板级文件开始 // arch/arm/mach-omap2/board-aplex_cmi_at101.c MACHINE_START(APLEX_CMI_AT101, "ap ...