大数据编程常用方法、依赖、工具

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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_slaves

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值