尚硅谷大数据项目之实时项目2(日活需求)
第1章实时处理模块1.1 模块搭建添加scala框架1.2 代码思路1)消费kafka中的数据;2)利用redis过滤当日已经计入的日活设备;3)把每批次新增的当日日活信息保存到HBASE或ES中;4)从ES中查询出数据,发布成数据接口,通可视化化工程调用。
1.3 代码开发1 ---消费Kafka1.3.1 配置1)config.properties# Kafka配置kafka.broker.list=hadoop102:9092,hadoop103:9092,hadoop104:9092# Redis配置redis.host=hadoop102rdis.port=63792)pom.xml<dependencies><dependency><groupId>com.atguigu.gmall2019.dw</groupId><artifactId>dw-common</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.11</artifactId></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming_2.11</artifactId></dependency><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>0.11.0.2</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming-kafka-0-8_2.11</artifactId> </dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency><dependency><groupId>io.searchbox</groupId><version>5.3.3</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></dependencies><build><plugins><!-- 该插件用于将Scala代码编译成class文件 --><plugin><groupId>net.alchim31.maven</groupId><artifactId>scala-maven-plugin</artifactId><version>3.2.2</version><executions><execution><!-- 声明绑定到maven的compile阶段 --><goals><goal>compile</goal><goal>testCompile</goal></goals></execution></executions></plugin></plugins></build>1.3.2 工具类1)MykafkaUtilpackage com.atguigu.utilsimport java.util.Propertiesimport kafka.serializer.StringDecoderimport org.apache.spark.streaming.StreamingContextimport org.apache.spark.streaming.dstream.InputDStreamimport org.apache.spark.streaming.kafka.KafkaUtilsobject MyKafkaUtil {def getKafkaStream(ssc: StreamingContext, topics: Set[String]): InputDStream[(String, String)] = {PropertiesUtil.load("config.properties")val kafkaPara = Map("bootstrap.servers" -> properties.getProperty("kafka.broker.list"),"group.id" -> "bigdata0408")//基于Direct方式消费Kafka数据val kafkaDStream: InputDStream[(String, String)] = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaPara, topics)//返回kafkaDStream}}2)PropertiesUtilimport java.io.InputStreamReaderimport java.util.Propertiesobject PropertiesUtil {def load(propertieName:String): Properties ={val prop=new Properties();prop.load(newInputStreamReader(Thread.currentThread().getContextClassLoader.ge tResourceAsStream(propertieName) , "UTF-8"))prop}}3)RedisUtilobject RedisUtil {var jedisPool:JedisPool=nulldef getJedisClient: Jedis = {if(jedisPool==null){println("开辟一个连接池")val config = PropertiesUtil.load("config.properties")val host = config.getProperty("redis.host")val port = config.getProperty("redis.port")val jedisPoolConfig = new JedisPoolConfig()jedisPoolConfig.setMaxTotal(100) //最大连接数jedisPoolConfig.setMaxIdle(20) //最大空闲jedisPoolConfig.setMinIdle(20) //最小空闲jedisPoolConfig.setBlockWhenExhausted(true) //忙碌时是否等待jedisPoolConfig.setMaxWaitMillis(500) //忙碌时等待时长毫秒jedisPoolConfig.setTestOnBorrow(true) //每次获得连接的进行测试jedisPool=new JedisPool(jedisPoolConfig,host,port.toInt)}// println(s"jedisPool.getNumActive = ${jedisPool.getNumActive}") // println("获得一个连接")jedisPool.getResource}}1.3.3 样例类Startuplogcase class StartUpLog(mid:String,uid:String,appid:String,area:String,os:String,ch:String,logType:String,vs:String,var logDate:String,var logHour:String,var ts:Long)1.3.4 业务类消费kafkaimport org.apache.phoenix.spark._object RealtimeStartupApp {def main(args: Array[String]): Unit = {val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("gmall2019")val sc = new SparkContext(sparkConf)val ssc = new StreamingContext(sc,Seconds(10))val startupStream: InputDStream[ConsumerRecord[String, String]] = MyKafkaUtil.getKafkaStream(ssc ,Set(GmallConstants.KAFKA_TOPIC_ST ARTUP))// startupStream.map(_.value()).foreachRDD{ rdd=>// println(rdd.collect().mkString("\n"))// }val startupLogDstream: DStream[StartUpLog] = startupStream.map(_.value()).map { log =>// println(s"log = ${log}")val startUpLog: StartUpLog = JSON.parseObject(log,startUpLog}}1.4 代码开发2 ---去重1.4.1 流程图1.4.2 设计Redis的KV1.4.3 业务代码import java.utilimport java.text.SimpleDateFormatimport java.util.Dateimport com.alibaba.fastjson.JSONimport com.atguigu.gmall.constant.GmallConstantsimport com.atguigu.gmall2019.realtime.bean.StartupLogimport com.atguigu.gmall2019.realtime.util.{MyKafkaUtil, RedisUtil} import org.apache.hadoop.conf.Configurationimport org.apache.kafka.clients.consumer.ConsumerRecordimport org.apache.spark.SparkConfimport org.apache.spark.broadcast.Broadcastimport org.apache.spark.rdd.RDDimport org.apache.spark.streaming.dstream.{DStream, InputDStream} import org.apache.spark.streaming.{Seconds, StreamingContext}import redis.clients.jedis.Jedisimport org.apache.phoenix.spark._object DauApp {def main(args: Array[String]): Unit = {val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("dau_app")val ssc = new StreamingContext(sparkConf,Seconds(5))// 1 消费kafkaval inputDstream: InputDStream[ConsumerRecord[String, String]] =MyKafkaUtil.getKafkaStream(ssc,Set(GmallConstants.KAFKA_TOPIC_STA RTUP))//2 数据流转换结构变成case class 补充两个时间字段val startuplogDstream: DStream[StartupLog] = inputDstream.map { record =>val jsonStr: String = record.value()val startupLog: StartupLog = JSON.parseObject(jsonStr, classOf[StartupLog])val dateTimeStr: String = new SimpleDateFormat("yyyy-MM-dd HH").format(new Date(startupLog.ts))val dateArr: Array[String] = dateTimeStr.split(" ")startupLog.logDate = dateArr(0)startupLog.logHour = dateArr(1)startupLog}startuplogDstream.cache()//3 利用用户清单进行过滤去重只保留清单中不存在的用户访问记录val filteredDstream: DStream[StartupLog] = startuplogDstream.transform { rdd =>val jedis: Jedis = RedisUtil.getJedisClient //driver //按周期执行val dateStr: String = new SimpleDateFormat("yyyy-MM-dd").format(new Date())val key = "dau:" + dateStrval dauMidSet: util.Set[String] = jedis.smembers(key)jedis.close()val dauMidBC: Broadcast[util.Set[String]] = ssc.sparkContext.broadcast(dauMidSet)println("过滤前:" + rdd.count())val filteredRDD: RDD[StartupLog] = rdd.filter { startuplog => //executorval dauMidSet: util.Set[String] = dauMidBC.value!dauMidSet.contains(startuplog.mid)}println("过滤后:" + filteredRDD.count())filteredRDD}//4 批次内进行去重::按照mid 进行分组,每组取第一个值val groupbyMidDstream: DStream[(String, Iterable[StartupLog])] =filteredDstream.map(startuplog=>(startuplog.mid,startuplog)).grou pByKey()val distictDstream: DStream[StartupLog] = groupbyMidDstream.flatMap { case (mid, startupLogItr) =>startupLogItr.toList.take(1)}// 5 保存今日访问过的用户(mid)清单 -->Redis 1 key类型: set 2 key : dau:2019-xx-xx 3 value : middistictDstream.foreachRDD{rdd=>//driverrdd.foreachPartition{ startuplogItr=>val jedis:Jedis=RedisUtil.getJedisClient //executorfor (startuplog <- startuplogItr ) {val key= "dau:"+startuplog.logDatejedis.sadd(key,startuplog.mid)println(startuplog)}jedis.close()}}ssc.start()ssc.awaitTermination()}}1.5 代码实现3 ---保存到HBase中1.5.1 Phoenix ---HBase的SQL化插件技术详情参见《尚硅谷大数据技术之phoenix》1.5.2 利用Phoenix建立数据表create table gmall190408_dau(mid varchar,uid varchar,appid varchar,area varchar,os varchar,ch varchar,type varchar,vs varchar,logDate varchar,logHour varchar,ts bigintCONSTRAINT dau_pk PRIMARY KEY (mid, logDate));1.5.3 pom.xml 中增加依赖<dependency><groupId>org.apache.phoenix</groupId><artifactId>phoenix-spark</artifactId><version>4.14.2-HBase-1.3</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.11</artifactId></dependency>1.5.4 业务保存代码//把数据写入hbase+phoenixdistictDstream.foreachRDD{rdd=>rdd.saveToPhoenix("GMALL2019_DAU",Seq("MID", "UID", "APPID", "AREA", "OS", "CH", "TYPE", "VS", "LOGDATE", "LOGHOUR", "TS") ,new Configuration,Some("hadoop102,hadoop103,hadoop104:2181"))}第2章日活数据查询接口2.1 访问路径2.2 要求数据格式2.3 搭建发布工程2.4 配置文件2.4.1 pom.xml<properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- https:///artifact/io.searchbox/jest --> <dependency><groupId>com.atguigu.gmall2019.dw</groupId><artifactId>dw-common</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>————————————————————————————— <scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.4</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency><dependency><groupId>org.apache.phoenix</groupId><artifactId>phoenix-core</artifactId><version>4.14.2-HBase-1.3</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>20.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>2.4.2 application.propertiesserver.port=8070logging.level.root=errorspring.datasource.driver-class-name=org.apache.phoenix.jdbc.PhoenixDriverspring.datasource.url=jdbc:phoenix:hadoop102,hadoop103,hadoop104: 2181spring.datasource.data-username=spring.datasource.data-password=#mybatis#mybatis.typeAliasesPackage=com.example.phoenix.entitymybatis.mapperLocations=classpath:mapper/*.xmlmybatis.configuration.map-underscore-to-camel-case=true—————————————————————————————2.5 代码实现2.5.1 GmallPublisherApplication增加扫描包@SpringBootApplication@MapperScan(basePackages = "com.atguigu.gmallXXXXXXX.publisher.mapper")public class Gmall2019PublisherApplication{public static void main(String[] args) {SpringApplication.run(Gmall2019PublisherApplication.class, args);}}2.5.2 controller层import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.atguigu.gmall2019.dw.publisher.service.PublisherService; import ng.time.DateUtils;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController; import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.*;@RestControllerpublic class PublisherController {@AutowiredPublisherService publisherService;@GetMapping("realtime-total")public String realtimeHourDate(@RequestParam("date") String date) {List<Map> list = new ArrayList<Map>();// 日活总数int dauTotal = publisherService.getDauTotal(date);Map dauMap=new HashMap<String,Object>();dauMap.put("id","dau");dauMap.put("name","新增日活");dauMap.put("value",dauTotal);list.add(dauMap);// 新增用户int newMidTotal = publisherService.getNewMidTotal(date);Map newMidMap=new HashMap<String,Object>();newMidMap.put("id","new_mid");newMidMap.put("name","新增用户");newMidMap.put("value",newMidTotal);list.add(newMidMap);return JSON.toJSONString(list);}@GetMapping("realtime-hours")public String realtimeHourDate(@RequestParam("id") String id,@RequestParam("date") String date){if("dau".equals(id)){Map dauHoursToday = publisherService.getDauHours(date);JSONObject jsonObject = new JSONObject();jsonObject.put("today",dauHoursToday);String yesterdayDateString="";try {Date dateToday = new SimpleDateFormat("yyyy-MM-dd").parse(date);Date dateYesterday = DateUtils.addDays(dateToday, -1); yesterdayDateString=new SimpleDateFormat("yyyy-MM-dd").format(dateYesterday);} catch (ParseException e) {e.printStackTrace();}Map dauHoursYesterday = publisherService.getDauHours(yesterdayDateString);jsonObject.put("yesterday",dauHoursYesterday);return jsonObject.toJSONString();}if( "new_order_totalamount".equals(id)){String newOrderTotalamountJson = publisherService.getNewOrderTotalAmountHours(date);return newOrderTotalamountJson;}return null;}2.5.3 service层接口类public interface PublisherService {public int getDauTotal(String date);public Map getDauHours(String date);}2.5.4 service层实现类@Servicepublic class PublisherServiceImpl implements PublisherService{@AutowiredDauMapper dauMapper;@Overridepublic Integer getDauTotal(String date) {return dauMapper.selectDauTotal(date);}@Overridepublic Map getDauHour(String date) {HashMap dauHourMap=new HashMap();List<Map> dauHourList = dauMapper.selectDauTotalHourMap(date); for (Map map : dauHourList) {dauHourMap.put(map.get("LH"),map.get("CT"));}return dauHourMap;}}2.5.5 数据层mapperimport java.util.List;import java.util.Map;public interface DauMapper {public Integer selectDauTotal(String date);public List<Map> selectDauTotalHourMap(String date);}—————————————————————————————2.5.6 数据层实现配置DauMapper.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper SYSTEM "/dtd/mybatis-3-mapper.dtd" ><mappernamespace="com.atguigu.gmall2019.publisher.mapper.DauMapper"><select id="selectDauTotal" resultType="Integer">select count(*) from gmall2019_dau where logdate=#{date}</select><select id="selectDauTotalHourMap" resultMap="dauTotalHour">select LOGHOUR lh, count(*) ct from gmall2019_dau where LOGDATE=#{date}group by LOGHOUR</select><resultMap id="dauTotalHour" type="java.util.Map" autoMapping="true"></resultMap></mapper>2.6 根据查询条件增加索引create local index idx_logdate_loghour on gmall2019_dau(logdate,loghour)2.7 搭建可视化工程进行对接。
14_尚硅谷大数据之HDFS HA高可用
八HDFS HA高可用8.1 HA概述1)所谓HA(high available),即高可用(7*24小时不中断服务)。
2)实现高可用最关键的策略是消除单点故障。
HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。
3)Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。
4)NameNode主要在以下两个方面影响HDFS集群NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用HDFS HA功能通过配置Active/Standby两个nameNodes实现在集群中对NameNode的热备来解决上述问题。
如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。
8.2 HDFS-HA工作机制1)通过双namenode消除单点故障8.2.1 HDFS-HA工作要点1)元数据管理方式需要改变:内存中各自保存一份元数据;Edits日志只有Active状态的namenode节点可以做写操作;两个namenode都可以读取edits;共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现);2)需要一个状态管理功能模块实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在namenode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover 来负责切换,切换时需要防止brain split现象的发生。
3)必须保证两个NameNode之间能够ssh无密码登录。
4)隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务8.2.2 HDFS-HA自动故障转移工作机制前面学习了使用命令hdfs haadmin -failover手动进行故障转移,在该模式下,即使现役NameNode已经失效,系统也不会自动从现役NameNode转移到待机NameNode,下面学习如何配置部署HA自动进行故障转移。
尚硅谷大数据之hive
尚硅谷大数据之hive尚硅谷大数据之hive》是一本关于Hive技术的书籍。
它旨在全面介绍Hive的主要内容和应用,并针对不同的读者群体提供有用的信息和指导。
Hive是一个开源的数据仓库基础设施工具,它构建在Hadoop 之上,用于处理大规模数据集。
通过使用Hive,用户可以使用类似于SQL的查询语言来访问和分析存储在Hadoop分布式文件系统中的数据。
这使得非技术背景的用户也能够利用Hive进行数据分析和查询。
本书主要包括以下内容:Hive基础知识:介绍Hive的基本概念、架构和组件。
读者将了解Hive如何与Hadoop生态系统中的其他工具集成,并研究如何安装和配置Hive。
Hive数据模型:详细解释Hive的数据模型,包括数据表、分区和桶等概念。
读者将研究如何创建、修改和管理Hive数据表,并了解如何利用分区和桶来提高查询性能。
Hive查询语言:深入介绍HiveQL,这是Hive的查询语言。
读者将研究如何编写各种类型的查询,包括基本的选择、过滤和聚合查询,以及复杂的连接和子查询。
Hive优化和性能调优:提供有关如何优化Hive查询性能的实用技巧和建议。
读者将研究如何使用索引、分区和桶来改善查询速度,以及如何使用适当的配置参数来优化Hive性能。
Hive高级特性:介绍Hive的一些高级特性和扩展,例如动态分区、外部表、UDF和UDAF等。
读者将了解如何利用这些功能来处理具有更复杂需求的数据分析场景。
本书适合各种读者群体,包括数据分析师、数据工程师、数据库管理员和对Hive技术感兴趣的研究者。
无论您是初学者还是有一定经验的专业人士,本书都将为您提供全面且易于理解的Hive研究资源。
2.简要介绍HiveHive是一个基于Hadoop的数据仓库基础架构,用于处理和分析大数据。
它提供了一个类似于SQL的查询语言,称为HiveQL,使用户能够对存储在Hadoop集群中的大规模数据进行查询和分析。
Hive的重要性在于它简化了大数据处理和分析的过程。
尚硅谷大数据技术之 Hadoop(生产调优手册)说明书
尚硅谷大数据技术之Hadoop(生产调优手册)(作者:尚硅谷大数据研发部)版本:V3.3第1章HDFS—核心参数1.1 NameNode内存生产配置1)NameNode内存计算每个文件块大概占用150byte,一台服务器128G内存为例,能存储多少文件块呢?128 * 1024 * 1024 * 1024 / 150Byte ≈9.1亿G MB KB Byte2)Hadoop2.x系列,配置NameNode内存NameNode内存默认2000m,如果服务器内存4G,NameNode内存可以配置3g。
在hadoop-env.sh文件中配置如下。
HADOOP_NAMENODE_OPTS=-Xmx3072m3)Hadoop3.x系列,配置NameNode内存(1)hadoop-env.sh中描述Hadoop的内存是动态分配的# The maximum amount of heap to use (Java -Xmx). If no unit # is provided, it will be converted to MB. Daemons will# prefer any Xmx setting in their respective _OPT variable.# There is no default; the JVM will autoscale based upon machine # memory size.# export HADOOP_HEAPSIZE_MAX=# The minimum amount of heap to use (Java -Xms). If no unit # is provided, it will be converted to MB. Daemons will# prefer any Xms setting in their respective _OPT variable.# There is no default; the JVM will autoscale based upon machine # memory size.# export HADOOP_HEAPSIZE_MIN=HADOOP_NAMENODE_OPTS=-Xmx102400m(2)查看NameNode占用内存[atguigu@hadoop102 ~]$ jps3088 NodeManager2611 NameNode3271 JobHistoryServer2744 DataNode3579 Jps[atguigu@hadoop102 ~]$ jmap -heap 2611Heap Configuration:MaxHeapSize = 1031798784 (984.0MB)(3)查看DataNode占用内存[atguigu@hadoop102 ~]$ jmap -heap 2744Heap Configuration:MaxHeapSize = 1031798784 (984.0MB)查看发现hadoop102上的NameNode和DataNode占用内存都是自动分配的,且相等。
尚硅谷大数据技术之Zookeeper
尚硅谷大数据技术之Zookeeper(作者:尚硅谷大数据研发部)版本:V2.0第1章 Zookeeper 入门1.1 概述Zookeeper 是一个开源的分布式的,为分布式应用提供协调服务的Apache 项目。
Zookeeper 工作机制业务功能服务器1Zookeeper 从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在Zookeeper 上注册的那些观察者做出相应的反应。
业务功能服务器2业务功能服务器3客户端2客户端3Zookeeper 集群1服务端启动时去注册信息(创建都是临时节点)/servers/server1hadoop10180nodes/server2hadoop10290nodes /server3hadoop10395nodes2获取到当前在线服务器列表,并且注册监听3服务器节点下线4服务器节点上下线事件通知5process(){重新再去获取服务器列表,并注册监听}客户端1Zookeeper=文件系统+通知机制1.2 特点1)Zookeeper :一个领导者(Leader ),多个跟随者(Follower )组成的集群。
2)集群中只要有半数以上节点存活,Zookeeper 集群就能正常服务。
3)全局数据一致:每个Server 保存一份相同的数据副本,Client 无论连接到哪个Server ,数据都是一致的。
4)更新请求顺序进行,来自同一个Client 的更新请求按其发送顺序依次执行。
5)数据更新原子性,一次数据更新要么成功,要么失败。
6)实时性,在一定时间范围内,Client 能读到最新数据。
Zookeeper 特点1.3 数据结构数据结构ZooKeeper 数据模型的结构与Unix 文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode 。
尚硅谷数据仓库实战之3数仓搭建
尚硅谷数据仓库实战之3数仓搭建数仓笔记数据仓库和数据集市详解:ODS、DW、DWD、DWM、DWS、ADS:尚硅谷数仓实战之1项目需求及架构设计:尚硅谷数仓实战之2数仓分层+维度建模:尚硅谷数仓实战之3数仓搭建:B站直达:百度网盘:,提取码:yyds 阿里云盘:,提取码:335o第4章数仓搭建-ODS层1)保持数据原貌不做任何修改,起到备份数据的作用。
2)数据采用LZO压缩,减少磁盘存储空间。
100G数据可以压缩到10G以内。
3)创建分区表,防止后续的全表扫描,在企业开发中大量使用分区表。
4)创建外部表。
在企业开发中,除了自己用的临时表,创建内部表外,绝大多数场景都是创建外部表。
4.2 ODS层(业务数据)ODS层业务表分区规划如下在这里插入图片描述ODS层业务表数据装载思路如下在这里插入图片描述4.2.1 活动信息表第5章数仓搭建-DIM层5.1 商品维度表(全量)1.建表语句2.分区规划在这里插入图片描述3.数据装载在这里插入图片描述5.6 用户维度表(拉链表)5.6.1 拉链表概述1)什么是拉链表在这里插入图片描述2)为什么要做拉链表在这里插入图片描述3)如何使用拉链表在这里插入图片描述4)拉链表形成过程在这里插入图片描述5.6.2 制作拉链表1.建表语句2.分区规划在这里插入图片描述3.数据装载在这里插入图片描述1)首日装载拉链表首日装载,需要进行初始化操作,具体工作为将截止到初始化当日的全部历史用户导入一次性导入到拉链表中。
目前的ods_user_info表的第一个分区,即2023-06-14分区中就是全部的历史用户,故将该分区数据进行一定处理后导入拉链表的9999-99-99分区即可。
2)每日装载(1)实现思路在这里插入图片描述第6章数仓搭建-DWD层1)对用户行为数据解析。
2)对业务数据采用维度模型重新建模。
6.1 DWD层(用户行为日志)6.1.1 日志解析思路1)日志结构回顾(1)页面埋点日志在这里插入图片描述(2)启动日志在这里插入图片描述2)日志解析思路在这里插入图片描述6.1.2 json_object函数使用Mysql中也有响应的JSON处理函数,不过性能没有hive高。
尚硅谷新学生培训计划
尚硅谷新学生培训计划一、培训目的尚硅谷作为一家技术培训机构,一直以来致力于为学生提供优质的技术培训服务,帮助学生快速提升自己的技术水平,顺利就业。
针对即将到来的新学期,为了增强新学生的学习能力和就业竞争力,我们制定了以下新学生培训计划。
二、培训内容1. 入学培训在新学生入学之前,将安排一次入学培训,内容包括尚硅谷的学习体系介绍、学习方法指导,帮助学生明确学习目标,并做好心理准备。
2. 专业课程培训根据学生报名的专业方向,为学生安排相应课程培训,包括但不限于Java开发、前端开发、大数据、人工智能等方向的课程。
课程内容包括理论知识讲解、实际案例分析、项目实战等,以提升学生的专业知识和实际操作能力。
3. 项目实训在专业课程培训结束后,将为学生安排项目实训,让学生在实际项目中应用所学知识,提升实际操作能力和团队协作能力。
4. 就业培训在项目实训结束后,将为学生安排就业指导课程,包括简历制作、面试技巧、职业规划等内容,帮助学生提升就业竞争力,并顺利就业。
5. 毕业证书颁发在学生顺利完成培训并通过考核后,将颁发尚硅谷的毕业证书,为学生提供一份权威的学习证明。
三、培训方式1. 实体课程尚硅谷提供优质的线下课程教学环境,为学生提供舒适的学习场所和专业的师资力量,让学生能够更好地融入学习氛围,深度学习课程内容。
2. 在线课程尚硅谷也提供优质的在线课程教学服务,学生可以通过网络平台进行学习,灵活安排学习时间,更好地掌握课程知识。
3. 项目实训项目实训将以团队合作的方式进行,学生将分组完成实际项目,培养学生的团队协作能力和项目管理能力。
四、培训要求1. 学习积极性学生应保持良好的学习积极性,勤奋学习,认真完成每一堂课程和作业。
2. 团队协作在项目实训环节,学生应积极参与团队合作,配合团队完成项目任务,培养团队合作精神。
3. 过程管理学生应合理规划学习时间,对学习进度进行有效管理,确保按时完成培训计划。
五、培训评估在培训过程中,将对学生的学习情况进行定期评估,包括课堂表现、作业情况、项目实训成果等,对合格的学生进行肯定与奖励,对不合格的学生进行及时的辅导和调整。
尚硅谷大数据技术之ELK
尚硅谷大数据技术之ELK(作者:尚硅谷大数据研发部)版本:V1.5第1章Elasticsearch概述1.1 什么是搜索?百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜欢的电影,或者说找一本喜欢的书,或者找一条感兴趣的新闻(提到搜索的第一印象)。
百度!= 搜索1)互联网的搜索:电商网站,招聘网站,新闻网站,各种app2)IT系统的搜索:OA软件,办公自动化软件,会议管理,日程管理,项目管理。
搜索,就是在任何场景下,找寻你想要的信息,这个时候,会输入一段你要搜索的关键字,然后就期望找到这个关键字相关的有些信息1.2 如果用数据库做搜索会怎么样?用数据库来实现搜索,是不太靠谱的。
通常来说,性能会很差的。
1.3 什么是全文检索和Lucene?1)全文检索,倒排索引全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
这个过程类似于通过字典中的检索字表查字的过程。
全文搜索搜索引擎数据库中的数据。
2)lucene,就是一个jar包,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法。
我们就用java开发的时候,引入lucene jar,然后基于lucene的api 进行去进行开发就可以了。
1.4 什么是Elasticsearch?Elasticsearch,基于Lucene,隐藏复杂性,提供简单易用的RestfulAPI接口、JavaAPI 接口(还有其他语言的API接口)。
关于Elasticsearch的一个传说,有一个程序员失业了,陪着自己老婆去英国伦敦学习厨师课程。
程序员在失业期间想给老婆写一个菜谱搜索引擎,觉得Lucene实在太复杂了,就开发了一个封装了Lucene的开源项目:Compass。
后来程序员找到了工作,是做分布式的高性能项目的,觉得Compass不够,就写了Elasticsearch,让Lucene变成分布式的系统。
02_尚硅谷大数据技术之Hadoop(入门)
02_尚硅⾕⼤数据技术之Hadoop(⼊门)尚硅⾕⼤数据技术之 Hadoop(⼊门)(作者:尚硅⾕⼤数据研发部)版本:V3.3第 1 章 Hadoop 概述1.1 Hadoop 是什么1) Hadoop是⼀个由Apache基⾦会所开发的分布式系统基础架构。
2)主要解决,海量数据的存储和海量数据的分析计算问题。
3)⼴义上来说,Hadoop通常是指⼀个更⼴泛的概念——Hadoop⽣态圈。
1.2 Hadoop 发展历史(了解)1)Hadoop创始⼈Doug Cutting,为了实现与Google类似的全⽂搜索功能,他在Lucene框架基础上进⾏优化升级,查询引擎和索引引擎。
2)2001年年底Lucene成为Apache基⾦会的⼀个⼦项⽬。
3)对于海量数据的场景,Lucene框架⾯对与Google同样的困难,存储海量数据困难,检索海量速度慢。
4)学习和模仿Google解决这些问题的办法:微型版Nutch。
5)可以说Google是Hadoop的思想之源(Google在⼤数据⽅⾯的三篇论⽂)GFS --->HDFSMap-Reduce --->MRBigTable --->HBase6)2003-2004年,Google公开了部分GFS和MapReduce思想的细节,以此为基础Doug Cutting等⼈⽤了2年业余时间实现了DFS和MapReduce机制,使Nutch性能飙升。
7)2005 年Hadoop 作为 Lucene的⼦项⽬ Nutch的⼀部分正式引⼊Apache基⾦会。
8)2006 年 3 ⽉份,Map-Reduce和Nutch Distributed File System (NDFS)分别被纳⼊到 Hadoop 项⽬中,Hadoop就此正式诞⽣,标志着⼤数据时代来临。
9)名字来源于Doug Cutting⼉⼦的玩具⼤象1.3 Hadoop 三⼤发⾏版本(了解)Hadoop 三⼤发⾏版本:Apache、Cloudera、Hortonworks。
尚硅谷大数据项目之实时项目4(预警需求)
第1章需求分析1.1 简介实时预警,是一种经常出现在实时计算中的业务类型。
根据日志数据中系统报错异常,或者用户行为异常的检测,产生对应预警日志。
预警日志通过图形化界面的展示,可以提醒监控方,需要及时核查问题,并采取应对措施。
1.2 需求说明需求:同一设备,5分钟内三次及以上用不同账号登录并领取优惠劵,并且在登录到领劵过程中没有浏览商品。
达到以上要求则产生一条预警日志。
同一设备,每分钟只记录一次预警。
1.3 预警日志格式第2章整体流程设计2.1 框架流程2.2 开发思路1)从kafka中消费数据,根据条件进行过滤筛选,生成预警日志;2)预警日志保存到ElasticSearch中;3)利用Kibana快速搭建可视化图形界面。
第3章实时计算模块3.1 筛选条件分析同一设备(分组)5分钟内(窗口)三次不同账号登录(用户)领取优惠券(行为)没有浏览商品(行为)同一设备每分钟只记录一次预警(去重)3.2 数据处理流程图3.3 代码开发3.3.1 事件日志样例类– EventInfo case class EventInfo(mid:String,uid:String,appid:String,area:String,os:String,ch:String,`type`:String,evid:String,pgid:String,npgid:String,itemid:String,var logDate:String, var logHour:String,var ts:Long)3.3.2 预警日志样例类–CouponAlertInfocase class CouponAlertInfo(mid:String,uids:java.util.HashSet[String],itemIds:java.util.HashSet[String],events:java.util.List[String],ts:Long)3.3.3 预警业务类– AlertAppimport com.alibaba.fastjson.JSONimport com.atguigu.gmall.constant.GmallConstantsimport com.atguigu.gmall2019.realtime.bean.{CouponAlertInfo, EventInfo}import com.atguigu.gmall2019.realtime.util.{MyEsUtil, MyKafkaUtil} import org.apache.kafka.clients.consumer.ConsumerRecordimport org.apache.spark.SparkConfimport org.apache.spark.streaming.dstream.{DStream, InputDStream} import org.apache.spark.streaming.{Seconds, StreamingContext}import scala.util.control.Breaks._object AlertApp {def main(args: Array[String]): Unit = {val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("event_app")val ssc = new StreamingContext(sparkConf,Seconds(5))val inputDstream: InputDStream[ConsumerRecord[String, String]] = MyKafkaUtil.getKafkaStream(GmallConstants.KAFKA_TOPIC_EVENT,ssc) //1 格式转换成样例类val eventInfoDstream: DStream[EventInfo] = inputDstream.map { record =>val jsonstr: String = record.value()val eventInfo: EventInfo = JSON.parseObject(jsonstr, classOf[EventInfo])eventInfo}//2 开窗口val eventInfoWindowDstream: DStream[EventInfo] = eventInfoDstream.window(Seconds(30),Seconds(5))//3同一设备分组val groupbyMidDstream: DStream[(String, Iterable[EventInfo])] = eventInfoWindowDstream.map(eventInfo=>(eventInfo.mid,eventInfo)). groupByKey()//4 判断预警// 在一个设备之内// 1 三次及以上的领取优惠券 (evid coupon) 且 uid都不相同// 2 没有浏览商品(evid clickItem)val checkCouponAlertDStream: DStream[(Boolean, CouponAlertInfo)] = groupbyMidDstream.map { case (mid, eventInfoItr) =>————————————————————————————— val couponUidsSet = new util.HashSet[String]()val itemIdsSet = new util.HashSet[String]()val eventIds = new util.ArrayList[String]()var notClickItem: Boolean = truebreakable(for (eventInfo: EventInfo <- eventInfoItr) {eventIds.add(eventInfo.evid) //用户行为if (eventInfo.evid == "coupon") {couponUidsSet.add(eventInfo.uid) //用户领券的uiditemIdsSet.add(eventInfo.itemid) //用户领券的商品id} else if (eventInfo.evid == "clickItem") {notClickItem = falsebreak()}})//组合成元组(标识是否达到预警要求,预警信息对象)(couponUidsSet.size() >= 3 && notClickItem, CouponAlertInfo(mid, couponUidsSet, itemIdsSet, eventIds, System.currentTimeMillis()))}//过滤val filteredDstream: DStream[(Boolean, CouponAlertInfo)] = checkCouponAlertDStream.filter{_._1}//增加一个id用于保存到es的时候进行去重操作val alertInfoWithIdDstream: DStream[(String, CouponAlertInfo)] = filteredDstream.map { case (flag, alertInfo) =>val period: Long = alertInfo.ts / 1000L / 60Lval id: String = alertInfo.mid + "_" + period.toString(id, alertInfo)}alertInfoWithIdDstream.foreachRDD{rdd=>rdd.foreachPartition{alertInfoWithIdIter=>MyEsUtil.insertBulk(GmallConstants.ES_INDEX_COUPON_ALERT ,alertIn foWithIdIter.toList)}}ssc.start()ssc.awaitTermination()}}第4章ElasticSearch 的保存4.1 ES集群搭建参考《ElasticSearch集群安装》手册—————————————————————————————4.2 ES上建好索引其实即使不提前建立索引,ES也是可以将数据保存进去的。
尚硅谷大数据课程大纲
尚硅谷大数据课程大纲
尚硅谷的大数据课程大纲主要包括以下几个部分:
1. Java SE:学习Java的基础语法和面向对象编程思想,以及常用的Java
开发工具。
2. MySQL:学习关系型数据库管理系统MySQL,包括数据库设计、SQL
语言、存储过程、触发器等。
3. Linux:学习Linux操作系统的基本命令和常用工具,以及在Linux环境
下部署和配置应用程序。
4. Maven:学习使用Maven进行项目管理和构建,了解Maven的依赖管理、项目构建、项目报告等功能。
5. Shell:学习Shell脚本编程,以及在Linux环境下使用Shell脚本来自动化管理任务。
6. Hadoop:学习使用Hadoop进行大数据处理和分析,了解Hadoop的分布式文件系统、MapReduce编程模型、Hive、HBase等组件。
7. Zookeeper:学习使用Zookeeper进行分布式系统的一致性协调和管理。
8. Hive:学习使用Hive进行数据仓库建设和管理,以及Hive的数据建模
和SQL查询。
9. Flume:学习使用Flume进行大数据采集和传输,了解Flume的数据采集、数据清洗、数据传输等功能。
10. 大数据实践项目:通过实际的大数据项目,综合运用所学知识解决实际问题,提升大数据处理和分析能力。
以上是尚硅谷大数据课程大纲的简要介绍,具体内容可能会根据不同的版本和讲师有所差异。
