工程开发技巧

  1. spark读取配置文件中的配置
spark-submit
--files /data/apps/config.properties 
  1. spring boot 两种配置文件,一种是application.properties,另一种是application.yml
massage:
  data:
    name: haha
-- 注意:中间是有一个空格
  1. spring boot 多环境配置,通过指定启动参数使用不同的profile,比如:
spring:
  profiles:
    active: prod

测试环境:java -jar my-spring-boot.jar --spring.profiles.active=test
生产环境:java -jar my-spring-boot.jar --spring.profiles.active=prod

  1. 配置文件数据的读取
@Value("${message.data.name}")
private String name;
  1. mybatis配置文件



    
        classpath:/com/atcl/elwin/platform/mapper/*Mapper.xml
    

classpath是指WEB-INF文件夹下的classes目录
查询jar中的指定的配置文件需要classpath*

  1. maven
    一个仓库一般分为public(Release)仓和SNAPSHOT仓,前者存放正式版本,后者存放快照版本。
    指定的版本号带有-SNAPSHOT后缀,比如版本号为Junit-4.10-SNAPSHOT,那么打出的包就是一个快照版本
    频繁的发布SNAPSHOT版本,以便让其它项目能实时的使用到最新的功能做联调;当版本趋于稳定时,再发布一个正式版本,供正式使用。当然在做正式发布时,也要确保当前项目的依赖项中不包含对任何SNAPSHOT版本的依赖,保证正式版本的稳定性。
  2. unit test
@RunWith(SpringRunner.class)
@SpringBootTest
  1. applicationContext.xml生成mapper时,要把之前的xml删除掉,否则会往后追加,报以下错误:参考文章
Caused by: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.mapper.PetMapper.BaseResultMap
image.png
  1. sqlSessionFactory报以下错误:
    将公司的MapperScannerConfigurer改成默认org.mybatis.spring.mapper.MapperScannerConfigurer解决问题
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tcMapper'
defined in file xxxxxxxx: Error setting property values;
 nested exception is org.springframework.beans.PropertyBatchUpdateException;
 nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'sqlSessionFactory' threw exception;
 nested exception is java.lang.NullPointerException

参考文章

  1. Spring 配置方式,指定默认配置
    @Value("${NamesrvAddr:192.168.0.1}")
  2. Sprint boot scala
    报错:making jar files - No auto configuration classes found in META-INF/spring.factories

增加如下build plugin即可

 
    org.springframework.boot
    spring-boot-maven-plugin
    
      true
      ${start-class}
    
    
      
          
              repackage
          
      
    
  

也有可能,打包后执行 java -jar spring-cloud-eureka-0.0.1-SNAPS HOT.jar
提示 spring-xxx-xxx-0.0.1-SNAPSHOT.jar中没有主清单属性

怎么查看jar包的主清单呢?

以SpringBoot为例,jar包中包含了三个文件夹:BOOT-INF,META-INF,org,可以把jar包解压到文件夹下查看,其中META-INF文件夹下有一个MANIFEST.MF文件,该文件指明了程序的入口以及版本信息等内容
Manifest-Version: 1.0
Implementation-Title: spring-xxx-xxx
Implementation-Version: 0.0.1-SNAPSHOT
Archiver-Version: Plexus Archiver
Built-By: XXXX
Implementation-Vendor-Id: com.huyikang.practice
Spring-Boot-Version: 1.5.9.RELEASE
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.huyikang.practice.eureka.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.5.2
Build-Jdk: 1.8.0_151
Implementation-URL: http://maven.apache.org

这些值都是SpringBoot打包插件会默认生成的,如果没有这些属性,SpringBoot程序自然不能运行,就会报错:jar中没有主清单属性,也就是说没有按照SpringBoot的要求,生成这些必须的属性。

  • Main-Class代表了Spring Boot中启动jar包的程序
  • Start-Class属性就代表了Spring Boot程序的入口类,这个类中应该有一个main方法
  • Spring-Boot-Classes代表了类的路径,所有编译后的class文件,以及配置文件,都存储在该路径下
  • Spring-Boot-Lib表示依赖的jar包存储的位置
  1. spark 平台报错
    Unsupported major.minor version 52.0
    javap -verbose com.xxx.XXClass 可以反编译class信息
    改为使用1.7编译即可,maven中增加以下插件
 
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.7
                    1.7
                
            
        
    
  1. maven plugin有执行顺序的
  2. spark 1.6是jdk7,spark 2.0+是jdk8
  3. spring boot 的启动类为:org.springframework.boot.loader.JarLauncher,spark的启动类设置

本机启动命令:mvn clean spring-boot:run

  1. 异常解决
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'spring.datasource.CONFIGURATION_PROPERTIES': Initialization of bean failed; nested exception is javax.validation.Validation
Exception: Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.

解决方法:https://stackoverflow.com/questions/36938855/error-creating-bean-with-name-spring-datasource-configuration-properties

  1. Maven deploy跳过某个module解决办法

    org.apache.maven.plugins
    maven-deploy-plugin
    2.8.2
    
        true
    

  1. 用户编写的spark程序打包成jar后提交到yarn执行时,经常会遇到jar包中明显存在某个类,但任务提交到yarn运行时却找不到类或方法(java.lang.NoSuchMethodError)的问题。
    原因是本地的jar包被SPARK_HOME/lib中的jar覆盖。spark程序在提交到yarn时,除了上传用户程序的jar,还会上传SPARK_HOME的lib目录下的所有jar包(参考附录2 )。如果你程序用到的jar与SPARK_HOME/lib下的jar发生冲突,那么默认会优先加载SPARK_HOME/lib下的jar,而不是你程序的jar,所以会发生“ NoSuchMethodError”
spark.driver.userClassPathFirst
spark.executor.userClassPathFirst
  1. val df = sqlContext.table("dbName.tableName")
Exception in thread "main" org.apache.spark.sql.AnalysisException: Specifying database name or other qualifiers are not allowed for temporary tables. If the table name has dots (.) in it, please quote the table name with backticks (`).;

You can't do that from sqlContext, you'll need to define a HiveContext for that as followed :
https://stackoverflow.com/questions/33221092/need-to-access-hive-table-using-database-qualifier-from-spark

  1. Save Spark dataframe as dynamic partitioned table in Hive

你可能感兴趣的:(工程开发技巧)