zoukankan      html  css  js  c++  java
  • Hadoop与HBase中遇到的问题

    1. Hadoop中遇到的问题

    曾经所遇到的问题因为没有记录,所以忘了

     (1)NameNode没有启动成功, 是因为你对HDFS多次格式化,导致datanode中与namenode中的VERSION文件里的namespaceID不一致(对于NameNode节点,该文件位于hdfs-site配置文件里dfs.name.dir參数所指定的路径下的current目录中, 对于DataNode节点, 该文件位于hdfs-site配置文件里dfs.data.dir參数所指定的路径下的current目录中.

    解决方法: 第一种是把namespaceID的值改成一致,然后重新启动Hadoop;另外一种删除dfs.name.dir与dfs.data.dir參数指定的文件夹,然后使用bin/hadoop namenode -formate 又一次格式化,这样的方法有风险, 由于会删除全部原来在HDFS上的文件.

    (2)Eclipse的Run On Hadoop就是一个坑, 其根本就没执行在集群上, (能够通过job.setNumReduceTasks设置ReducerTask个数,不管你设置多少个,都仅仅有一个,由于执行在本地,仅仅是文件数据在集群上, 也就是说Mapper与Reducer任务都执行在本地; 还能够通过控制台信息查看到: 假设是集群上则会有这种信息Running job: job_201405090934_0024, 假设是本地任务,则会显示Running job: job_local426339719_0001,看到没有, 中间有个local; 还能够通过web node1:50030查看任务执行情况,假设是本地任务,则不会在上面显示).

    解决方法: 假设须要执行在集群上,要做三件事,例如以下:

              

    //特别注意: 一定要设置,不然会报cannot read partitioner file错误
             conf.set("fs.default.name","node1:49000");
             //特别注意: 一定要设置,不然不会执行在集群上
             conf.set("mapred.job.tracker","node1:49001");
             //特别注意: 对相关类以及依赖的jar文件进行打包,这是执行在集群上必需要做的一步,不然集群找不到相关的Mapper等类文件
     		 File jarpath;
    		 try {
    			 jarpath = JarTools.makeJar("bin");
    			 conf.set("mapred.jar", jarpath.toString());
    		 } catch (Exception e) {
    			 logger.error("进行jar打包出错!");
    			 e.printStackTrace();
    			 return;
    		 }
    (3) Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

    在执行时,Run Configurations 在Arguments中的 VM arguments 加入-Djava.library.path=/home/hadoop/hadoop-1.2.1/lib/native/Linux-i386-32

    该路径根据你的实际路径为准

    2.HBase问题

      (1) Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (无法定位登录配置)
    22:32:56,821 WARN                    ClientCnxn:1089 - Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
    java.net.ConnectException: Connection refused
        at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
        at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
        at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:350)
        at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1068)
    22:32:56,951 WARN          RecoverableZooKeeper:253 - Possibly transient ZooKeeper, quorum=localhost:2181, exception=org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/hbaseid
    22:32:56,952 INFO                  RetryCounter:155 - Sleeping 1000ms before retry #0...

    这是由于在代码中没有设置Zookeeper集群

    //设置zookeeper集群
    HBASE_CONFIG.set("hbase.zookeeper.quorum", "node2,node3,node4,node5,node6,node7,node8");


    最好还设置HMaster

    //设置HMatser
     HBASE_CONFIG.set("hbase.zookeeper.master","node1:60000");

     (2)

    JobClient:1422 - Task Id : attempt_201405081252_0008_m_000000_0, Status : FAILED
    java.lang.IllegalArgumentException: Can't read partitions file
        at org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner.setConf(TotalOrderPartitioner.java:116)
        at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:62)
        at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117)
        at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:676)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:756)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:396)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
        at org.apache.hadoop.mapred.Child.main(Child.java:249)
    Caused by: java.io.FileNotFoundException: File /tmp/partitions_de363500-5535-466b-91bb-36472457386d does not exist.
        at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:402)
        at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:255)
        at org.apache.hadoop.fs.FileSystem.getLength(FileSystem.java:816)
        at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1479)
        at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1474)
        at org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner.readPartitions(TotalOrderPartitioner.java:301)
        at org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner.setConf(TotalOrderPartitioner.java:88)
        ... 10 more

    由于在生成HFile时使用了HFileOutputFormat与TotalOrderPartitioner(HFile对RowKey须要进行全局排序),所以须要分区文件, 可是TaskTracker找不到分区文件,要想TaskTracker读取分区文件,该文本必须存在与HDFS上, 所以须要设置一个參数:

    Configuration conf = HbaseOperation.HBASE_CONFIG; 
             conf.set("fs.default.name","node1:49000");

    对于详细解释,还需进一步研究.


    (3)Wrong number of partitions in keyset

    说明你的分区文件里的分区个数不等于reducer的个数减一,即Regions的个数不等于reducer的个数减一,事实上是由于你的任务执行在本地(这样仅仅有一个Reducer),而Regions有多个,有兴趣能够查看TotalOrderPartitioner的源码, 中间有一段代码为:

     for (int i = 0; i < splitPoints.length - 1; ++i) {
            if (comparator.compare(splitPoints[i], splitPoints[i+1]) >= 0) {
              throw new IOException("Split points are out of order");
            }
          }
    HFileOutputFormat.configureIncrementalLoad(job, table);自己主动对job进行配置。TotalOrderPartitioner是须要先对key进行总体排序,然后划分到每个reduce中,保证每个reducer中的的key最小最大值区间范围,是不会有交集的。由于入库到HBase的时候,作为一个总体的Region,key是绝对有序的。

    临时写到这里, 有些问题不记得了,以后遇到问题会继续更新,....

  • 相关阅读:
    (5.13)mysql高可用系列——1主3从复制(SSL)
    sql server凭据
    (5.3.3)数据库迁移——迁移一个实例到底需要注意哪些方面?
    provider: Shared Memory Provider, error: 0
    (5.3.2)数据库迁移——SSIS包批量导出
    (4.35)sql server清理过期文件【转】
    Linux学习笔记(16)Linux前后台进程切换(fg/bg/jobs/ctrl+z)
    导入导出维护计划
    C++的那些事:你真的了解引用吗
    为什么构造函数不能是虚函数
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3798804.html
Copyright © 2011-2022 走看看