异常记录

1. mysql错误:Table XXX is marked as crashed and should be repaired

解决:找到mysql的安装目录bin/myisamchk工具,在命令行中输入:

myisamchk -c -r ../mysql/DBname/tablename.MYI

2. hadoop错误:Exceeded MAX_FAILED_UNIQUE_FETCHES

原因:Reduce阶段取map结果->reduce结点时出错的。

解决:保证自定义的/etc/hosts中的别名和hostname一致。

3. Spring aop异常:nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/BCException

原因:是由于classpath下缺少了aspectjweaver.jar的缘故。

解决:在pom.xml中加入依赖信息

<dependency>
    <groupId>org.aspectj</groupId>;
    <artifactId>aspectjweaver</artifactId>;
    <version>1.x.x</version>
</dependency>;

4.maven web项目部署到linux tomcat上,用浏览器访问时出现的异常:org.apache.jasper.JasperException: java.lang.NullPointerException

原因:1.在windows上开发时用的jdk7,而linux服务器上的版本为jdk6。

2.maven编译时需要两个包servlet-api.jar、jsp-api.jar ,如果将这两个jar打包在项目里,就会与linux tomcat服务器上的jar冲突。

解决:1.将jdk的版本改为1.6。

2.在pom.xml配置servlet-api.jar、jsp-api.jar不打包进项目,配置如下:

<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>servlet-api</artifactId>
    <version>6.0.37</version>
    <scope>provided</scope>
</dependency>

5.linux上启动nginx,出现错误:error while loading shared libraries: libpcre.so.1

原因:缺少lib文件

解决:

cd lib64/
ln -s libpcre.so.0.0.1 libpcre.so.1

6.myBatis异常:Value ‘0000-00-00’ can not be represented as java.sql.Timestamp

原因:这个就是如果数据库里存在的date类型的数据,给它设置成空,数据库里就是0000-00-00 这种的,然后Mybatis把字段转换java.sql.Date时给我报了个错。

解决:

datasource.url=jdbc:mysql://localhost:3306/pe?useUnicode=true&amp;zeroDateTimeBehavior=convertToNull

7.Spring @ResponseBody时异常:Can not create bean serializer for Object.class

原因:转成Json对象时,必须有get/set方法。

解决:添加get/set方法。

8.nginx:413 Request Entity Too Large

原因:nginx上传文件的默认大小为1M,配置为client_max_body_size 1m。

解决:打开nginx.conf,在http模块中添加client_max_body_size 10m,改为10M。

9.java.lang.ClassNotFoundException: org.apache.commons.collections.map.ListOrderedMap

原因:commons-collections-x.x.jar未导入或者版本过老。

解决:导入较新版本的jar。

10.maven构建项目时报错:Missing artifact jdk.toos:jdk.toos:jar:1.7

原因:maven库中没有该jar包。

解决:在项目的pom.xml 文件中加入以下配置,指定maven去本地寻找tools.jar。

<dependency>
    <groupId>jdk.tools</groupId>
    <artifactId>jdk.tools</artifactId>
    <version>1.7</version>
    <scope>system</scope>
    <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>

11.java.sql.SQLException: Could not retrieve transation read-only status server

原因:mysql连接闲置时间过长,数据库单方面断掉,客户端不知情。下次使用该连接,就会抛出该异常。

解决:在数据源的配置中配置属性validationQuery。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${db.driverClassName}"></property>
    <property name="url" value="${db.url}"></property>
    <property name="username" value="${db.username}"></property>
    <property name="password" value="${db.password}"></property>
    <property name="validationQuery" value="SELECT COUNT(1) FROM table_name"></property>
</bean>

validationQuery用于验证连接是否成功的查询SQL语句,SQL语句必须至少要返回一行数据, 如你可以简单地设置为:“select count(1) from table_name”。这样在使用连接时会先进行测试,如果连接失效会从连接池取新的连接,避免了异常。

12.mysql在执行update语句时报错:The definition of table ‘v’ prevents operation UPDATE on table ‘t’

原因:遇到视图,无法对表进行update操作

UPDATE ee_table t
SET t.status='XXX'
WHERE t.tid IN (
	SELECT v.vid
	FROM ee_view v
)

解决:

UPDATE ee_table t
SET t.status='XXX'
WHERE t.tid IN (
	SELECT temp.id
	FROM (
		SELECT v.vid AS id
		FROM ee_view v
	) temp
)

13.pom在<plugins>标签内添加<goal>标签时报错:Plugin execution not covered by lifecycle configuration

