18年的开发总结

个人总结

  1. 如果在运行spark的时候,有时候环境的问题需要引入其他的jar包,那么我们可以使用--driver-class-path $HBASE_HOME/lib/*:classpath也可以以在脚本前面执行export ****生成当前需要的环境
  1. 当前我们集群使用的版本 jdk1.8 spark2.11 hive2.1.1 hbase1.3.0 hadoop2.7.3 zookeeper3.4.10
  2. spark提交任务的时候,需要根据当前的资源来调试core和memory ,如果出现org.apache.spark.shuffle.FetchFailedException:Failed to connect to 异常,由于execute的可用资源太少,shuffle执行时间变长,内存使用过多导致无响应心跳,超过默认的超时时间Executor被移出后,任务丢失。当spark的DAGSchedule尝试提交失败的task到其他的Executor,但是由于其他的Executor也是相同的配置资源,所以最终的任务还是会失败。那么需要我们调整如下配置减少shuffle的操作来减少使用内存、增大spark.network.timeout的时间、增加spark.executor.cores,从而减少创建的Executor的数量,减少内存使用、增大spark.executor.memory保证每个Executor有足够的内存
  3. 如果数据量不是很大的话,没必要设置分区太大,不然的话每个分区上的数据都很小,某一个分区上的数据发生倾斜时候,其他的分区就会关闭,导致连接失败,然后某个分区的数据就会发生OOM,这时候一、减少运行cores;二、增加每个core的memory,三、减少partition。
  4. 遇到spark任务报错,Container killed by YARN for exceeding memory limits. 16.9 GB of 16 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead,首先要做的是增加'spark.yarn.executor.memoryOverhead',到4096,但还是报错。要考虑的第二件事是,您的数据是否在分区之间保持平衡,三、尝试减少cores在内存中保留较少的任务,增加memory,但是还是会报错,查看了磁盘的适合用情况是没有问题的,代码也是都没有问题的,然后看数据量也不是很大,四、考虑分区:通常如果分区太多,输出文件很小,这是正常的,但问题出现在元数据HDFS中必须保持住,这会给HDFS带来压力并降低其性能。因此,找到分区数量的最佳位置非常重要,最后查看因为这批任务的数据小,竟然给了3000分区,减少到500 (也可以直接删除默认200)问题解决,详细可以看CSDN

项目总结

  1. 运行hfile入hbase库的时候,包Hconfig类找不到 classnotfoundException,问题出在亚马逊新搭建的环境需要配置$HBASE_HOME/*配置hbase的环境,然后在我们执行的load.sh的时候,加上这个环境变量就好了。
  2. .如果在发现环境问题,可以看看echo ,有时候,自己加的环境变量会失效,需要 source /etc/profile 生效一下
  3. hive默认的是UTF8的编码格式,要是我们把windows上的txt文件导入hive的时候,记得设置文件格式utf8,(曾经修改hive编码为GBK,然后再修改回来,重新覆盖导入UTF8的文件,生成Hfile乱码)
  4. hdfs distcp的时候会丢包 ,检查集群使用的资源是否被占用完了, 是否是同时分发到其他的集群,总之分发完后需要查看是否包名和大小都匹配。
  5. 部分功能升级后可能会导致其他的问题,需要运行调试,(曾经把Hbase过时的方法替换掉,导致在hdfs上发生IOException)
  6. Task failed while writing rows 就是使用concat函数的时候,从hive表中获取的字段不能为空,否则就会包这个异常,case by NullPointException,所以我加了 nvl(a,"NON")转换
  7. 使用hadoop的distcp的时候,第一次发送的时候,如果是没有创建包,发送的就是包里的内容,需要先创建,尽量别再同一个文件夹里同时分发多个文件
  8. 当使用多个线程创建过多的hbase链接的时候,就需要设置链接为单例模式。
  9. hadoop 使用分布式分发distcp的时候,报错copy异常,1.查看hadoop是否正常,进程是否完整xcall.sh jps;2.查看磁盘使用情况hadoop dfsadmin -report
  10. 多线程调用某个服务接口的时候,要是出现一段时间后链接异常,那说名我们的线程池可能使用的有问题,所以我们是使用了newCachedThreadPool
  11. 如果IDEA的package 打包后没有生成对应的class文件,还可以在setting里的compiler里的build project automatically 选项勾上,然后先clearn在complie编译,要是没有手动编译生成class文件的话,打包也没有class文件,然后package既可,也可以使用12
  12. idea的maven打包有的时候不会生成class文件,这个时候需要build一下,然后从新package 就可以了,(得需有target 文件的时候,build 不然有时候不会生成class)
  13. 13.hive表的查询的时候,我们需要导出到一个文件里面查,(hive -e 或者 spark -sql ... -e "")不然在shell脚本中查的部分数据是不完整的。
  14. 在spark的任务处理的时候,地理栅格需要对每个地理格子在订单表里查询,必然涉及到笛卡尔积,在跑任务的时候,直接报错,笛卡尔积太大12W *6000W数据,然后地理经纬度也是String类型,在sql比较的时候,把string使用cast方式转成double 这个函数每次需要执行,消耗资源,将string转double后可以正常执行。
  15. spark sql 执行过慢的时候,因为集群多核545 内存952 所以可以多给几个核,每个核内存降低 ,出现memoryOutOfhead ,也可以在程序conf 设置spark.sql.shuffle.partitions 大一点,默认200.
  16. mysql 里面是没有full join 的,如果用到 需要使用left join 和right join 后使用union 合并。
  17. 地里栅格 1.将csv文件生成hive表,然后取出最大的经纬度和最小的经纬度,在地址经纬度库里 查询出上海的数据;2.将上海的经纬度和csv生成的经纬度做关联 查询出具体的每个栅格里包含的地址(这里做两步是因为做笛卡尔积 ,所以尽量使表小一点)生成具体的地理栅格经纬度表;3.查询出每个栅格里存在的中文地址,然后去订单大表里通过地址关联查询出所有订单;4.通过row_number() over() 查询每个类型、品牌、商品的前5类的金额和订单数;5.然后全表关联整合在一张表里。
  18. 线程的资源最好是通过线程池提供,所以我们最好是不要在应用中显示创建线程;然后呢,阿里也是建议我们在创建线程的时候,不建议使用Executors,建议使用ThreadPoolExecutor的方式创建。
  19. Java中使用Arrays.asList将一个数组转成list后,他是没有add和remove属性的, 他只是Arrays中的一个静态内部类。
  20.  

 

 

 

 

 

你可能感兴趣的:(hadoop,spark)