在window系统中的MyEclipse开发基于HBase的MapReduce错误集锦

来源:互联网 发布:做淘宝直通车和刷流量 编辑:程序博客网 时间:2024/05/22 16:54

    在windows10中的MyEclipse10上开发基于HBase的MapReduce,运行时报如下错误:java.lang.RuntimeException: Error while running command to get file permissions : java.io.IOException: Cannot run program "ls": CreateProcess error=2,

在网上搜了好多文章,解决方法:

  把Linux上面的hbase-site.xml复制到工程中(即src下面)并加入:

<property>
    
<name>mapred.job.tracker</name>
    
<value>namenode:9001</value>
</property>

再次运行出现了第二种错误:

java.lang.ClassNotFoundException: org.apache.hadoop.hbase.mapreduce.TableOutputFormat

解决方法:

在hadoop-env.sh中加上

export HBASE_HOME=/home/lvyuan/hbase

export HADOOP_CLASSPATH=$HBASE_HOME/hbase-0.94.6.jar:$HBASE_HOME/hbase-0.94.6-tests.jar:$HBASE_HOME/conf:$HBASE_HOME/lib/zookeeper-3.4.5.jar:$HBASE_HOME/lib/protobuf-java-2.4.0a.jar

  需要注意的是:如果你是真集群分布式,有多台虚拟机,那么每台都要修改;另外如果不加$HBASE_HOME/lib/protobuf-java-2.4.0a.jar,会报这个错java.lang.ClassNotFoundException:com.google.protobuf.Message

再次运行出现了第三种错误:

java.lang.ClassNotFoundException:Hbase$MyMapper


意思就是找不到mapper类,解决方法:去掉src下面的hbase-site.xml中的
<property>
    
<name>mapred.job.tracker</name>
    
<value>namenode:9001</value>
</property>
,去掉以后,改为在java代码中加入这一行,config.set("mapred.job.tracker", "master:9001");//这句非常关键,

然后运行成功

下面贴上我的完整代码



import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;

/**
 * 基于Hbase的WordCount
 * 通过Mr操作Hbase的“word”表,对“content:info”中的短文做词频统计,并将统计结果写入“stat”表的“content:info”中,行键为单词
 * @author
 *
 */
public class HBaseMr {

    static Configuration config=null;
    static{
        config=HBaseConfiguration.create();
        config.set("hbase.zookeeper.quorum","master,slave1,slave3");//这里忘了写master
        config.set("hbase.zookeeper.property.clientPort","2181");
        config.set("mapred.job.tracker", "master:9001");//这句非常关键
    }
    public static final String tableName="word";
    public static final String colf="content";
    public static final String col="info";
    public static final String tableName2="stat";
    public static class MyMapper extends TableMapper<Text,IntWritable>{
        private final static IntWritable one=new IntWritable(1);
        private Text word=new Text();
        @Override
        protected void map(ImmutableBytesWritable key, Result value,
                Context context) throws IOException, InterruptedException {
            String words=Bytes.toString(value.getValue(Bytes.toBytes(colf),Bytes.toBytes(col)));
            String itr[]=words.toString().split(" ");
            for(int i=0;i<itr.length;i++){
                word.set(itr[i]);
                context.write(word, one);
            }
        }
    }
    public static class MyReducer extends TableReducer<Text,IntWritable,ImmutableBytesWritable>{

        @Override
        protected void reduce(Text key, Iterable<IntWritable> values,Context context)
                throws IOException, InterruptedException {
            int sum=0;
            for(IntWritable val:values){
                sum+=val.get();
            }
            Put put=new Put(Bytes.toBytes(key.toString()));
            put.add(Bytes.toBytes(colf), Bytes.toBytes(col), Bytes.toBytes(String.valueOf(sum)));
            context.write(new ImmutableBytesWritable(Bytes.toBytes(key.toString())),put);
        }
        
    }
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        Job job=new Job(config,"HBaseMr");
        job.setJarByClass(HBaseMr.class);
        Scan scan=new Scan();
        //指定要查询的列族
        scan.addColumn(Bytes.toBytes(colf), Bytes.toBytes(col));
        //指定Mapper读取的表为word
        TableMapReduceUtil.initTableMapperJob(tableName, scan, MyMapper.class,Text.class,IntWritable.class, job);
        //指定Reducer写入的表为stat
        TableMapReduceUtil.initTableReducerJob(tableName2, MyReducer.class, job);
        System.exit(job.waitForCompletion(true)?0:1);

    }

}


2 0