原因:eclipse的m2e插件还没有支持到execution
解决:<plugins>标签外再套一个<pluginManagement>标签

<build>
    <pluginManagement>
        <plugins>
            <plugin> ... </plugin>
            <plugin> ... </plugin>
                  ....
        </plugins>
    </pluginManagement>
</build>

14.在静态方法里面创建内部类,编译出错No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing instance of type E(E表示内部类)

public class Test {
    public class InnerClazz {
        public int returnVal(int i) {
	        return i+1;
	    }
    }
    public static void main(String[] args) {
	    InnerClazz innerClazz = new InnerClazz();
	    System.out.println(innerClazz.returnVal(1));
    }
}

原因:该内部类是动态的(没用static修饰),类中的动态属性和动态方法,在静态方法里面调用,编译时也会报错。因为静态方法不与所在的类绑定。当调用该类的所用动态资源的时候,该类可能还未加载到内存中,无法调用其动态资源。

public class Test {
    ....
    // 调用动态属性和方法也会报错
    public int param;
    public void func() {
        ....
    }
    ....
}

解决:
1.将内部类修饰为静态

public class Test {
    public static class InnerClazz {
	    public int returnVal(int i) {
	        return i+1;
	    }
    }
    public static void main(String[] args) {
	    InnerClazz innerClazz = new InnerClazz();
	    System.out.println(innerClazz.returnVal(1));
    }
}

2.在静态方法里创建该类的实例

public class Test {
    public class InnerClazz {
	    public int returnVal(int i) {
	        return i+1;
	    }
    }
    public static void main(String[] args) {
	    Test test = new Test();
	    InnerClazz innerClazz = test.new InnerClazz();
	    System.out.println(innerClazz.returnVal(1));
    }
}

15.SSH登陆失败:Host key verification failed

原因:由于公钥不一样了,所以无法登录,提示信息是 KEY 验证失败。

解决:在 known_hosts 文件里面将原来的公钥信息删除即可(rm ~/known_hosts)。

16.Missing artifact jdk.tools:jdk.tools:jar:1.7

解决:jdk.tools:jdk.tools是JDK中的jar包,在pom中加入一下配置:

<dependency>
    <groupId>jdk.tools</groupId>
    <artifactId>jdk.tools</artifactId>
    <version>1.7</version>
    <scope>system</scope>
    <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>

也可以在本地仓库中手动安装tools.jar,如下

mvn install:install-file -DgroupId=jdk.tools -DartifactId=jdk.tools -Dpackaging=jar -Dversion=1.7 -Dfile=tools.jar -DgeneratePom=true

然后在pom中添加:

<dependency>
    <groupId>jdk.tools</groupId>
    <artifactId>jdk.tools</artifactId>
    <version>1.7</version>
</dependency>

17.hbase启动时报错:org.apache.hadoop.hbase.ClockOutOfSyncException
原因:集群节点的系统时间和master的时间不一致
解决:将regionserver时间设置的和master一致

18.重新hadoop namenode -format之后,datanode无法启动

原因:namespace不一致

解决:lz在core-site.xml中配置hadoop.tmp.dir值为/root/install/hadoop-2.6.0/temp,清空该目录

19.HBase的master节点刚启动几秒就断掉

log里有下面的异常信息

解决:删除zookeeper上hbase节点,具体操作为:zkCli.sh连接上zookeeper服务,rmr /hbase删除节点

20.org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.IllegalAccessError: class com.google.protobuf.HBaseZeroCopyByteString cannot access its superclass com.google.protobuf.LiteralByteString

原因:使用的版本是hbase-0.96.1.1-cdh5.0.0,是这个版本的bug

解决:将hbase-protocol-0.96.1.1-cdh5.0.0.jar加入Hadoop的classpath

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/app/cdh/hbase-0.96.1.1-cdh5.0.0/lib/hbase-protocol-0.96.1.1-cdh5.0.0.jar

21.Cannot resolve the host name for /xx.xx.xx.xx because of javax.naming.NameNotFoundException: DNS name not found [response code 3]; remaining name ‘xx.xx.xx.xx.in-addr.arpa’

原因:使用的版本是hbase-0.96.1.1-cdh5.0.0,是这个版本的bug,将warn等级的log写成了error,但不影响job的执行。后面的版本已经修正。

22.java.lang.ClassCastException: org.apache.hadoop.mapreduce.lib.input.TaggedInputSplit cannot be cast to org.apache.hadoop.mapreduce.lib.input.FileSplit

