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&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里有下面的异常信息
1 2 |
org.apache.hadoop.hbase.TableExistsException: hbase:namespace java.lang.RuntimeException: HMaster Aborted |
解决:删除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("getInputSplit"); 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
返回了更加详尽的异常信息
1 2 3 4 |
ERROR: There is a hole in the region chain between DC0DEEF12619593CD7DF356280BC9C83\x00\x00\x01N\xB1W\xB9 and E00F5F477CA13CCDC99F6D7706541EEF\x00\x00\x01N\xB3\x90. You need to create a new .regioninfo and region dir in hdfs to plug the hole. ERROR: Found inconsistency in table table_name ERROR: There is a hole in the region chain between DC0DEEF12619593CD7DF356280BC9C83\x00\x00\x01N\xB1W\xB9 and E00F5F477CA13CCDC99F6D7706541EEF\x00\x00\x01N\xB3\x90. Creating a new regioninfo and region dir in hdfs to plug the hole. ERROR: Found inconsistency in table table_name |
原来是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);
输出的路径居然是
1 |
jar:file:/software/servers/hadoop-2.6.0-bin/hadoop-2.6.0/share/hadoop/common/lib/httpcore-4.2.5.jar!/org/apache/http/message/BasicLineFormatter.class |
原来是跟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)