HBase集成MapReduce

本文详细介绍了HBase与MapReduce的集成方法,包括如何解决因Hadoop中缺失HBase jar包导致的运行错误,以及如何通过拷贝必要jar包至Hadoop classpath来实现两者的无缝对接。

HBase与Mapreduce内部已经做好了集成, 直接调用即可

集成的模式:

1 从Hbase中读取数据就需要考虑谁是map 谁是reduce

  Hbase中读取数据,则可以作为map的输入,输出可以任意指定

2 将数据写到hbase中,Hbase就可以作为reduce的输出

3 从Hbase读取数据,在写到另外一个Hbase中(数据迁移)

在hbase中已经封装好了jar包hbase-server-1.3.1.jar  可以在hadoop中运行hbase的jar包

范例:

在hadoop中运行hbase的jar包 hadoop jar /opt/app/hbase-1.3.1/lib/hbase-server-1.3.1.jar

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/filter/Filter

        at java.lang.Class.getDeclaredMethods0(Native Method)

        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)

        at java.lang.Class.privateGetMethodRecursive(Class.java:3048)

        at java.lang.Class.getMethod0(Class.java:3018)

        at java.lang.Class.getMethod(Class.java:1784)

        at org.apache.hadoop.util.ProgramDriver$ProgramDescription.<init>(ProgramDriver.java:59)

        at org.apache.hadoop.util.ProgramDriver.addClass(ProgramDriver.java:103)

        at org.apache.hadoop.hbase.mapreduce.Driver.main(Driver.java:42)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:498)

        at org.apache.hadoop.util.RunJar.run(RunJar.java:221)

        at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.filter.Filter

        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

        ... 14 more

 

以上的问题出现的原因是,由于在hadoop中运行hbase中的jar包,但是hadoop中并存在hbase的jar,所以运行的时候出现了以上的问题

 

解决方案:

 

把hbase中hadoop需要的jar包拷贝到hadoop中,或者引用到hadoop的classspath路径中才可以使用

 

需要拷贝的jar,命令如下

[hadoop@hadoop01 hbase-1.3.1]$ bin/hbase mapredcp

2019-01-23 16:16:44,147 WARN  [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

/opt/app/hbase-1.3.1/lib/hbase-hadoop-compat-1.3.1.jar:/opt/app/hbase-1.3.1/lib/hbase-common-1.3.1.jar:/opt/app/hbase-1.3.1/lib/htrace-core-3.1.0-incubating.jar:/opt/app/hbase-1.3.1/lib/hbase-client-1.3.1.jar:/opt/app/hbase-1.3.1/lib/zookeeper-3.4.5.jar:/opt/app/hbase-1.3.1/lib/netty-all-4.0.23.Final.jar:/opt/app/hbase-1.3.1/lib/protobuf-java-2.5.0.jar:/opt/app/hbase-1.3.1/lib/guava-12.0.1.jar:/opt/app/hbase-1.3.1/lib/metrics-core-2.2.0.jar:/opt/app/hbase-1.3.1/lib/hbase-prefix-tree-1.3.1.jar:/opt/app/hbase-1.3.1/lib/hbase-protocol-1.3.1.jar:/opt/app/hbase-1.3.1/lib/hbase-server-1.3.1.jar

 

可以把以上的jar包加载到hadoop的classpath路径中,具体的操作如下 编辑/etc/profile


export HBASE_HOME=/opt/app/hbase-1.3.1

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:`$HBASE_HOME/bin/hbase mapredcp`

 

增加完以上的信息之后,hbase与MapReduce就集成成功了


[hadoop@hadoop01 hbase-1.3.1]$ hadoop jar lib/hbase-server-1.3.1.jar

An example program must be given as the first argument.

Valid program names are:

  CellCounter: Count cells in HBase table.

  WALPlayer: Replay WAL files.

  completebulkload: Complete a bulk data load.

  copytable: Export a table from local cluster to peer cluster.

  export: Write table data to HDFS.

  exportsnapshot: Export the specific snapshot to a given FileSystem.

  import: Import data written by Export.

  importtsv: Import data in TSV format.

  rowcounter: Count rows in HBase table.

  verifyrep: Compare the data from tables in two different clusters. WARNING: It doesn't work for incrementColumnValues'd cells since the timestamp is changed after being appended to the log.

再次在hadop中运行Hbase 的jar包

范例:测试统计行数  (这里我统计hbase中的meta表)


hadoop jar lib/hbase-server-1.3.1.jar rowcounter 'hbase:meta'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值