Spark 电商应用开发过程中出现的问题汇总

1.java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
报错信息

描述: 出现这个问题并不妨碍程序继续运行。
原因: HiveContext的创建依赖于本地的hadoop库。


Exception具体问题
问题行

解决:
这边的null其实是环境变量HADOOP_HOME,也就是依赖于HADOOP_HOME/bin/winutils.exe这个文件。

可以参考: https://blog.csdn.net/love666666shen/article/details/78812622

2.Task is not serializable.

任务不可序列化。
原因: 一般是随意使用Function外的变量,例如JavaSparkContext等。因为完整main的代码在Driver中执行,而计算分片代码在Spark的worker节点执行,因此最好只保证算子数据的传递只有RDD或者DStream.

3.HiveContext报空指针

在Windows本地调试,用HiveContext报空指针。
这个问题就需要本地的一个测试工具winutils.exe。
因此 问题3 == 问题1.具体问题可以参照问题1解决。

参考: https://blog.csdn.net/u011817217/article/details/86593706

如果出现按以上方法依然无法解决或者还存在其他问题,可以直接把hive-site.xml扔到resources目录,访问虚拟机中的hive.


如上图解决方法
注意窗口操作在SPARK<=1.6时,只支持HiveContext,不支持SQLContext
4.ROW_NUMBER() OVER ( PARTITION BY ... ORDER BY ... )
select province,aid,clickCount from (select 
date,province,aid,clickCount,ROW_NUMBER() OVER ( 
PARTITION BY province ORDER BY click_count DESC) as rank 
from tmp_date_city_aid_clickCount ) as twhere rank <= 10
异常的语法错误
问题操作

原因:
https://www.e-learn.cn/content/wangluowenzhang/422390

Spark >= 2.0 时,HiveContext/SQLContext都支持窗口操作。
Spark <= 1.6 时,只有HiveContext 支持窗口操作。

解决:
我使用的版本为1.6,SQLContext,因此导致了这个问题。因此必须使用HiveContext方能够解决。

5.SQLContext注册临时表的目录无法删除

ERROR ShutdownHookManager: Exception while deleting Spark temp dir

问题

这是个BUG: [SPAKR-8333] HiveContext创建的临时目录无法删除。可见任何软件都有一定的问题和缺陷,需要我们不断完善,为世界代码业做贡献。
https://issues.apache.org/jira/browse/SPARK-8333?attachmentSortBy=dateTime

6.HiveContext : java.lang.RuntimeException: java.lang.RuntimeException: The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: ---------

当指定hive-site.xml时,会使用线上的HDFS集群存储本临时文件,因此需要在resource下放入hdfs的配置文件,还需要将hadoop上/tmp/hive/目录创建并赋好权限。

image.png
7.部署问题 Exception in thread "main" java.lang.SecurityException: class "javax.servlet.FilterRegistration"'s signer information does not match signer information of other classes in the same package
image.png

原因: javax.servlet.FilterRegistration 在多个包中重复产生,导致冲突。
一般为这个依赖所致:

  
    
        org.apache.hadoop
        hadoop-client
        2.4.1
        
            
                javax.servlet
                *
            
        
    

解决就是加上如上的:

          
            
                javax.servlet
                *
            
        
8.HiveContext连接元数据库mysql时连接数过多的问题,我测试了一下,发现在DStream的Function中使用DataFrame进行sql查询时候,不断产生于hive元数据所在的mysql的连接。导致抛出“too many connections"异常。
连接数上限为150.png

看来默认的mysql的最大连接数max_connections=150,我修改/etc/my.cnf中max_connections为1000.观察这种连接上涨是否有上限。


image.png

重启mysqld:


image.png

你可能感兴趣的:(Spark 电商应用开发过程中出现的问题汇总)