1.广播变量
将广播变量生成后,通过collect,collectAsMap 全部拉取到Driver端,然后广播出去
2.spark 广播视图表(默认是10兆,超过不会广播)
a> df.registerTempTable("smalltable")
spark.sql(CACHE TABLE smalltable")
2.设置广播视图表大小
spark.sql.autoBroadcastJoinThreshold 默认是10MB,单位Byte
错误方式 sc.broadcast(df) 无法广播
2.ES HBase 整合
Hbase 非rowkey字段查询只能全表scan,不支持模糊查询
建立索引
将Hbase需要索引的字段和rowkey存入ES,对于文档关键字有检索需求可以使用分词
根据二级索引字段查询:
a>.根据查询字段条件,让ES查询数据,并返回查询结果的rowkey
b>.根据第一步返回的rowkey,去hbase检索,并返回结果集
3.spark 读写关系型数据库
a> 读
val map = scala.collection.mutable.HashMap[String,String]()
map += "url"->"jdbc:mysql://hadoop:3306/myspark"
map += "drive"->"com.mysql.jdbc.Driver"
map += "dbtable"->"mytopic"
map += "user"->"root"
map += "password"->"123456"
var jdbcToDF = sqlContext.read.format("jdbc").options(map).load()
b> 写
val prop = new java.util.Properties()
prop.set("user","root")
prop.set("password","123456")
val url = "jdbc:mysql://hadoop:3306/myspark"
df.write.mode(SaveMode.Append).jdbc(url,"my_kafka",prop)
4.spark 连接DB不同
解决:
以yarn-client为spark job 运行模式
选择spark 集群中yarn-client所在机器(Driver端,单机)进行读取数据,将数据同makeRDD(Seq),parallelize转换为RDD,分发到spark集群进行spark作业处理
选择spark 集群中yarn-client所在机器(Driver端,单机)进行保存数据,先将DF数据拉取到Driver(collect),然后在Driver迭代保存数据到RDBMS
作业
1. 关系型DB数据库(MySQL、Oracle等)与大数据集群网络不通, 如何将数据从数据库读取出来或者将数据写入到数据库?
1.spark 程序提交使用yarn-client模式
2.spark客户端与mysql服务器和hadoop集群网络连通
3.使用collect算子,将各个executor数据拉到Driver端(即yarn-client 模式Driver所在机器)
4.在Driver端(hadoop客户端)将数据写入Mysql
2. 简述什么场景下, 需要对Spark Driver内存调优?
当选择spark 集群中yarn-client所在机器(Driver端,单机)进行保存数据,先将DF数据拉取到Driver(collect),然后在Driver迭代保存数据到RDBMS
将数据从各个executor节点聚合到Driver端时,需要将Driver内存调大,防止出现OOM问题
3.简述Azkaban三个组件的作用
azkaban web: 使用Jetty对外提供web服务,使用户可以通过web页面方便管理,用来上传,提交Job,对Job的运行时间,运行状态进行管理,监控,用来发送Job作业预警等
azkaban executor:负责具体的工作流的提交、执行, 用来向运行spark,hadoop作业的集群,shell 环境发送,启动任务
mysql :用于存储项目、日志或者执行计划之类的信息,保存job 运行,管理,监控信息,各个executor 节点的配置信息