工作中遇到问题以及解决方法

Jdbc连接数据库表名称低级错误

  1. 先检查写入的数据类型与表中栏位类型是否一致
  2. 上面如果一致仍然还有报错的话,这时候检查的是代码中的sql语句

可以发现表名称的后面有小数点和“--”符号,这样子也会导致出现这样子的错误。

Azkaban的执行缺陷

由于Azkaban中的每个job都是一个进程,在Azkaban中判断job成功与否是根据这个进程是否成功执行完成,但是在MR 或者Spark Job执行的过程中,如果代码出错,运行在集群上的任务会停止,并不会有内容写入目标文件中,此时返回给Azkaban的进程是执行成功的,也就是job节点执行成功。这与任务执行的结果相悖。

例如: 

在执行某个jar包的过程中时,出现了NullPointException,此时MR作业停止,但是最终Process 显示的为执行成功。并且节点最终执行的结果也为成功: 

所以为了防止依赖的节点出现错误,其以下节点仍可运行的情况。需要换一个校验job是否正确执行的维度进行评判,比如检测MR 或者 Spark 任务的log文件是否正确执行等,或者检测集群中的任务是否执行成功。

总结:在执行结束后可以返回hdfs中查询是否有对应的文件生成,如果有则表示成功,没有则表示失败。

Spark 集群模式下全局变量使用情况:

刚开始定义了一个全局变量:

然后在main函数下面重新赋值全局变量的时候出现集群获取不到新赋值的变量。

集群打印日志显示的hbase值依然是 null

修改方法:在main函数中直接定义该常量,就可以接收到新赋值了。

 

Es创建index的时候:

Index长度问题。先前index = std_new_positiontypeAndposition然而一直创建失败不成功,然后就修改成上述就成功了。

 

读取hbase表中的数据时候遇到某些数据异常问题:

Hive外部表映射出来的数据看起来也是很正常的数据,但一部数据通过代码没有办法做处理,代码没有问题,最后发现hbase表中的数据异常,数据中存在某些特殊字符(例如:制表符或者空格)肉眼看不到。

 

关于相同汉字字符串在编码中比较是否相同的时候出现unicode转换数不一样的情况解决:

例如:作为 \u4f5c\u4e3a

\ufeff\u4f5c\u4e3a

相同的汉字“作为“但是unicode不一样导致编码比较出现差异。通过notepad打开源文件然后转换格式为utf-8无BOM的格式即可解决

 

Spark submit shell命令中的核数跟执行内存的调节:

