java - hadoop 中的 ClassCastException

标签 java hadoop

当我启动 may mapreduce 程序时,我收到此错误:

java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.BytesWritable
at nflow.hadoop.flow.analyzer.Calcul$Calcul_Mapper.map(Calcul.java:1)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)

映射器的代码:
public static class Calcul_Mapper extends Mapper<LongWritable, BytesWritable, Text, Text>{

    String delimiter="|";
    long interval = 60*60 ;

    Calendar cal;

    public void map(LongWritable key, BytesWritable value, Context context) throws IOException, InterruptedException {      

        byte[] value_bytes = value.getBytes();
        if(value_bytes.length < FlowWritable.MIN_PKT_SIZE + FlowWritable.PCAP_HLEN) return; 


        EZBytes eb = new EZBytes(value_bytes.length);
        eb.PutBytes(value_bytes, 0, value_bytes.length);

        // C2S key ==> protocol | srcIP | dstIP | sPort |dPort
        long sys_uptime = Bytes.toLong(eb.GetBytes(FlowWritable.PCAP_ETHER_IP_UDP_HLEN+4,4));
        long timestamp = Bytes.toLong(eb.GetBytes(FlowWritable.PCAP_ETHER_IP_UDP_HLEN+8,4))*1000000
            + Bytes.toLong(BinaryUtils.flipBO(eb.GetBytes(FlowWritable.PCAP_ETHER_IP_UDP_HLEN+12, 4),4));


        int count = eb.GetShort(FlowWritable.PCAP_ETHER_IP_UDP_HLEN+2);

        FlowWritable fw;
        byte[] fdata = new byte[FlowWritable.FLOW_LEN];
        int cnt_flows = 0;
        int pos = FlowWritable.PCAP_ETHER_IP_UDP_HLEN+FlowWritable.CFLOW_HLEN;

        try{
            while(cnt_flows++ < count){ 
                fw = new FlowWritable();
                fdata = eb.GetBytes(pos, FlowWritable.FLOW_LEN);

                if(fw.parse(sys_uptime, timestamp, fdata)){
                    context.write(new Text("Packet"), new Text(Integer.toString(1)));
                    context.write(new Text("Byte"), new Text(Integer.toString(1)));
                    context.write(new Text("Flow"), new Text(Integer.toString(1)));
                    context.write(new Text("srcPort"), new Text(Integer.toString(fw.getSrcport())));
                    context.write(new Text("dstPort"), new Text(Integer.toString(fw.getDstport())));                        
                    context.write(new Text("srcAddr"), new Text(fw.getSrcaddr()));
                    context.write(new Text("dstAddr"), new Text(fw.getDstaddr()));
                }else{

                }   
                pos += FlowWritable.FLOW_LEN;
            }           
        } catch (NumberFormatException e) {                           
        }
    }
}

请问有人知道出了什么问题吗?

最佳答案

你能检查一下你的工作配置吗?特别检查那些:

conf.setOutputKeyClass(Something.class);
conf.setOutputValueClass(Something.class);

顺便说一句,因为您的 key 始终固定为常数;您不需要为 map 函数的每个发射创建它们。

而且我认为如果您有一个将所有内容组合在一起的自定义键对象会更好。为此,您需要扩展 对象可写 并实现可写可比 .

你的写作/发射在我看来非常可疑。

关于java - hadoop 中的 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21652278/

相关文章:

java - 是否可以将 PostgreSQL 中的字符字段转换为 JPA 命名查询中的整数?

hadoop - 如何在 oozie 电子邮件通知中包含详细信息日志信息(hue --workflow--Editor)

java:当前上下文中未知的变量?打开新的 JFrame 并调用子类时值(value)损失

java - 如何为android提供的不同日期和时间格式的视频添加时间戳?

java - 使用 Eclipse 测试 android 中的 Intent

Java利用多个IP使用线程进行网页爬取

hadoop - Spark : Copy files from HDFS to local FS within function?

java - 使用 Hbase 自定义过滤器时出现异常

hadoop - 从 Hadoop 0.20.2 迁移到 0.20.205 以及从 0.20.2 迁移到 1.0.1 需要付出多少努力?

java - 如果我使用 golang 编写一个 NoSQL 数据库,但想在其上运行 Hadoop mapreduce,我会遇到什么困难?