JRQZ

  • en

自用笔记

2024-09-14

Hive上手

参考:《Hive编程指南》第一版,Hive官方wiki,https://bbs.huaweicloud.com/blogs/197920 《Hive编程指南》第一版出版于2013年,此时hive2尚未发布,如今hive3已经普及,很多知识已经过时,这里仅为学习 Hive是一个开源的数据仓库框架,基于Hadoop生态系统,用于处理和分析大量的结构化和半结构化数据。 Hive提供了一个类似于SQL的查询语言,称为HiveQL(Hive Query Language),允许用户编写查询来分析存储在Hadoop分布式文件系统(HDFS)或其他兼容的存储系统(如Amazon S3)中的数据。HiveQL查询会被转换成一系列的MapReduce作业,然后在Hadoop集群上执行。Hive还支持其他执行引擎,如Apache Tez和Apache Spark。 Hive发行版中附带的模块有CLI,一个成为Hive网页界面(HWI)的简单网页界面,以及可通过JDBC、ODBC和一个Thrift服务器(参考第16章)进行编程访问的几个模块 所有的命令和查询都会进入到Driver(驱动模块),通过该模块对输入进行解析编译,对需求的计算进行优化,然后按照指定的步骤执行。当需要生成MR任务(job)时,Hive通过一个表示”job执行计划“的XML文件驱动执行内置的、原生的Mapper和Reducer模块。 Hive通过和JobTracker通信来初始化MR任务,而不必部署在JobTracker所在节点 Metastore是一个独立的关系型数据库,Hive会在其中保存表模式和其它系统源数据 单节点安装和使用HIVE 准备 java 1.8 hadoop 3.4.0 hive安装包https://dlcdn.apache.org/hive/,版本3.1.3 wget https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz tar -xzvf apache-hive-3.1.3-bin.tar.gz MySQL安装与配置 hive的使用metastore保存数据元信息,这里使用mysql 卸载机器自带mysql: yum remove mariadb mariadb-libs 安装: yum install TXSQL-client.x86_64 启动mysql: # 启动mysql sudo service mysql start # 测试登录,mysql5.7默认root用户初始密码为空 mysql -u root 此时有权限问题无法登录,进行如下步骤: # 停止mysql服务 sudo service mysql stop # 以安全模式启动MySQL sudo mysqld_safe --skip-grant-tables & # 登录mysql mysql -u root 修改root用户密码 update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root'; flush privileges; 重启服务
继续阅读
2024-09-14

某业务数仓建模理论学习

