文章目录
- 1 修改序列化器
- 2 Java集合与Scala集合相互转换需要得隐式转换
- 3 DS与RDD、DF之间相互转换得隐式转换
- 4 广播变量
- 5 累加器
- 6 自定义累加器需继承AccumulatorV2这个类
- 7 SparkContext的创建方式
- 8 SparkSession的创建方式
- 9 SparkStreaming的创建方式
- 10 自定义聚合函数
- 11 本地通过SparkSql 查询Hive
- 12 SparkStreaming消费Kafka(0.8版本)数据
- 13 redisUtil从连接池获取连接
- 14 KafkaUtil 返回Dstream
- 15 propertiesUtil解析配置文件
- 16 ES依赖
- 17 整合Phoenix需要导入的隐式转换
- 18 scala 专用的 Json 解析工具
- 19 springboot-mybatis 整合Phoenix配置文件
- 20 canal 依赖
- 21 编译scala的maven插件
- 22 打包插件,将依赖打进项目Maven插件
- 23 Flink scala依赖
1 修改序列化器
val conf: SparkConf = new SparkConf()
.setAppName("SerDemo")
.setMaster("local[*]")
// 替换默认的序列化机制
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
// 注册需要使用 kryo 序列化的自定义类
.registerKryoClasses(Array(classOf[xxx]))
2 Java集合与Scala集合相互转换需要得隐式转换
import scala.collection.JavaConversions._
3 DS与RDD、DF之间相互转换得隐式转换
import spark.implicits._
注:
这里的spark不是包名, 而是表示SparkSession 的那个对象. 所以必须先创建SparkSession对象再导入
4 广播变量
SparkContext.broadcast(v)
注:
广播变量通过调用SparkContext.broadcast(v)来创建. 广播变量是对v的包装, 通过调用广播变量的 value方法可以访问
5 累加器
可通过SparkContext对象.属性得方法获取系统累加器
如:
sc.longAccumulator
6 自定义累加器需继承AccumulatorV2这个类
7 SparkContext的创建方式
val conf: SparkConf = new SparkConf().setAppName("appName")
val sc = new SparkContext(conf)
//业务逻辑
sc.stop()
8 SparkSession的创建方式
val spark: SparkSession = SparkSession.builder()
.master("local[*]")
.appName("appName")
.getOrCreate()
spark.sql("select * from xxx").show()
//业务逻辑
spark.stop()
9 SparkStreaming的创建方式
val conf = new SparkConf().setAppName("appName").setMaster("local[*]")
val ssc = new StreamingContext(conf, Seconds(3)) // 指定多久为一批次
//业务逻辑
ssc.start() //启动
ssc.awaitTermination() //阻塞线程
10 自定义聚合函数
用户类继承UserDefinedAggregateFunction类
并注册自定义函数:
val spark: SparkSession = SparkSession
.builder()
.master("local[*]")
.appName("appName")
.getOrCreate()
// 注册自定义函数
spark.udf.register("myAvg", new MyAvg) // 自定义类
11 本地通过SparkSql 查询Hive
- 将服务器端hive-site.xml复制到项目的resource目录下
- 在创建SparkSession对象的时候开启支持
val spark: SparkSession = SparkSession
.builder()
.master("local[*]")
.appName("appName")
.enableHiveSupport() // 开启支持hive
.getOrCreate()
//业务逻辑
spark.sql("use test")
spark.sql("select xxx ").show()
spark.stop()
12 SparkStreaming消费Kafka(0.8版本)数据
val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("appName")
val ssc = new StreamingContext(conf, Seconds(3))
val brokers = "hadoop102:9092,hadoop103:9092,hadoop104:9092"
val topic = "first" //主题
val group = "bigdata" // 消费者组
val deserialization = "org.apache.kafka.common.serialization.StringDeserializer" //序列化器
val kafkaParams = Map(
"zookeeper.connect" -> "hadoop102:2181,hadoop103:2181,hadoop104:2181",
ConsumerConfig.GROUP_ID_CONFIG -> group,
ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> brokers,
ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG -> deserialization,
ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG -> deserialization
)
val dStream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
ssc, kafkaParams, Set(topic))
dStream.print()
ssc.start()
ssc. ssc.awaitTermination()
13 redisUtil从连接池获取连接
import redis.clients.jedis.{Jedis, JedisPool, JedisPoolConfig}
object RedisUtil {
private val jedisPoolConfig: JedisPoolConfig = new JedisPoolConfig()
jedisPoolConfig.setMaxTotal(100) //最大连接数
jedisPoolConfig.setMaxIdle(20) //最大空闲
jedisPoolConfig.setMinIdle(20) //最小空闲
jedisPoolConfig.setBlockWhenExhausted(true) //忙碌时是否等待
jedisPoolConfig.setMaxWaitMillis(500) //忙碌时等待时长 毫秒
jedisPoolConfig.setTestOnBorrow(true) //每次获得连接的进行测试
private val jedisPool: JedisPool = new JedisPool(jedisPoolConfig, "hadoop102", 6379)
// 直接得到一个 Redis 的连接
def getJedisClient: Jedis = {
jedisPool.getResource
}
}
14 KafkaUtil 返回Dstream
object MyKafkaUtil {
def getKafkaStream(ssc: StreamingContext, topic: String): InputDStream[(String, String)] = {
val params: Map[String, String] = Map(
ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> PropertiesUtil.getProperty("kafka.broker.list"),
ConsumerConfig.GROUP_ID_CONFIG -> PropertiesUtil.getProperty("kafka.group")
)
KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, params, Set(topic))
}
}
15 propertiesUtil解析配置文件
object PropertiesUtil {
def getProperty(propertiesName:String,propertyName: String): String = {
val is: InputStream = ClassLoader.getSystemResourceAsStream(propertiesName)
val properties = new Properties()
properties.load(is)
properties.getProperty(propertyName)
}
16 ES依赖
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>6.3.1</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>commons-compiler</artifactId>
<version>2.7.8</version>
</dependency>
17 整合Phoenix需要导入的隐式转换
import org.apache.phoenix.spark._
// 参数1: 表名 参数2: 列名组成的 seq 参数 zkUrl: zookeeper 地址
rdd.saveToPhoenix(
"tableName",
Seq("MID", "UID", "APPID", "AREA", "OS", "CHANNEL", "LOGTYPE", "VERSION", "TS", "LOGDATE", "LOGHOUR"),
zkUrl = Some("zookeeper地址"))
})
18 scala 专用的 Json 解析工具
<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-jackson_2.11</artifactId>
<version>3.2.11</version>
</dependency>
将map中的数据转换程Json字符串
import org.json4s.JsonDSL._
val resultMap: mutable.Map[String, Map[String, Long]] = mutable.Map[String, Map[String, Long]]()
JsonMethods.compact(JsonMethods.render(resultMap))//转换称json字符串
19 springboot-mybatis 整合Phoenix配置文件
server.port=8070
logging.level.root=error
# jdbc
spring.datasource.driver-class-name=org.apache.phoenix.jdbc.PhoenixDriver //连接Phoenix的驱动
spring.datasource.url=jdbc:phoenix:hadoop102,hadoop103,hadoop104:2181//路径必须这样指定
spring.datasource.data-username=
spring.datasource.data-password=
# mybatis
# 做映射的时候会在 resources/mapper 目录找对应的 xml 文件
mybatis.mapperLocations=classpath:mapper/*.xml
# 字段名是否自动从下划线映射到驼峰命名 一般都是使用 true
mybatis.configuration.map-underscore-to-camel-case=true
20 canal 依赖
<!--canal 客户端, 从 canal 服务器读取数据-->
<dependency>
<groupId>com.alibaba.otter</groupId>
<artifactId>canal.client</artifactId>
<version>1.1.2</version>
</dependency>
解析监控打破的数据
// 1. 创建能连接到 Canal 的连接器对象
val connector: CanalConnector = CanalConnectors.newSingleConnector(new InetSocketAddress("hadoop201", 11111), "example", "", "")
// 2. 连接到 Canal
connector.connect()
// 3. 监控指定的表的数据的变化
connector.subscribe("gmall.order_info")
while (true) {
// 4. 获取消息 (一个消息对应 多条sql 语句的执行)
val msg: Message = connector.get(100) // 一次最多获取 100 条 sql
// 5. 个消息对应多行数据发生了变化, 一个 entry 表示一条 sql 语句的执行
val entries: java.util.List[CanalEntry.Entry] = msg.getEntries
import scala.collection.JavaConversions._
if (entries.size() > 0) {
// 6. 遍历每行数据
for (entry <- entries) {
// 7. EntryType.ROWDATA 只对这样的 EntryType 做处理
if (entry.getEntryType == EntryType.ROWDATA) {
// 8. 获取到这行数据, 但是这种数据不是字符串, 所以要解析
val value: ByteString = entry.getStoreValue
val rowChange: RowChange = RowChange.parseFrom(value)
// 9.定义专门处理的工具类: 参数 1 表名, 参数 2 事件类型(插入, 删除等), 参数 3: 具体的数据
CanalHandler.handle(entry.getHeader.getTableName, rowChange.getEventType, rowChange.getRowDatasList)
}
}
} else {
println("没有抓取到数据...., 2s 之后重新抓取")
Thread.sleep(2000)
}
}
}
}
CanalHandler 解析canal 行数据
object CanalHandler {
/**
* 处理从 canal 取来的数据
*
* @param tableName 表名
* @param eventType 事件类型
* @param rowDataList 数据类别
*/
def handle(tableName: String, eventType: EventType, rowDataList: util.List[RowData]) = {
import scala.collection.JavaConversions._
if ("order_info" == tableName && eventType == EventType.INSERT && rowDataList.size() > 0) {
// 1. rowData 表示一行数据, 通过他得到每一列. 首先遍历每一行数据
for (rowData <- rowDataList) {
// 2. 得到每行中, 所有列组成的列表
val columnList: util.List[CanalEntry.Column] = rowData.getAfterColumnsList
for (column <- columnList) {
// 3. 得到列名和列值
println(column.getName + ":" + column.getValue)
}
}
}
}
}
21 编译scala的maven插件
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.4.6</version>
<executions>
<execution>
<!-- 声明绑定到maven的compile阶段 -->
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
22 打包插件,将依赖打进项目Maven插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
23 Flink scala依赖
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_2.11</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.7.2</version>
</dependency>