原文链接:https://mp.youkuaiyun.com/postedit/82423831
出现此类问题有很多种, 当时遇到这问题的因为是在spark未改动的情况下, 更换了Hive的版本导致版本不对出现了此问题,
一.经验
- Spark Streaming包含三种计算模式:nonstate .stateful .window
- kafka可通过配置文件使用自带的zookeeper集群
- Spark一切操作归根结底是对RDD的操作
- 部署Spark任务,不用拷贝整个架包,只需拷贝被修改的文件,然后在目标服务器上编译打包。
- kafka的log.dirs不要设置成/tmp下的目录,貌似tmp目录有文件数和磁盘容量限制
- ES的分片类似kafka的partition
- spark Graph根据边集合构建图,顶点集合只是指定图中哪些顶点有效
- presto集群没必要采用on yarn模式,因为hadoop依赖HDFS,如果部分机器磁盘很小,hadoop会很尴尬,而presto是纯内存计算,不依赖磁盘,独立安装可以跨越多个集群,可以说有内存的地方就可以有presto
- presto进程一旦启动,JVM server会一直占用内存
- 如果maven下载很慢,很可能是被天朝的GFW墙了,可以在maven安装目录的setting.conf配置文件mirrors标签下加入国内镜像抵制**党的网络封锁,例如:
-
<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
- 编译spark,hive on spark就不要加-Phive参数,若需sparkSQL支持hive语法则要加-Phive参数
- 通过hive源文件pom.xml查看适配的spark版本,只要打版本保持一致就行,例如spark1.6.0和1.6.2都能匹配
- 打开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
- kafka的comsumer groupID对于spark direct streaming无效
- shuffle write就是在一个stage结束计算之后,为了下一个stage可以执行shuffle类的算子,而将每个task处理的数据按key进行分类,将相同key都写入同一个磁盘文件中,而每一个磁盘文件都只属于下游stage的一个task,在将数据写入磁盘之前,会先将数据写入内存缓存中,下一个stage的task有多少个,当前stage的每个task就要创建多少份磁盘文件。
- 单个spark任务的excutor核数不宜设置过高,否则会导致其他JOB延迟
- 数据倾斜只发生在shuffle过程,可能触发shuffle操作的算子有:distinct, groupByKey, reduceByKey, aggregateByKey, join, cogroup, repartition等
- 运行时删除hadoop数据目录会导致依赖HDFS的JOB失效
- sparkSQL UDAF中update函数的第二个参数 input: Row 对应的并非DataFrame的行,而是被inputSchema投影了的行
- Spark的Driver只有在Action时才会收到结果
- Spark需要全局聚合变量时应当使用累加器(Accumulator)
- Kafka以topic与consumer group划分关系,一个topic的消息会被订阅它的消费者组全部消费,如果希望某个consumer使用topic的全部消息,可将该组只设一个消费者,每个组的消费者数目不能大于topic的partition总数,否则多出的consumer将无消可费
- 所有自定义类要实现serializable接口,否则在集群中无法生效
- resources资源文件读取要在Spark Driver端进行,以局部变量方式传给闭包函数
- DStream流转化只产生临时流对象,如果要继续使用,需要一个引用指向该临时流对象
- 提交到yarn cluster的作业不能直接print到