数仓分层理论 ODS(Operational Data Store):操作数据存储是一个中间数据存储层,用于存储来自多个源系统的实时操作数据。ODS通常包含原始数据,用于支持实时查询和报告。它作为数据仓库的前身,提供了一个集中式的数据存储,以便将数据进一步转换、清洗和加载到数据仓库中。 DWD(Data Warehouse Detail):数据仓库详细层是数据仓库体系结构中的一个层次,用于存储经过清洗、转换和集成的详细数据。在这一层,数据通常以事实表和维度表的形式组织,以支持多维数据分析。DWD层的数据具有较高的数据质量和一致性,可以用于进一步的数据挖掘和报告。 DWM(Data Warehouse Mart):数据仓库集市层是数据仓库体系结构中的另一个层次,用于存储为特定业务领域或部门定制的数据子集。DWM层的数据通常是从DWD层中提取、汇总和转换而来的。数据仓库集市提供了更高层次的数据聚合,以支持特定业务需求的分析和报告。 DM(Data Mart):数据集市是针对特定业务领域或部门的小型数据仓库。数据集市通常包含有限的数据主题,以便更快速、更有效地支持特定业务需求的数据分析和报告。数据集市可以是独立的,也可以作为更大数据仓库体系结构的一部分。 某业务数仓分享 数仓建模:业务->领域->逻辑->物理 业务数仓实际设计过程分为七个步骤:梳理业务流程,划分主题,梳理指标,调研实体关系,梳理维度,数仓分层,构建数据仓库 梳理业务流程 找到谁,在什么环节,做什么关键动作,得到什么结果 在现有业务流程上找到数据节点 划分主题域 主题域是业务业务过程中一个个不可划分的行为事件 例如申购主题域中有预审购、申购、确认申购结果等业务流程 主题域划分要尽量涵盖所有业务需求 梳理指标体系 目标:统一语言,统一口径 分析实体关系 建模方法:从全业务的高度,用实体关系模型来描述业务 根据现有的实体关系图分析需要建设哪些dwd表 梳理维度 目标:构建一致性库表,避免维度概念散落在业务数仓各处 例如账户类型、入口类型、事件类型等维度 好处:有利于统一建设维表、方便后续维度建模 数仓分层 核心是逐层解耦 越到底层,越接近业务发生的记录 越到上层,越接近业务目标 ODS保存原始数据,生命周期默认永久 DWD基于之前的实体关系图建设,充分反映业务本身,而且是稳定的,这层是进入数仓的关键通道,需要对数据质量严格把关 DWM基于维度建模(如星型模式、雪花模式)的理论设计,能够有效提升数据的使用效率 DM层按照宽表模型进行设计,以空间换时间提升产品获取指标的效率 数仓物理建模 真正的代码开发阶段,有几个要点: 设计先行,现在腾讯文档上设计库表模型,优先评审,避免返工 根据评审的库表模型,在xdata平台上配置计算任务,配置任务依赖 任务名和表明最好一致 生命周期的管理,ODS尽可能保留所有历史数据,对于DWD/DWM/DM需要设置生命周期,存款侧实体类数据一般保存5年,用户行为类数据保存3年 如何提升数据质量: 关键:早发现,早恢复 添加校验任务&建立全链路数据视图 DWD表清洗 目的:高效、高质量的支撑业务的数据诉求,依赖方须向产品/业务团队提供dwd层以上的数据表,而非ods源数据 清洗要求: ods去重(重复数据造成上层数据处理复杂,数据倾斜),dwd配置数据唯一性质量告警 base64解码(Base64是一种用于将二进制数据编码为ASCII文本的方法,Base64编码使用64个字符(A-Z,a-z,0-9,+ 和 /)以及一个可选的填充字符(=)来表示二进制数据。它将二进制数据划分为每3个字节(24位)一组,然后将这24位数据分成4个6位的数据块。每个6位数据块对应一个Base64字符。如果二进制数据的长度不是3的倍数,那么在编码时会用填充字符(=)补齐) 加密敏感信息可在计算过程中解密,但不能解密落地 时间戳统一格式,如”yyyy-mm-dd hh:mm:ss“,默认值统一为”1970-01-01 08:00:00“ 属性/结构化字段必须对其模型展开,如果出现NULL值必须和产品沟通处理方式 总结:DWD表是屏蔽技术实现的用于业务分析的数仓表(如自增id、校验码、时间戳等纯技术语义字段不能进入dwd层) 要求: 配置告警(质量告警、失败/延迟告警) 完善数据字典(表描述、所属领域、责任人、设计文档、字段描述等元数据) 加入主干数仓
继续阅读
2024-09-14

Spark上手

安装Spark 官网下载,解压缩 配置环境变量JAVA_HOME,以及添加spark到系统路径 ~/.bashrc export SPARK_HOME=/data/download/spark-3.5.1-bin-hadoop3 export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin export JAVA_HOME=/usr/lib/jvm/TencentKona-8.0.17-402 export PATH=$PATH:$JAVA_HOME/bin spark-shell 启动sparkshell spark-shell 单词计数程序测试 var hFile = sc.textFile("hdfs://localhost:9000/user/wjrtest/input/capacity-scheduler.xml") val wc = hFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _) wc.take(5) pyspark pyspark shell 运行pyspark pyspark 启动失败,出现segmentation fault 增加core文件的大小限制 ulimit -c unlimited 再次运行pyspark,触发Segmentation fault错误 使用gdb调试 gdb -c core (gdb) bt 结果如下: (base) [root@xxx-tencentos /data/download/spark-3.5.1-bin-hadoop3]# gdb -c core.17222 GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.tl2 Copyright (C) 2013 Free Software Foundation, Inc.
继续阅读
2024-09-14

Doccano自动标注配置

开源自动标注工具Doccano,项目地址https://github.com/doccano/doccano 官方教程:https://doccano.github.io/doccano/ 支持jsonl格式文件导入导出,支持REST API自动标注 自动标注api参考: https://blog.csdn.net/weixin_44826203/article/details/125719480 遇到的问题: 无法正确设置自动标注api 原因是当前版本accano前端有bug,参考https://github.com/doccano/doccano/issues/2281 可通过访问http://x.x.x.x:8000/admin/进入Django管理界面手动配置 Model attrs:{"url": "http://x.x.x.x:5739", "body": {"text": "{{ text }}"}, "method": "POST", "params": {}, "headers": {}} Template:[ {% for entity in input %} { "start_offset": {{ entity.start_offset }}, "end_offset": {{ entity.end_offset}}, "label": "{{ entity.label }}" }{% if not loop.last %},{% endif %} {% endfor %} ] Label mapping:{"label1":"match label","label2":"match label2"} # lable1: you config labels_span name # match label: interface return entity class name 正确配置后,api后台可以收到数据并正常处理,但是accanno前台不能自动标注,原因不明,要么是相关参数没有正确配置(由于accano前端写得真不太行,难以在web界面上排查),要么是accano没有收到返回的数据
继续阅读
2024-09-14

