3.2 创建通用子模块

通用模块主要是放公共的依赖包和配置文件,以及用户自定义的一些工具类, 样例类等。

3.2.1 添加依赖

<dependencies>
    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.47</version>
    </dependency>


    <dependency>
        <!-- common-pool2使用的是面向接口的编程,它为我们提供的是一个抽象的对象池管理方式,
             根据我们业务的不同,我们需要重写或实现一些方法和接口 -->
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <version>2.4.2</version>
    </dependency>

    <dependency>
        <!-- 有助于以各种格式读取配置/偏好文件的工具 -->
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-configuration2</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <!-- commons-beanutil中包括大量和JavaBean操作有关的工具方法,
             使用它能够轻松利用Java反射机制来完毕代码中所须要的功能,而不须要具体研究反射的原理和使用 -->
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.9.3</version>
    </dependency>
    <!--mysql 驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.44</version>
    </dependency>
    <!--kafka 客户端-->
    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-clients</artifactId>
        <version>0.10.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_2.11</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
    </dependency>

    <!--阿里巴巴出品的数据库连接池. druid 是目前最好的数据库连接池-->
    <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.10</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib -->
    <dependency>
        <groupId>net.sf.json-lib</groupId>
        <artifactId>json-lib</artifactId>
        <version>2.4</version>
        <classifier>jdk15</classifier>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.json4s/json4s-native -->
    <dependency>
        <groupId>org.json4s</groupId>
        <artifactId>json4s-native_2.11</artifactId>
        <version>3.2.11</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.json4s/json4s-jackson -->
    <dependency>
        <groupId>org.json4s</groupId>
        <artifactId>json4s-jackson_2.11</artifactId>
        <version>3.2.11</version>
    </dependency>

</dependencies>
<build>
    <plugins>
        <!-- 打包插件, 否则 scala 类不会编译病打包进去 -->
        <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>scala-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

3.2.2 在resources中添加资源文件

log4j.properties文件

框架会自动读取log4j的配置

# 只输出错误级别的日志.
log4j.rootLogger=error, stdout,R
# 控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS}  %5p --- [%2t]  %-8c(line:%2L)  :  %m%n
# 可滚动的文件
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=../log/agent.log
log4j.appender.R.MaxFileSize=1024KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS}  %5p --- [%2t]  %-8c(line:%2L)  :  %m%n

config.properties 文件

一些配置, 在代码中需要手动读取

# jdbc配置
jdbc.maxActive=10
# 根据自己情况进行修改
jdbc.url=jdbc:mysql://hadoop201:3306/sparkmall?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
jdbc.user=root
jdbc.password=aaa

# Kafka broker配置
kafka.broker.list=hadoop201:9092,hadoop202:9092,hadoop203:9092

# Redis配置
redis.host=hadoop201
redis.port=6379

# hive数据库名字(选配)
hive.database=sparkmall

hive-site.xml 文件

用来连接 Linux 中的 Hive

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://hadoop201:3306/metastore?createDatabaseIfNotExist=true</value>
        <description>JDBC connect string for a JDBC metastore</description>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
        <description>Driver class name for a JDBC metastore</description>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
        <description>username to use against metastore database</description>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>aaa</value>
        <description>password to use against metastore database</description>
    </property>
    <!-- zookeeper 地址-->
    <property>
        <name>hive.zookeeper.quorum</name>
        <value>hadoop201,hadoop202,hadoop203</value>
        <description>The list of ZooKeeper servers to talk to. This is only needed for read/write locks.</description>
    </property>
    <!-- zookeeper 端口号 -->
    <property>
        <name>hive.zookeeper.client.port</name>
        <value>2181</value>
        <description>The port of ZooKeeper servers to talk to. This is only needed for read/write locks.</description>
    </property>
</configuration>

3.3.3 创建需要的类

1. ConfigurationUtil.scala 文件

在这个 scala 文件中定义读取配置文件的一些工具

位于包: package com.atguigu.sparkmall.common.util

package com.atguigu.sparkmall.common.util

import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder
import org.apache.commons.configuration2.builder.fluent.Parameters
import org.apache.commons.configuration2.{FileBasedConfiguration, PropertiesConfiguration}

import scala.collection.mutable

/**
  * 用来读取配置文件的工具类
  */
object ConfigurationUtil {
    // 这个 map 用来存储配置文件名和在这个文件内定义的配置
    private val configs = mutable.Map[String, FileBasedConfiguration]()

    // 参数是配置文件名
    def apply(propertiesFileName: String) = {
        // 根据配置文件名来获取来获取对应的配置.  
        // 如果 map 中存在这一的配置文件, 则读取配置文件的内容并更新到 map 中
        configs.getOrElseUpdate(
            propertiesFileName,
            new FileBasedConfigurationBuilder[FileBasedConfiguration](classOf[PropertiesConfiguration]).configure(new Parameters().properties().setFileName(propertiesFileName)).getConfiguration)
    }

    def main(args: Array[String]): Unit = {
        // 测试是否可用
        val conf = ConfigurationUtil("config.properties")
        println(conf.getString("jdbc.user"))

    }
}

2. DataModel.scala 文件

在这个文件中定义一些用来封装数据的bean类. 为了方便, 我们使用 scala 的样例类

位于包: com.atguigu.sparkmall.common.bean

package com.atguigu.sparkmall.common.bean

/**
  * 用户表
  *
  * @param user_id      用户 id
  * @param username     用户的登录名
  * @param name         用户的昵称或真实名
  * @param age          用户年龄
  * @param professional 用户的职业
  * @param gender       用户的性别
  */
case class UserInfo(user_id: Long,
                    username: String,
                    name: String,
                    age: Int,
                    professional: String,
                    gender: String)

/**
  * 城市表
  *
  * @param city_id   城市 id
  * @param city_name 城市名
  * @param area      城市区域
  */
case class CityInfo(city_id: Long,
                    city_name: String,
                    area: String)

/**
  * 产品表
  *
  * @param product_id   商品的ID
  * @param product_name 商品的名称
  * @param extend_info  商品额外的信息
  */
case class ProductInfo(product_id: Long,
                       product_name: String,
                       extend_info: String)

/**
  * 用户访问动作表
  *
  * @param date               用户点击行为的日期
  * @param user_id            用户的ID
  * @param session_id         Session的ID
  * @param page_id            某个页面的ID
  * @param action_time        动作的时间点
  * @param search_keyword     用户搜索的关键词
  * @param click_category_id  某一个商品品类的ID
  * @param click_product_id   某一个商品的ID
  * @param order_category_ids 一次订单中所有品类的ID集合
  * @param order_product_ids  一次订单中所有商品的ID集合
  * @param pay_category_ids   一次支付中所有品类的ID集合
  * @param pay_product_ids    一次支付中所有商品的ID集合
  */
case class UserVisitAction(date: String,
                           user_id: Long,
                           session_id: String,
                           page_id: Long,
                           action_time: String,
                           search_keyword: String,
                           click_category_id: Long,
                           click_product_id: Long,
                           order_category_ids: String,
                           order_product_ids: String,
                           pay_category_ids: String,
                           pay_product_ids: String,
                           city_id: Long)
Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2019-08-20 02:00:56

results matching ""

    No results matching ""