spark常见问题错误 汇总

 

一.经验

1.Spark Streaming包含三种计算模式:nonstate .stateful .window


2.kafka可通过配置文件使用自带的zookeeper集群


3.Spark一切操作归根结底是对RDD的操作


4.部署Spark任务,不用拷贝整个架包,只需拷贝被修改的文件,然后在目标服务器上编译打包。


5.kafka的log.dirs不要设置成/tmp下的目录,貌似tmp目录有文件数和磁盘容量限制


6.ES的分片类似kafka的partition


7spark Graph根据边集合构建图,顶点集合只是指定图中哪些顶点有效


8.presto集群没必要采用on yarn模式,因为hadoop依赖HDFS,如果部分机器磁盘很小,hadoop会很尴尬,而presto是纯内存计算,不依赖磁盘,独立安装可以跨越多个集群,可以说有内存的地方就可以有presto


9.presto进程一旦启动,JVM server会一直占用内存


10.如果maven下载很慢,很可能是被天朝的GFW墙了,可以在maven安装目录的setting.conf配置文件mirrors标签下加入国内镜像抵制**党的网络封锁,例如:


  nexus-aliyun
  *
  Nexus aliyun
  http://maven.aliyun.com/nexus/content/groups/public

11.编译spark,hive on spark就不要加-Phive参数,若需sparkSQL支持hive语法则要加-Phive参数


12.通过hive源文件pom.xml查看适配的spark版本,只要打版本保持一致就行,例如spark1.6.0和1.6.2都能匹配


13.打开Hive命令行客户端,观察输出日志是否有打印“SLF4J: Found binding in [jar:file:/work/poa/hive-2.1.0-bin/lib/spark-assembly-1.6.2-hadoop2.6.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]”来判断hive有没有绑定spark


14.kafka的comsumer groupID对于spark direct streaming无效


15.shuffle write就是在一个stage结束计算之后,为了下一个stage可以执行shuffle类的算子,而将每个task处理的数据按key进行分类,将相同key都写入同一个磁盘文件中,而每一个磁盘文件都只属于下游stage的一个task,在将数据写入磁盘之前,会先将数据写入内存缓存中,下一个stage的task有多少个,当前stage的每个task就要创建多少份磁盘文件。


16.单个spark任务的excutor核数不宜设置过高,否则会导致其他JOB延迟


17.数据倾斜只发生在shuffle过程,可能触发shuffle操作的算子有:distinctgroupByKeyreduceByKeyaggregateByKeyjoincogrouprepartition


18.运行时删除hadoop数据目录会导致依赖HDFS的JOB失效


19.sparkSQL UDAF中update函数的第二个参数 input: Row 对应的并非DataFrame的行,而是被inputSchema投影了的行


20.Spark的Driver只有在Action时才会收到结果


21.Spark需要全局聚合变量时应当使用累加器(Accumulator)


22.Kafka以topic与consumer group划分关系,一个topic的消息会被订阅它的消费者组全部消费,如果希望某个consumer使用topic的全部消息,可将该组只设一个消费者,每个组的消费者数目不能大于topic的partition总数,否则多出的consumer将无消可费


23.所有自定义类要实现serializable接口,否则在集群中无法生效


24.resources资源文件读取要在Spark Driver端进行,以局部变量方式传给闭包函数


25.DStream流转化只产生临时流对象,如果要继续使用,需要一个引用指向该临时流对象


26.提交到yarn cluster的作业不能直接print到控制台,要用log4j输出到日志文件中


27.HDFS文件路径写法为:hdfs://master:9000/文件路径,这里的master是namenode的hostname,9000是hdfs端口号。


28.不要随意格式化HDFS,这会带来数据版本不一致等诸多问题,格式化前要清空数据文件夹


29.搭建集群时要首先配置好主机名,并重启机器让配置的主机名生效


30.linux批量多机互信, 将pub秘钥配成一个


31小于128M的小文件都会占据一个128M的BLOCK,合并或者删除小文件节省磁盘空间


32.Non DFS Used指的是非HDFS的所有文件


33.spark两个分区方法coalesce和repartition,前者窄依赖,分区后数据不均匀,后者宽依赖,引发shuffle操作,分区后数据均匀


34.spark中数据写入ElasticSearch的操作必须在action中以RDD为单位执行


35.可以通过hive-site.xml修改spark.executor.instancesspark.executor.coresspark.executor.memory等配置来优化hive on spark执行性能,不过最好配成动态资源分配。








 

二.基本功能

0.常见问题:

1如果运行程序出现错误:Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory,这是因为项目缺少slf4j-api.jarslf4j-log4j12.jar这两个jar包导致的错误。
2如果运行程序出现错误:java.lang.NoClassDefFoundError: org/apache/log4j/LogManager,这是因为项目缺少log4j.jar这个jar包
3错误:Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.MDC.getCopyOfContextMap()Ljava/util/Map,这是因为jar包版本冲突造成的。

1.配置spark-submit (CDH版本)

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
        at org.apache.spark.deploy.SparkSubmitArguments.handleUnknown(SparkSubmitArguments.scala:451)
        at org.apache.spark.launcher.SparkSubmitOptionParser.parse(SparkSubmitOptionParser.java:178)
        at org.apache.spark.deploy.SparkSubmitArguments.(SparkSubmitArguments.scala:97)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:113)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.FSDataInputStream
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 5 more

解决方案:

spark-env.sh文件中添加:

export SPARK_DIST_CLASSPATH=$(hadoop classpath)



 

2.启动spark-shell时,报错

INFO cluster.YarnClientSchedulerBackend: Registered executor: Actor[akka.tcp://sparkExecutor@services07:34965/user/Executor#1736210263] with ID 1
INFO util.RackResolver: Resolved services07 to /default-rack
INFO storage.BlockManagerMasterActor: Registering block manager services07:51154 with 534.5 MB RAM

解决方案:

在spark的spark-env配置文件中配置下列配置项:

将export SPARK_WORKER_MEMORY, export SPARK_DRIVER_MEMORY, export SPARK_YARN_AM_MEMORY的值设置成小于534.5 MB



 

3.启动spark SQL时,报错:

  Caused by: org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFoundException: The specified datastore driver ("com.mysql.jdbc.Driver ") was not found in the CLASSPATH. Please check your CLASSPATH specification, and the name of the driver.

解决方案:

$SPARK_HOME/conf/spark-env.sh文件中配置:

export SPARK_CLASSPATH=$HIVE_HOME/lib/mysql-connector-java-5.1.6-bin.jar



 

4.启动spark SQL时,报错:

  java.sql.SQLException: Access denied for user 'services02 '@'services02' (using password: YES)

解决方案:

检查hive-site.xml的配置项, 有以下这个配置项


    javax.jdo.option.ConnectionPassword
    123456
    password to use against metastore database

看该密码与与MySQL的登录密码是否一致




 

5.启动计算任务时报错:

报错信息为:

  org.apache.spark.rpc.RpcTimeoutException: Futures timed out after [120 seconds]. This timeout is controlled by 

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