Django_Nginx_uWSGI配置

Django是一个开源的Web应用框架,由Python写成 Nginx是一个开源的高性能HTTP服务器和反向代理服务器 uWSGI是一个Web服务器网关接口(Web Server Gateway Interface,简称WSGI)的实现,用于在Web服务器和Python web应用程序之间进行通信 参考: https://medium.com/bucketing/nginx-uwsgi-python-%E4%B9%8B%E9%97%9C%E8%81%AF-1-nginx%E7%AF%87-e0566f43c70b https://cloud.tencent.com/developer/article/1594840 niginx官方文档:https://nginx.org/en/docs/beginners_guide.html nginx和uWSGI区别: nginx和uWSGI都是web服务器,都可以用来部署django等服务 **nginx:**处理静态资源能力非常强,还可以提供 负载均衡、反向代理、攻击拦截等 **uWSGI:**单点部署,容易部署,性能差一些,可以支持的web协议多 uWSGI 和 uwsgi区别: **uWSGI:**是一个web服务器 **uwsgi:**是一种web协议 WSGI和uwsgi区别: uwsgi: 也是一种web协议,传输快(二进制存储,其他web协议都是字符串存储) WSGI: python专业的web协议 安装Django pip install Django ALLOWED_HOSTS = ['*'] 安装uwsgi 找不到libpython3.12.a文件 python版本问题 conda create -n django_env python=3.9 conda activate django_env conda install uwsgi 再次安装Django 安装Nginx yum install nginx 启动服务 systemctl start nginx systemctl restart nginx 此时访问服务器ip即可看到nginx页面 设置开机自启动 systemctl enable nginx 停止服务 systemctl stop nginx 配置Django django-admin startproject demosite cd demosite python manage.
继续阅读
2024-09-14

Linux服务器配置ES+Kibana

踩坑记录 依旧是参考官网教程:https://www.elastic.co/guide/en/elasticsearch/reference/current/run-elasticsearch-locally.html 准备 云服务器配置: 8核;16G;系统盘:100G;数据盘:500G TencentOS Server ES,Kibana分别部署在docker上 安装 安装docker,略 配置环境变量: export ELASTIC_PASSWORD="<ES_PASSWORD>" # password for "elastic" username export KIBANA_PASSWORD="<KIB_PASSWORD>" # Used _internally_ by Kibana, must be at least 6 characters long 安装es docker network create elastic-net docker run -p 0.0.0.0:9200:9200 -d --name elasticsearch --network elastic-net \ -e ELASTIC_PASSWORD=$ELASTIC_PASSWORD \ -e "discovery.type=single-node" \ -e "xpack.security.http.ssl.enabled=false" \ -e "xpack.license.self_generated.type=trial" \ docker.elastic.co/elasticsearch/elasticsearch:8.14.2 安装Kibana # configure the Kibana password in the ES container curl -u elastic:$ELASTIC_PASSWORD \ -X POST \ http://localhost:9200/_security/user/kibana_system/_password \ -d '{"password":"'"$KIBANA_PASSWORD"'"}' \ -H 'Content-Type: application/json' docker run -p 0.
继续阅读
2024-09-14

Linux服务器配置单节点Hadoop

