编写MapReduce程序访问HBase 遇到的问题与解决方法

        根据工作需求,需要测试 MapReduce 程序访问HBase 的性能。由于本人面对MapReduce,HBase都是新手,所以在这个过程中遇到了很多问题,主要如下 :

  1. MapReduce 程序如何引用第三方 jar 包

  2. MapReduce 访问HBase 的安全认证问题 (kerberos)

  3. Hadoop HBase 的conf文件的设定问题




第一个问题解决办法:(这个问题在网上解决办法很多)

  1. 1.  使用 -libjars 参数。  hadoop jar  xxx.jar  -libjars  (xx.jar,yy.jar 逗号隔开)  .....

    然后,在程序中执行:

    1
    2
    3
    TableMapReduceUtil.addDependencyJars(job);
    TableMapReduceUtil.addDependencyJars(job.getConfiguration(),
              org.apache.hadoop.hbase.util.Bytes.class);
  2. 2.   在程序中通过tmpjars参数设定

             job.getConfiguration().set("tmpjars",jars);

             jars为所有外部jar包字符串形式,英文逗号分隔。

             在运行hadoop命令时,可通过参数的方式,把所需要的外部jar包(绝对路径)引入,然后再mapreduce程序中对该参数进行处理,并通过

             job.getConfiguration().set("tmpjars",jars);进行设置。

  3. 3.  方法三(没试过):http://blog.sina.com.cn/s/blog_6638b10d0101bn53.html

  4. 4.  直接在MapReduce程序中 进行 DistributedCache.addFileToClassPath() 编程,将需要的jar放进去, 现在还不会

  5. 5.  第三方jar文件和自己的程序打包到一个jar文件中,程序通过job.getJar()将获得整个文件并将其传至hdfs上,试过 没成功,估计我太2了。

  6. 6.   我的方法:HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` ,直接将当前session的HADOOP_CLASSPATH进行修改,添加HBase的CLASSPATH.

    好处: 简单方便,对第三个问题的解决有帮助。


第二个问题解决办法:


    ​其实解决这个问题很简单,只是新手对HBASE编程不熟造成的。

    ​只需要在 job 设置好以后, 执行 TableMapReduceUtil.initCredentials(job); 该语句为 job 获取访问HBase 的授权Token。


第三个问题解决办法:


    ​之所以有这个问题,是因为:访问hbase时,需要制定hbase集群的 quorum,security 配置等等。如果直接在 jobconf 中设定这些属性, 那么后续配置更改以后,会造成程序维护的困难。那么比较好的办法就是所有配置还是从配置文件中读取,然后合并hbase conf 到 job conf中。  HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf));  需要设置 HADOOP_CLASSPATH, 如前所述。


最终程序的一个框架如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class HBaseMapTest extends Configured implements Tool {
     
    private static Configuration conf;
    public static class RandomReadMapper extends
            Mapper<Object, Text, Text, Text> {
  
        HTable testTable = null;
        public void setup(Context context) throws IOException,
                InterruptedException {
            super.setup(context);
            try {
                testTable = new HTable(context.getConfiguration(),"");        //获取table
            catch (Exception e) {
                System.out.println("Error Info: " + e.getMessage());
            }
        }
  
        public void map(Object arg0, Text arg1, Context context)
                throws IOException, InterruptedException {    
            //htable op                                                       //hbase 操作
        }
    }
  
        public int run(String[] args) throws Exception {
  
            conf = getConf();
            HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf));   //合并 jobconf  hbase_conf
              
            final Job job = new Job(conf, "HBaseMRTest");
            job.setJarByClass(HBaseMapTest.class);
              
            job.setMapperClass(RandomReadMapper.class);
            job.setNumReduceTasks(0);
      
            job.setSpeculativeExecution(false);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(LongWritable.class);
            FileInputFormat.addInputPath(job, inDir);
            FileOutputFormat.setOutputPath(job, outDir);
      
            TableMapReduceUtil.addDependencyJars(job);                          //解决jar包 依赖
            TableMapReduceUtil.addDependencyJars(job.getConfiguration(),
                      org.apache.hadoop.hbase.util.Bytes.class);
            TableMapReduceUtil.initCredentials(job);                            //给job赋予访问hbase的权限
              
            job.waitForCompletion(true);
            return 0;
        }
  
    public static void main(String[] args) throws Exception {
        int res = ToolRunner.run(new Configuration(), new HBaseMapTest(), args);
        System.exit(res);
    }
}




阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 配置mapreduce程序访问操作hbase的hadoop环境: 要配置mapreduce程序访问操作HBase的Hadoop环境,需要执行以下步骤: 1)安装和配置Hadoop和HBase:首先,需要正确安装和配置Hadoop和HBase,以确保它们正常启动并可以相互通信。 2)引入Hadoop和HBase依赖项:在mapreduce程序的pom.xml(如果使用Maven构建)或build.gradle文件中,需要将Hadoop和HBase的依赖项添加为项目的依赖项。 3)编写mapreduce程序:在mapreduce程序中,需要使用HBase提供的Java API来读取和写入HBase表。 4)设置Hadoop和HBase的配置:在程序中,需要使用Hadoop的Configuration类和HBaseHbaseConfiguration类来设置Hadoop和HBase的配置信息,如HBase的ZooKeeper地址、Hadoop的文件系统等。 5)编写mapreduce程序的输入和输出格式:在mapreduce程序中,需要指定输入数据的格式(如TextInputFormat)和输出数据的格式(如TableOutputFormat)。 6)配置HBase的输入和输出表:在程序中,需要使用HBase的TableMapReduceUtil类来设置输入和输出表的信息,包括表的名称、列族等。 7)运行mapreduce程序:将编译后的mapreduce程序提交到Hadoop集群上以运行,程序访问和操作HBase的数据。 2. HBase mapreduce程序设计: 设计HBase mapreduce程序需要考虑以下几个方面: 1)Mapper类的实现:需要自定义Mapper类,继承自Hadoop的Mapper类,并重写map方法。在map方法中,可以根据需求读取HBase表中的数据,并将结果输出为键值对形式。 2)Reducer类的实现:需要自定义Reducer类,继承自Hadoop的Reducer类,并重写reduce方法。在reduce方法中,可以对Mapper输出的键值对进行处理,并将结果写入HBase表中。 3)输入和输出格式的设置:可以使用Hadoop提供的TextInputFormat等格式类来设置程序的输入数据格式。对于输出,可以使用HBase提供的TableOutputFormat类将结果写入HBase表中。 4)配置程序的输入和输出表:可以使用HBase的TableMapReduceUtil类来设置程序的输入表和输出表的信息,包括表的名称、列族等。 5)程序的参数设置:可以使用Hadoop的Configuration类来设置程序的参数,如HBase的ZooKeeper地址、Hadoop的文件系统等。 6)运行程序:将编译后的mapreduce程序提交到Hadoop集群上以运行,程序将按照设定的逻辑读取HBase表中的数据并进行处理,并将结果写入HBase表中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mt0803

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值