目录
PageOneStepConvertRateSpark.java
本篇文章记录页面单跳转化率-编写基础代码。
由于基础数据是用户访问session分析模块基于的基础数据所以很多的方法和session模块中的spark作业中的代码一样,想在我们将这样的代码块提取出来作为方法进行复用。
代码
conf包
ConfigurationManager.java
/** * 获取Long类型的配置项 * @param key * @return */ public static Long getLong(String key){ String value = getProperty(key); try { return Long.valueOf(value); } catch ( Exception e){ e.printStackTrace(); } return 0L; }
constants包
Constants.java
/** * 数据库相关的常量 */ String SPARK_LOCAL_TASKID_SESSION = "spark.local.taskid.session"; String SPARK_LOCAL_TASKID_PAGE = "spark.local.taskid.page"; /** * Spark作业相关的常量 */ String SPARK_APP_NAME_PAGE = "PageOneStepConvertRateSpark";
util包
ParamUtils.java
/** * 从命令行中获取任务id * @param args 命令行参数 * @return 任务id */ public static Long getTaskIdFromArgs(String[] args,String taskType){ boolean local = ConfigurationManager.getBoolean(Constants.SPARK_LOCAL); if (local){ return ConfigurationManager.getLong(taskType); }else{ try{ if (args != null && args.length > 0){ return Long.valueOf(args[0]); } }catch (Exception e){ e.printStackTrace(); } } return null; }
SparkUtils.java
package graduation.java.util; import com.alibaba.fastjson.JSONObject; import graduation.java.conf.ConfigurationManager; import graduation.java.constant.Constants; import graduation.java.test.MockData; import org.apache.spark.SparkConf; import org.apache.spark.SparkContext; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SQLContext; import org.apache.spark.sql.hive.HiveContext; /** * FileName: SparkUtils * Author: hadoop * Email: 3165845957@qq.com * Date: 19-3-30 下午7:46 * Description: * Spark工具类 */ public class SparkUtils { /** * 根据当前是否是本地测试模式配置来决定 * 如果设置SparkConf的master * @param conf */ public static void setMaster(SparkConf conf){ boolean local = ConfigurationManager.getBoolean(Constants.SPARK_LOCAL); if (local){ conf.setMaster("local"); } } /** * 获取SQLContext * 如果是在本地测试环境的话,那么就生成SQLContext对象 * 如果是在生产环境运行的话,那么就生成HiveContext对象 * @param sc SparkContext * @return SQLContext */ public static SQLContext getSQLContext(SparkContext sc) { boolean local = ConfigurationManager.getBoolean(Constants.SPARK_LOCAL); if(local) { return new SQLContext(sc); } else { return new HiveContext(sc); } } /** * 生成模拟数据(只有本地模式,才会去生成模拟数据) * @param sc * @param sqlContext */ public static void mockData(JavaSparkContext sc, SQLContext sqlContext) { boolean local = ConfigurationManager.getBoolean(Constants.SPARK_LOCAL); if(local) { MockData.mock(sc, sqlContext); } } /** * 获取指定日期范围内的用户访问行为数据 * @param sqlContext SQLContext * @param taskParam 任务参数 * @return 行为数据RDD */ public static JavaRDD<Row> getActionRDDByDateRange( SQLContext sqlContext, JSONObject taskParam) { String startDate = ParamUtils.getParam(taskParam, Constants.PARAM_START_DATE); String endDate = ParamUtils.getParam(taskParam, Constants.PARAM_END_DATE); String sql = "select * " + "from user_visit_action " + "where date>='" + startDate + "' " + "and date<='" + endDate + "'"; Dataset actionDF = sqlContext.sql(sql); System.out.println("actionDF"); actionDF.show(10); /** * 这里就很有可能发生上面说的问题 * 比如说,Spark SQl默认就给第一个stage设置了20个task,但是根据你的数据量以及算法的复杂度 * 实际上,你需要1000个task去并行执行 * * 所以说,在这里,就可以对Spark SQL刚刚查询出来的RDD执行repartition重分区操作 */ //return actionDF.javaRDD().repartition(100); return actionDF.javaRDD(); } }
resources包
my.properties
spark.local.taskid.session=1 spark.local.taskid.page=2
spark..page包
PageOneStepConvertRateSpark.java
package graduation.java.spark.page; import com.alibaba.fastjson.JSONObject; import graduation.java.constant.Constants; import graduation.java.dao.ITaskDAO; import graduation.java.domain.Task; import graduation.java.factory.DAOFactory; import graduation.java.util.ParamUtils; import graduation.java.util.SparkUtils; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.Row; import org.apache.spark.sql.SQLContext; import java.util.Date; /** * FileName: PageOneStepConvertRateSpark * Author: hadoop * Email: 3165845957@qq.com * Date: 19-3-30 下午8:00 * Description: * 页面单跳转化率模块spark作业 */ public class PageOneStepConvertRateSpark { public static void main(String[] args) { //1.构建SparkConf上下文 SparkConf conf = new SparkConf() .setAppName(Constants.SPARK_APP_NAME_PAGE); SparkUtils.setMaster(conf); JavaSparkContext sc = new JavaSparkContext(conf); SQLContext sqlContext = SparkUtils.getSQLContext(sc.sc()); //2.生成模拟数据 SparkUtils.mockData(sc,sqlContext); //3.查询任务、获取任务参数 long taskid = ParamUtils.getTaskIdFromArgs(args,Constants.SPARK_LOCAL_TASKID_PAGE); ITaskDAO taskDAO = DAOFactory.getTaskDAO(); Task task = taskDAO.findById(taskid); if (task == null){ System.out.println(new Date() + ": cannot find this task with id ["+ taskid+ "]"); return; } JSONObject taskParam = JSONObject.parseObject(task.getTaskParam()); //4.查询指定日期内的用户访问数据 JavaRDD<Row> actionRDD = SparkUtils.getActionRDDByDateRange(sqlContext,taskParam); } }