云服务器搭建配置单节点Hadoop踩坑记录 Hadoop官方指南:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html 准备 根据团队情况申请云服务器,本文的配置为: 8核;16G;系统盘:100G;数据盘:500G TencentOS Server 方便起见,这里没有使用容器,直接将服务部署在机器上原生运行(后续实际生产应该会转移到docker上) Hadoop安装 安装Java,ssh 机器自带,略 官方推荐安装pdsh yum install pdsh 下载镜像 目前最新版:https://dlcdn.apache.org/hadoop/common/current/hadoop-3.4.0.tar.gz 在主机下载完毕,使用scp命令将镜像上传到服务器: scp -P 36000 hadoop-3.4.0.tar.gz <user>@xxx.xxx.xxx.xxx:/data/download 服务器上解压缩 tar -zxvf hadoop-3.4.0.tar.gz 进入hadoop目录,由于没有配置系统路径,后续操作默认在该目录下进行 配置Java 找到Java安装位置 java -XshowSettings:properties -version 2>&1 | grep 'java.home' 编辑etc/hadoop/hadoop-env.sh # set to the root of your Java installation export JAVA_HOME=/usr/java/latest 运行 bin/hadoop 此时会出现使用文档 HDFS测试 Hadoop集群可设置成如下模式: Local (Standalone) Mode (单节点单进程) Pseudo-Distributed Mode (伪分布式,单节点多进程) Fully-Distributed Mode (全分布式,多节点多进程) 由于只有一个机器,对前两种模式进行测试 Standalone Operation mkdir input cp etc/hadoop/*.
继续阅读
2024-04-24

经典并发编程问题之哲学家进餐

施工中… 原题:https://leetcode.cn/problems/the-dining-philosophers/description/ 题解参考:https://leetcode.cn/problems/the-dining-philosophers/solutions/2130703/li-shun-xian-cheng-zheng-qiang-xin-hao-l-gzb1/ 5 个沉默寡言的哲学家围坐在圆桌前,每人面前一盘意面。叉子放在哲学家之间的桌面上。(5 个哲学家,5 根叉子) 所有的哲学家都只会在思考和进餐两种行为间交替。哲学家只有同时拿到左边和右边的叉子才能吃到面,而同一根叉子在同一时间只能被一个哲学家使用。每个哲学家吃完面后都需要把叉子放回桌面以供其他哲学家吃面。只要条件允许,哲学家可以拿起左边或者右边的叉子,但在没有同时拿到左右叉子时不能进食。 假设面的数量没有限制,哲学家也能随便吃,不需要考虑吃不吃得下。 设计一个进餐规则(并行算法)使得每个哲学家都不会挨饿;也就是说,在没有人知道别人什么时候想吃东西或思考的情况下,每个哲学家都可以在吃饭和思考之间一直交替下去。 哲学家从 0 到 4 按 顺时针 编号。请实现函数 void wantsToEat(philosopher, pickLeftFork, pickRightFork, eat, putLeftFork, putRightFork): philosopher 哲学家的编号。 pickLeftFork 和 pickRightFork 表示拿起左边或右边的叉子。 eat 表示吃面。 putLeftFork 和 putRightFork 表示放下左边或右边的叉子。 由于哲学家不是在吃面就是在想着啥时候吃面,所以思考这个方法没有对应的回调。 给你 5 个线程,每个都代表一个哲学家,请你使用类的同一个对象来模拟这个过程。在最后一次调用结束之前,可能会为同一个哲学家多次调用该函数。 解法 前置知识 该问题本质上是线程同步中的死锁问题,常用线程同步方式有互斥锁、条件变量、信号量法;这里使用信号量的方法 P-V信号量 经典的死锁问题解决方案,对于信号量m,P(m)检查m是否为0,为0阻塞,否则将其减1,表示占用资源;V(m)将m加1,表示释放资源 C++方法 sem_init, sem_wait, sem_post 是与信号量(semaphore)相关的函数,常用于进程或线程间的同步。信号量是一种高级的同步机制,用于控制对共享资源的访问数量。 这些函数属于 POSIX 线程库(Pthreads),在多种编程环境中可用,尤其是在 UNIX、Linux 系统中。下面是这些函数的基本用途和如何使用它们的简要说明: sem_init 用途:初始化一个未命名的信号量。 原型 int sem_init(sem_t *sem, int pshared, unsigned int value); sem:指向信号量结构的指针。 pshared:如果这个值非零,信号量在进程间共享;如果为零,信号量只在创建它的进程的所有线程之间共享。 value:信号量的初始值。 sem_wait 用途:减少信号量的值(P 操作)。如果信号量的值为零,则调用线程将被阻塞,直到信号量值大于零。
继续阅读
2024-04-22

长度为n的字符串权重之和

