hadoop错误总结
来源:互联网 发布:管家婆软件免费版教程 编辑:程序博客网 时间:2024/06/06 09:13
在尝试使用hbase中的数据作为MR(MapReduce)的输入源的时候,遇到了一个看似莫名其妙的问题!
这是我的源码
package com.yc.hbase.mapreduce;import java.io.IOException;import java.util.Arrays;import java.util.Date;import java.util.List;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.hbase.Cell;import org.apache.hadoop.hbase.CellUtil;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.HColumnDescriptor;import org.apache.hadoop.hbase.HTableDescriptor;import org.apache.hadoop.hbase.TableName;import org.apache.hadoop.hbase.client.Admin;import org.apache.hadoop.hbase.client.Connection;import org.apache.hadoop.hbase.client.ConnectionFactory;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.client.Result;import org.apache.hadoop.hbase.client.ResultScanner;import org.apache.hadoop.hbase.client.Scan;import org.apache.hadoop.hbase.client.Table;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.util.Bytes;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.Mapper;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class HbaseAndMapReduce { public static void main(String[] args) throws Exception { //测试数据 //testData(); //show(); //完成的作业是: 有共同爱好的人 System.exit(run()); /* * TableMapper //对输出hbase数据来格式分割的处理类 * TableReducer //对输入hbase数据来统计处理的处理类 * TableOutputFormat //来自hbase的格式 * TableInputFormat //输入hbase的格式 */ } public static void show(){ Admin admin = null; Connection con = null; try { Configuration conf = HBaseConfiguration.create(); //获得配制文件对象 conf.set("hbase.zookeeper.quorum", "192.168.1.123"); con = ConnectionFactory.createConnection(conf); //获得连接对象 admin = con.getAdmin(); //3.操作 //建立数据库 //a.判断数据库是否存在 TableName tn = TableName.valueOf("blog2"); //创建表名对象 Scan scan = new Scan(); Table table03 = con.getTable(tn); //获得表对象 ResultScanner rs = table03.getScanner(scan); for (Result result : rs) { List<Cell> cs = result.listCells(); for (Cell cell : cs) { String rowKey = Bytes.toString(CellUtil.cloneRow(cell)); //取行键 long timestamp = cell.getTimestamp(); //取到时间戳 String family = Bytes.toString(CellUtil.cloneFamily(cell)); //取到族列 String qualifier = Bytes.toString(CellUtil.cloneQualifier(cell)); //取到修饰名 String value = Bytes.toString(CellUtil.cloneValue(cell)); //取到值 System.out.println(" ===> rowKey : " + rowKey + ", timestamp : " + timestamp + ", family : " + family + ", qualifier : " + qualifier + ", value : " + value); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static int run() throws Exception {// conf = new Configuration(); Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "192.168.1.123"); Job job = Job.getInstance(conf, "findFriend"); job.setJarByClass(HbaseAndMapReduce.class); Scan scan = new Scan(); //取对业务有用的数据 tags, nickname scan.addColumn(Bytes.toBytes("article"), Bytes.toBytes("tags")); scan.addColumn(Bytes.toBytes("author"), Bytes.toBytes("nickname")); //数据来源 hbase// TableInputFormat.addColumns(scan, columns); //ImmutableBytesWritable来自hbase数据的类型 TableMapReduceUtil.initTableMapperJob("blog2", scan, FindFriendMapper.class, ImmutableBytesWritable.class, Result.class, job); FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.1.123:9000/out/" + new Date().getTime())); return job.waitForCompletion(false) ? 0 : 1; } public static class FindFriendMapper extends TableMapper<ImmutableBytesWritable, Result>{ @Override //key是hbase中的行键 //value是hbase中的所行键的所有数据 protected void map( ImmutableBytesWritable key, Result value, Mapper<ImmutableBytesWritable, Result, ImmutableBytesWritable, Result>.Context context) throws IOException, InterruptedException { System.out.println("key :: " + Bytes.toString(key.get())); List<Cell> cs = value.listCells(); System.out.print("value :: "); for (Cell cell : cs) { String rowKey = Bytes.toString(CellUtil.cloneRow(cell)); long timestamp = cell.getTimestamp(); String family = Bytes.toString(CellUtil.cloneFamily(cell)); String qualifier = Bytes.toString(CellUtil.cloneQualifier(cell)); String val = Bytes.toString(CellUtil.cloneValue(cell)); System.out.println("RowKey=" + rowKey + ", Timestamp=" + timestamp + ", Family=" + family + ", Qualifier=" + qualifier + ", Val=" + val); } super.map(key, value, context); } } public static void testData() { try { Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "192.168.1.123"); Connection con = ConnectionFactory.createConnection(conf); Admin admin = con.getAdmin(); TableName tn = TableName.valueOf("blog2"); if (admin.tableExists(tn)) { admin.disableTable(tn); admin.deleteTable(tn); } HTableDescriptor htd = new HTableDescriptor(tn); HColumnDescriptor hcd01 = new HColumnDescriptor("article"); htd.addFamily(hcd01); HColumnDescriptor hcd02 = new HColumnDescriptor("author"); htd.addFamily(hcd02); admin.createTable(htd); Table t = con.getTable(tn); Put put = new Put(Bytes.toBytes("1")); put.addColumn(Bytes.toBytes("article"), Bytes.toBytes("content"), Bytes.toBytes("HBase is the Hadoop database. Use it when you need random, " + "realtime read/write access to your Big Data")); put.addColumn(Bytes.toBytes("article"), Bytes.toBytes("tags"), Bytes.toBytes("HBase,NoSql,Hadoop")); put.addColumn(Bytes.toBytes("article"), Bytes.toBytes("title"), Bytes.toBytes("Head First Hbase")); put.addColumn(Bytes.toBytes("author"), Bytes.toBytes("name"), Bytes.toBytes("zhangsan")); put.addColumn(Bytes.toBytes("author"), Bytes.toBytes("nickname"), Bytes.toBytes("sansan")); Put put02 = new Put(Bytes.toBytes("10")); put02.addColumn(Bytes.toBytes("article"), Bytes.toBytes("tags"), Bytes.toBytes("Hadoop")); put02.addColumn(Bytes.toBytes("author"), Bytes.toBytes("nickname"), Bytes.toBytes("xiaoshi")); Put put03 = new Put(Bytes.toBytes("100")); put03.addColumn(Bytes.toBytes("article"), Bytes.toBytes("tags"), Bytes.toBytes("hbase,nosql")); put03.addColumn(Bytes.toBytes("author"), Bytes.toBytes("nickname"), Bytes.toBytes("superman")); List<Put> puts = Arrays.asList(put, put02, put03); t.put(puts); System.out.println("==========> 测试数据准备完成..."); if (admin != null){ admin.close(); } if(con != null){ con.close(); } } catch (IOException e) { e.printStackTrace(); } }}
这是报错提示:
[17 20:57:06,187 DEBUG] org.apache.hadoop.security.UserGroupInformation - PrivilegedActionException as:wrm (auth:SIMPLE) cause:0: No such file or directoryException in thread "main" [17 20:57:06,214 DEBUG] org.apache.hadoop.ipc.Client - stopping client from cache: org.apache.hadoop.ipc.Client@a527eb0: No such file or directory at org.apache.hadoop.io.nativeio.NativeIO$POSIX.chmod(NativeIO.java:236) at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:652) at org.apache.hadoop.fs.FilterFileSystem.setPermission(FilterFileSystem.java:490) at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:599) at org.apache.hadoop.mapreduce.JobSubmitter.copyAndConfigureFiles(JobSubmitter.java:179) at org.apache.hadoop.mapreduce.JobSubmitter.copyAndConfigureFiles(JobSubmitter.java:301) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:389) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1285) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1282) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Unknown Source) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1656) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1282) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1303) at com.yc.hbase.mapreduce.HbaseAndMapReduce.run(HbaseAndMapReduce.java:106) at com.yc.hbase.mapreduce.HbaseAndMapReduce.main(HbaseAndMapReduce.java:39)
又是文件找不到,又是用户找不到的,看到这个问题一开始,真的是一头雾水!当然,很容易能想到,TableMapReduceUtil.initTableMapperJob的底层肯定是将Hbase中的 数据先查到生成一个文件,然后以这个文件为源进入mapreduce进行操作。那么就很奇怪了啊!这个文件是HBase的底层生成的,不是我所写的代码,到底为什么就是找不到这个文件呢!?
我首先做的第一步是进入NativeIO中查看报错的地方,发现这里有一个path,于是便将这个源码复制到自己的项目中,将这个path输出到控制台
public static void chmod(String path, int mode) throws IOException { if (!Shell.WINDOWS) { chmodImpl(path, mode); } else { try { //这是自己加的 System.out.printf(path); chmodImpl(path, mode); } catch (NativeIOException nioe) { if (nioe.getErrorCode() == 3) { throw new NativeIOException("No such file or directory", Errno.ENOENT); } else { LOG.warn(String.format("NativeIO.chmod error (%d): %s", nioe.getErrorCode(), nioe.getMessage())); throw new NativeIOException("Unknown error", Errno.UNKNOWN); } } } }
发现这个文件的路径是这样的
C:\tmp\hadoop-wrm\mapred\staging\wrm61821100\.staging\job_local61821100_0001
但是很奇怪的是,在我的C盘中,连tmp目录都没有。证明文件根本就没有创建。这时候我的思维陷入了一段误区,由于前面的log显示我的用户wrm是无法找到的,我便开始怀疑是否是wrm用户没有权限访问hadoop,用命令行进入hdfs后发现hbase目录还真的没有权限,在改了权限后,满心欢喜的测试,结果还是不行!
这个问题折磨了我两天,最后竟然真的是权限问题,但是并不是hadoop中的权限问题!而是windows中!在灵光一闪中我想到了去看看我C盘的权限,发现竟然没有写入权限!咳咳、、、、、在赋予了uesr写入权限后,问题解决了T.T,真像扇自己一耳光,真是由于陷入思维误区,网上又没有这方面的解决方法,甚至报错也那么简单。导致浪费了两天的时间。真该吸取教训。
解决方法如下:
进入C:/->右键属性->安全->修改权限->users->勾选写入,修改->确定
就是这么简单- -,希望能帮到跟我一样的初学者吧!
- hadoop启动错误总结
- Hadoop常见错误总结
- hadoop常见错误总结
- hadoop 2.2 错误总结
- Hadoop错误总结
- hadoop常见错误总结
- hadoop错误总结
- hadoop运行错误总结
- hadoop 2.2 错误总结
- Hadoop操作错误总结
- hadoop错误总结
- hadoop错误总结
- hadoop-错误总结
- hadoop配置、运行错误总结
- hadoop配置、运行错误总结
- hadoop配置、运行错误总结
- hadoop配置、运行错误总结
- 集群Hadoop安装错误总结
- Ubuntu 文件查找
- 【LeetCode】115. Distinct Subsequences
- python笔记之ArcPy函数列表
- 怎么取出数据库中表的数据生成XML文件
- 二、传统定时器的回顾
- hadoop错误总结
- Ubuntu14.04下QT开发环境搭建步骤
- nginx proxy_cache配置说明
- start uml2 文字不能换行
- 链表的基本操作
- 关于”囚徒困境“的见解
- 【LeetCode】165. Compare Version Numbers 解题报告
- 第三方Android 模拟器流畅速度快,适合开发人员
- HDU 1869 六度分离(迪杰斯特拉/优先队列/最短路)