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)