一个原则,你能使用的资源有多大,就尽量去调节到最大的大小(executor内存;executor cpu core

增加了内存量以后,对性能的提升,有三点:

   1如果需要对RDD进行cache,那么更多的内存,就可以缓存更多的数据,将更少的数据写入磁盘

甚至不写入磁盘。减少了磁盘IO

   2对于shuffle操作reduce端,会需要内存来存放拉取的数据并进行聚合。如果内存不够,也会写入磁盘。如果给executor分配更多内存以后,就有更少的数据,需要写入磁盘,甚至不需要写入磁盘。减少了磁盘IO,提升了性能。

   3对于task的执行可能会创建很多对象。如果内存比较小,可能会频繁导致JVM堆内存满了,

然后频繁GC,垃圾回收,minor GCfull GC。(速度很慢)。内存加大以后,带来更少的GC,垃圾回收,

避免了速度变慢,性能提升

 

问题一:eclipse的maven工程在构建的时候报了source 7 或更高版本来支持diamon的运算符。

解决方法:在pom.xml中添加

Spark:java.net.BindException: Address already in use: Service 'SparkUI' failed after 16 retries!

错误原因:

每一个Spark任务都会占用一个SparkUI端口,默认为4040,如果被占用则依次递增端口重试。但是有个默认重试次数,为16次。16次重试都失败后,会放弃该任务的运行。

 

解决方法

初始化SparkConf时,添加conf.set(“spark.port.maxRetries”,“100”)语句

使用spark-submit提交任务时,在命令行中添加-Dspark.port.maxRetries=100

在spark-defaults.conf中添加spark.port.maxRetries 100

 

SparkStreaming读取Kakfa数据时发生OffsetOutOfRangeException异常

解决方案:Kafka consumer中设置fetch.message.max.bytes为大一点的内存

 

比如设置为50M:1024*1024*50

fetch.message.max.bytes=52428800

 

 

解决方法:

在程序中给Configuration做以下设置:

conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem")

git提交的时候 this exceeds file size limit of 100.0 MB


Github只允许上传最大100MB的文件,如果超过,则会被server reject

则需:

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch  target/lib/spark-assembly-1.6.1-cdh5.3.2-hadoop2.5.0-cdh5.3.2.jar"  --prune-empty --tag-name-filter cat -- --all

git commit --amend -CHEAD

git push origin master

 

Maven build的java普通工程的jar包想在linux上面使用shell命令运行jar包的方法:

第一种方法:shell命令执行

例如:

Nohup java -cp  /home/hadoop/azkaban/testjobforshenzhonghu/patternToRedis/pattern/lib/commons-pool2-2.4.2.jar:/home/hadoop/azkaban/testjobforshenzhonghu/patternToRedis/pattern/lib/junit-3.8.1.jar:/home/hadoop/azkaban/testjobforshenzhonghu/patternToRedis/pattern/lib/jedis-2.9.0.jar:/home/hadoop/azkaban/testjobforshenzhonghu/patternToRedis/pattern/lib/cn.com.cennavi-0.0.1-SNAPSHOT_beijing.jar cn.com.cennavi.java.WriteRedis_beijing >beijing.log &

Java -cp 依赖的jar1:依赖的jar2:.....:工程jar包 主函数名 linux系统用:分割,windows用;

第二种方法;修改pom.xml文件,使其build的时候可以把主函数告知到jar中

<build>

        <sourceDirectory>src/main/java</sourceDirectory>

        <testSourceDirectory>src/test/java</testSourceDirectory>

        <plugins>

            <plugin>

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-jar-plugin</artifactId>

                <version>3.0.2</version>

                <configuration>

                    <archive>

                        <manifestEntries>

                            <Class-Path>spark-assembly-1.6.1-hadoop2.5.0-cdh5.3.2.jar scala-reflect-2.10.3.jar</Class-Path>

                        </manifestEntries>

                        <manifest>

                            <addClasspath>true</addClasspath>

                            <!--<classpathPrefix>lib</classpathPrefix>--> <!--前缀,例如配置lib,则MANIFEST中Class-Path: lib/scala-library-2.10.4.jar-->

                            <mainClass>cn.com.cennavi.java.WriteRedis_liuzhou</mainClass>

                        </manifest>

                    </archive>

                </configuration>

            </plugin>

        </plugins>

    </build>

Job aborted due to stage failure: Task serialization failed: java.lang.StackOverflowError

java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1506)

java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1429)

java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1175)

java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1375)

 

这种错误报出是代码当中内存溢出原因导致的,检查代码中使用内存的步骤,进行修改,当时报这个错误的原因是:

 

是这个原因,计算半个月的hdfs数据不报错,但是计算一个月的数据的时候这个union操作就会使用的内存超过自己的配置就出现了这个错误。当时解决方法就是控制每次计算半个月的数据或者更低的数据。

Exception in thread "Thread-0" java.lang.RuntimeException: Job HistoryCntfToLocal does not have cancel method cancel

24-10-2018 14:18:30 CST HistoryCntfToLocal ERROR - at azkaban.jobtype.JavaJobRunnerMain.cancelJob(JavaJobRunnerMain.java:249)

24-10-2018 14:18:30 CST HistoryCntfToLocal ERROR - at azkaban.jobtype.JavaJobRunnerMain$1.run(JavaJobRunnerMain.java:78)

 

 

解决方法:(1)缺少jar包,把与这个工程相类似的工程使用到的jar包全部导入到该工程下面进行引用。完美解决,但是还是不知道缺少了什么jar包。

  1. 检查读取的配置文件(比如 spark kafka 其他的配置文件)是否路径有错误

 

ERROR Failed to set setXIncludeAware(true) for parser

解决方法:jar包冲突

删除自己的xercesImpl.jar,用jdk自身的编译器,问题解决了

java.io.InvalidClassException: ** local class incompatible: stream classdesc serialVersionUID = -9117779196120965598, local class serialVersionUID = 2841008943488659566

解决方法:

1、spark运行的jar包的类和集群上的jars包不一致

在运行spark程序的时候,需要把运行的jar包上传到集群上,即通过sparkconf.setJars()将jar包里的类上传到集群,并分散到各个Worker节点,才能实现并行处理。

所以要保证命令行运行的jar(java -jar …或者spark-submit…)和集群上设置的sparkconf.setJars()要是同一个jar包。

  1. 编译运行的类的jdk版本和spark集群上的jdk版本不一致导致的。

 

修改jdk的编辑路径重新编译打包项目,完美解决

 

java.lang.OutOfMemoryError: Java heap space

什么都不要去改,无疑问的就是代码中出现一个很大的变量导致内存溢出了,比如说spark中的广播变量特别的大,消耗很大的内存,这时候直接就是修改jvm的参数:

比如我之前的参数:Xmx: 1024m Xms:512m

修改之后 

完美解决

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值