原因:

在MapReduce的Job中,有时候需要拿到文件的输入路径。lz一致使用的是(FileSplit)context.getInputSplit()来得到FileSplit,通过它就可以获取输入的路径。

但是这只适用于一般的输入,如job.setInputFormatClass(TextInputFormat.class)。如果使用的是批量的输入,如MultipleInputs.addInputPath(job, new Path(path), TextInputFormat.class),就会报出上面那个类型转换错误。

为了找到原因,lz查看了下源码,结果发现:

public class FileSplit extends InputSplit implements Writable {}

class TaggedInputSplit extends InputSplit implements Configurable, Writable {
    ...
    private InputSplit inputSplit;
    ...
    public InputSplit getInputSplit() {
        return inputSplit;
    }
}

FileSplit、TaggedInputSplit都是InputSplit类,但是它俩之间不能进行强制转换。所以要通过TaggedInputSplit属性中的InputSplit,将它强制转换为FileSplit,获取输入路径。

解决:

(1)修改源码,将TaggedInputSplit声明为public,然后(FileSplit)((TaggedInputSplit)context.getInputSplit()).getInputSplit(),获取TaggedInputSplit中的属性InputSplit。

(2)通过反射机制,获取TaggedInputSplit中的属性InputSplit。

@Override
protected void setup(Context context) throws IOException,
        InterruptedException {
    InputSplit split = context.getInputSplit();
    Class<? extends InputSplit> splitClass = split.getClass();

    FileSplit fileSplit = null;
    if (splitClass.equals(FileSplit.class)) {
        fileSplit = (FileSplit) split;
    } else if (splitClass.getName().equals(
            "org.apache.hadoop.mapreduce.lib.input.TaggedInputSplit")) {
        // begin reflection hackery...
        try {
            Method getInputSplitMethod = splitClass
                    .getDeclaredMethod(&quot;getInputSplit&quot;);
            getInputSplitMethod.setAccessible(true);
            fileSplit = (FileSplit) getInputSplitMethod.invoke(split);
        } catch (Exception e) {
            // wrap and re-throw error
            throw new IOException(e);
        }
        // end reflection hackery
    }
}

23.运行MapReduce时报错:java.io.EOFException  at java.io.DataInputStream.readFully(DataInputStream.java:197)

原因:输入的目录中有以.tmp结尾的文件,就是这个文件引起的(虽然不造原因是什么)。

解决:设置文件过滤器,将非法文件过滤掉。

24.运行MapReduce时报错:java.io.IOException: Failed to run job: Application application_xxx_xxx submitted by user xxx to unknown queue: default

原因:运行job时未指定队列,使用默认的队列,但是默认队列又没有权限。

解决:

(1)使用指令hadoop queue -showacls,查询当前的所有队列。

(2)在配置文件中设置conf.set(“mapreduce.job.queuename”, “queue”)。

(3)在命令行中设置hadoop jar app.jar -D mapreduce.job.queuename=queue。

(4)hive的设置是SET mapreduce.job.queuename=queue。

25.运行MapReduce时HBase报错:java.lang.IllegalArgumentException: Row length is 0

原因:创建Put时rowkey是””,Put put = new Put(key.getBytes()),key为””。

26.运行MapReduce时报错:org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.io.IOException: Split metadata size exceeded 10000000. Aborting job job_xxxx_xx

原因:该job的job.splitmetainfo文件大小超过限制,job.splitmetainfo记录split的元数据信息。

解决:mapred-default.xml中mapreduce.job.split.metainfo.maxsize默认值是10000000。如果小文件太多,将小文件合并再进行处理。

27.运行MapReduce时报错:org.apache.hadoop.hbase.NotServingRegionException: Region table_name,DC0DEEF12619593CD7DF356280BC9C83\x00\x00\x01N\xB1W\xB9,1437712296611.be48cd2238aea464c93b4bb978d6aabe. is not online on host_name,60020,1435378370798

原因:lz运行使用hbase的工具hbck,首先执行

hbase hbck -details

返回了更加详尽的异常信息

原来是region中出现了hole,具体原因不详,应该是因为regionserver的问题导致了数据的丢失

解决:

hbase hbck -repairHoles

28.运行MapReduce时报错:Error: java.io.IOException: Unable to initialize any output collector

原因:mapreduce.task.io.sort.mb内存值输入大于2047 mb,但是它允许的最大值是2047 mb。

解决:mapreduce.task.io.sort.mb < 2048 mb。