4.21阿里笔试压轴题,状压dp->快速幂,可惜快速幂写错了,三分之一的测试用例因为超时没通过,复盘一下 题目:一个字符串由小写字母组成,其权重定义为不相邻的元音字母(即aeiou)对的个数,例如“aba”的权重为1,请设计程序,计算长度为n的所有字符串的权重之和,答案取模1000000009。 如n=3时,有权重为1的字符串“aaa”“abe”等,这些字符串的权重和为650。 很容易想到dp,而且想求某一特定字符串的权重并不难,但这并不是本题的重点。 经过比较长时间的思考+动笔计算,确定dp方法:dp[i]表示长为i的所有字符串的权重之和,dp[i]=dp[i-1]*26+(i-2)*25*26^(i-2);大概的含义为,i-1字符串的权重和,加上第i个字母结尾的元音对所加入的新权重 #include <bits/stdc++.h> #define MOD 1000000009 using namespace std; long solve(int n); int main() { int n; cin>>n; cout<<solve(n)<<endl; } long solve(int n) { vector<long> dp(n+1, 0); long pow=1; for(int i=3; i<=n; ++i) { pow = pow*26%MOD; dp[i] = (dp[i-1]*26%MOD + (i-2)*25*pow%MOD*26%MOD)%26; } return dp[n]; } 提交,通过66.7%的用例,提示内存过大,于是很容易想到状态压缩: #include <bits/stdc++.h> #define MOD 1000000009 using namespace std; long solve(int n); int main() { int n; cin>>n; cout<<solve(n)<<endl; } long solve(int n) { long pre=0, cur; long pow=1; for(int i=3; i<=n; ++i) { pow = pow*26%MOD; cur = (pre * 26 % MOD + ((i-2) * 25 % MOD) * pow % MOD) % MOD; pre = cur; } return cur;; } 提交,还是只通过66.
继续阅读
2024-04-17

Hive中SQL转化为MapReduce的原理

JOIN操作实现原理 在MapReduce中实现join主要有以下几种方式:Reduce-side join、Map-side join、和Repartition join。下面详细介绍这些方法及其原理。 Reduce-side Join Reduce-side join是MapReduce中最通用的join类型,适用于大规模数据集的连接,特别是当两个数据集都很大且没有任何特殊排序或分区时。 工作原理: Map阶段: Mapper读取两个数据集的所有输入数据(可能来自HDFS的不同文件或目录)。 对每个输入记录,Mapper输出key-value对,其中key是join操作的键,value是包含数据集标识(如标记来自哪个数据集)和数据记录的值。 Shuffle阶段: MapReduce框架将所有Mapper输出的key-value对根据key进行分组和排序,然后分发给Reducers。 Reduce阶段: 每个Reducer接收到特定key的所有记录,这些记录来源于所有的Mapper。Reducer通过检查每条记录的来源数据集标识,将来自不同数据集的记录进行组合。 对于每个key,Reducer执行实际的join逻辑(如inner join, left join等),输出最终的结果。 Map-side Join Map-side join通常在其中一个数据集很小(足够小到可以被加载到内存中)时使用,这种方法效率更高,因为它避免了在Reduce阶段进行大量的数据排序和分组。 工作原理: 预处理阶段: 小的数据集被分发到所有的Mapper节点上,通常通过将其存储在HDFS上并通过DistributedCache机制让每个Mapper节点访问。 Map阶段: 每个Mapper读取大的数据集,并同时加载小的数据集到内存。 Mapper对大数据集的每条记录进行处理,使用内存中的小数据集进行即时join操作。 输出join后的结果。 Repartition Join Repartition join是另一种Reduce-side join的形式,适用于需要特殊排序或分区的场景。 工作原理: 类似于普通的Reduce-side join,但在map阶段会对数据进行额外的分区和排序处理,以优化join的效率。 应用场景 当两个大数据集需要被连接时,使用Reduce-side join。 当一个小数据集可以全局广播到所有Mapper时,使用Map-side join。 当数据需要特殊处理或优化分区时,考虑使用Repartition join。 例如一个Reduce-side Join: select u.name, o.orderid from order o join user u on o.uid = u.uid; 在map的输出value中为不同表的数据打上tag标记,在reduce阶段根据tag判断数据来源。 Group By操作实现原理 Map阶段 任务:读取输入数据,处理记录,并输出键值对。 输出:键是GROUP BY字段,值是需要聚合的数据。 Shuffle阶段 处理:框架自动对Mapper的输出进行排序和分组,确保相同的键被送到同一个Reducer。 Reduce阶段 聚合:Reducer接收到键和对应的值集合,进行数据聚合(如计数、求和)。 结果:输出每个组基于GROUP BY字段的聚合结果。 将GroupBy的字段组合为map的输出key值,利用MapReduce的排序,在reduce阶段保存LastKey区分不同的key。MapReduce的过程如下
继续阅读
  • ««
  • «
  • 1
  • 2
  • 3
  • »
  • »»
© JRQZ 2026