29.执行程序时报错:java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.XmlReaderContext.getResourceLoader()Lorg/springframework/core/io/ResourceLoader

原因:jar包重复

解决:把pom中重复配置的jar包去掉

30.java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern

原因:在URL解码时,%被看作转义字符。当%与其后的字符一起无法转义时,就会抛出这个错误。

解决:在URL解码时,把%25转义为真正的%。所以把其后不是数字和字母的%都替换成%25就可以了。

url = url.replaceAll("%(?![0-9a-fA-F]{2})", "%25");

31.执行mapreduce时报错:org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.NoSuchFieldError: INSTANCE

原因:lz在map中调用了httpclient-4.3.6.jar和httpcore-4.3.3.jar。在google中查到这个是因为classpath中有老版本的httpclient和httpcore的jar与lz导入的更高版本的jar冲突所造成。但lz发现classpath下只有httpclient-4.3.6.jar和httpcore-4.3.3.jar。

所以lz在调用httpclient前打印出这个类的来源:


ClassLoader classLoader = SendSearchWordMapper.class.getClassLoader();
URL resource = classLoader.getResource("org/apache/http/message/BasicLineFormatter.class");
log.info("resource path is " + resource);

输出的路径居然是

原来是跟lz冲突的jar居然是hadoop的jar。所以,要先加载lz的classpath下的jar,再加载hadoop的jar,这样就避免使用hadop的旧版本jar了。

解决:


configuration.setBoolean(MRJobConfig.MAPREDUCE_JOB_USER_CLASSPATH_FIRST, true);

32.使用Gson出现异常:com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line X column Y path $

原因:数据流读取的时候,多读了空格。

解决:把数据流生成的字符串trim下就好了。

33.使用beeline执行Hive SQL时报错:org.apache.hive.service.cli.HiveSQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

原因:登陆beeline时未指定用户,执行MapReduce无权限

解决:登陆时指定用户(如果未设置权限管理就用root)。

34.执行MapReduce时报错:java.io.IOException: Job status not available 

解决:


<property>
    <name>mapreduce.jobhistory.address</name>
    <value>master.hadoop:10020</value>
</property>
<property>
    <name>yarn.app.mapreduce.am.staging-dir</name>
    <value>/tmp/hadoop-yarn/staging</value>
</property>
<property>
    <name>mapreduce.jobhistory.intermediate-done-dir</name>
    <value>${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate</value>
</property>
<property>
    <name>mapreduce.jobhistory.done-dir</name>
    <value>${yarn.app.mapreduce.am.staging-dir}/history/done</value>
</property>

35.执行MapReduce时报错:org.apache.hadoop.ipc.StandbyException: Operation category READ is not supported in state standby

原因:Hadoop HA集群中才会出现这个异常。原因是连接到standby的namenode上。

解决:让client连接到active的namenode上。

36.执行Hive JDBC时报错:org.apache.hive.service.cli.HiveSQLException: Error while compiling statement: FAILED: SemanticException Line 1:23 Invalid path ”/**/*.dat”: No files matching path file:/**/*.dat

原因:执行load data local inpath ‘/**/*.dat’ into table table_name。原因是*.dat不在HiveServer2那台机器上。

解决:*.dat放到HiveServer2那台机器上或者HDFS上,或者使用hive client。

37.搭建Hadoop集群时报错:Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

原因:CDH5.7.0版的native lib未编译生成。

解决:现在一个官方的Hadoop2.6.0,将lib/native下的文件复制到集群上即可。

38.使用beeline连接并创建数据库时报错:Permission denied: user=anonymous, access=WRITE, inode=”/hiveDB”:root:supergroup:drwxr-xr-x

原因:连接spark的thrift服务的时候,要求输入用户名和密码。这时候输入任何用户名和密码都可以登陆进去,不输入默认就是anonymous用户,但是以后执行任何操作都是按照这个用户的权限来的。要操作的hdfs的这个目录权限不正确。

解决:用创建这个hdfs目录的用户来登陆。

39.Java无法识别Hadoop HA的namenode名称:java.net.UnknownHostException

解决:


<property>
    <name>dfs.client.failover.proxy.provider.szq-hdfs-cluster-a</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

40.执行spark-shell:java.net.UnknownHostException: hostnameXXX

原因:spark-shell是client模式,driver在本地,提交任务的时候会默认使用hostname作为driver地址,而不是使用IP。集群中的机器未配置该hostname,所以会报错。

解决:spark-defaults.conf中添加配置

spark.driver.host xx.xx.xx.xx(ip)

发表评论