02 电商数仓(数据采集模块)
电商数仓(数据采集模块)
写在前面:本文是我在学习电商数仓项目的过程中,对相关知识点的记录与总结。
文章目录
- 电商数仓(数据采集模块)
- 1. Hadoop 安装
- 1.1 安装 Hadoop
- 1.2 Hadoop 集群启动停止脚本
- 2. Zookeeper 安装
- 2.1 安装 ZK
- 2.2 ZK 集群启动停止脚本
- 3. 日志生成
- 3.1 日志启动
- 3.2 集群日志生成启动脚本
- 3.3 集群时间同步脚本
- 3.4 集群查看所有进程脚本
- 4. Flume 采集日志
- 4.1 安装 Flume
- 4.2 日志采集 Flume 配置
- 4.3 日志采集启动停止脚本
- 5. Kafka 安装配置
- 5.1 Kafka 集群安装
- 5.2 Kafka 集群启动停止脚本
- 5.3 查看 Kafka Topic 列表
- 5.4 创建 Kafka Topic
- 5.5 Kafka Manager 安装
- 5.6 Kafka Manager 启动停止脚本
- 6. Flume 消费 Kafka 数据
- 6.1 **流程分析**
- 6.2 具体配置
- 6.3 日志消费 Flume 启动停止脚本
- 7. 采集通道启动停止脚本
1. Hadoop 安装
1.1 安装 Hadoop
集群规划:
服务名 hadoop 101 hadoop102 hadoop103 HDFS NameNode DataNode DataNode SecondaryNameNode DataNode Yarn NodeManager ResourceManager NodeManager NodeManager 安装。
先 Mark,之后陆续更新。
1.2 Hadoop 集群启动停止脚本
在
hadoop101
的/home/zgl/bin/
目录下创建脚本hdp.sh
。#!/bin/bashcase $1 in "start") {echo "***************** 启动Hadoop集群 *****************"ssh hadoop101 "source /etc/profile;/opt/module/hadoop-2.7.2/sbin/start-dfs.sh"ssh hadoop102 "source /etc/profile;/opt/module/hadoop-2.7.2/sbin/start-yarn.sh"ssh hadoop101 "source /etc/profile;/opt/module/hadoop-2.7.2/sbin/mr-jobhistory-daemon.sh start historyserver" };; "stop") {echo "***************** 关闭Hadoop集群 *****************"ssh hadoop101 "source /etc/profile;/opt/module/hadoop-2.7.2/sbin/mr-jobhistory-daemon.sh stop historyserver"ssh hadoop102 "source /etc/profile;/opt/module/hadoop-2.7.2/sbin/stop-yarn.sh"ssh hadoop101 "source /etc/profile;/opt/module/hadoop-2.7.2/sbin/stop-dfs.sh" };; esac
增加脚本执行权限。
chmod 777 hdp.sh
Hadoop
集群启动脚本。hdp.sh start
Hadoop
集群停止脚本。hdp.sh stop
2. Zookeeper 安装
2.1 安装 ZK
集群规划:
服务名 hadoop101 hadoop102 hadoop103 Zookeeper √ √ √ 安装。
先 Mark,之后陆续更新。
2.2 ZK 集群启动停止脚本
在
hadoop101
的/home/zgl/bin/
目录下创建脚本zk.sh
。#!/bin/bashcase $1 in "start") {for i in hadoop101 hadoop102 hadoop103dossh $i "source /etc/profile;/opt/module/zookeeper-3.4.10/bin/zkServer.sh start"done };; "stop") {for i in hadoop101 hadoop102 hadoop103dossh $i "source /etc/profile;/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop"done };; "status") {for i in hadoop101 hadoop102 hadoop103dossh $i "source /etc/profile;/opt/module/zookeeper-3.4.10/bin/zkServer.sh status"done };; esac
增加脚本执行权限。
chmod 777 zk.sh
zookeeper
集群启动脚本。zk.sh start
zookeeper
集群停止脚本。zk.sh stop
zookeeper
集群查看状态脚本。zk.sh status
3. 日志生成
3.1 日志启动
将用户数据生成的代码
jar
包,拷贝到hadoop101
上,并同步到hadoop102
上。在
hadoop101
上执行jar
程序。java -classpath log-collector-1.0-SNAPSHOT-jar-with-dependencies.jar com.guli.appclient.AppMain >/opt/module/test.log
在
/tmp/logs/
路径下查看生成的数据。[zgl@hadoop101 module]$ cd /tmp/logs/ [zgl@hadoop101 logs]$ ll -rw-rw-r--. 1 zgl zgl 712210 5月 15 19:57 app-2020-05-15.log
3.2 集群日志生成启动脚本
在
hadoop101
的/home/zgl/bin/
目录下创建脚本lg.sh
。#!/bin/bashfor i in hadoop101 hadoop102 do # $1 表示控制发送每条数据的延时时间,默认是0 # $2 表示一共发送多少条数据ssh $i "source /etc/profile;java -classpath /opt/module/log-collector-1.0-SNAPSHOT-jar-with-dependencies.jar com.guli.appclient.AppMain $1 $2 >/opt/module/test.log &" done
修改脚本执行权限。
chmod 777 lg.sh
启动脚本。
lg.sh
分别在
hadoop101
、hadoop102
的/tmp/logs
目录上查看生成的数据。
3.3 集群时间同步脚本
在
hadoop101
的/home/zgl/bin/
目录下创建脚本dt.sh
。#!/bin/bashlog_date=$1 for i in hadoop101 hadoop102 hadoop103 dossh -t $i "sudo date -s $log_date" done
修改脚本执行权限。
chmod 777 dt.sh
启动脚本。
dt.sh 2020-5-15
3.4 集群查看所有进程脚本
在
hadoop101
的/home/zgl/bin/
目录下创建脚本xcall
。#!/bin/bashparams=$@ for((i=101 ;i <104 ;i=$i+1 ));doecho ==========hadoop$i==========ssh hadoop$i "source /etc/profile;$params" done
修改脚本执行权限。
chmod 777 xcall
启动脚本。
xcall jps
4. Flume 采集日志
4.1 安装 Flume
集群规划:
服务名 hadoop101 hadoop102 hadoop103 Flume √ √ 安装。
先 Mark,之后陆续更新。
4.2 日志采集 Flume 配置
配置分析
实现两个自定义拦截器
2.1
ETL
拦截器: 用于过滤时间戳不合法与JSON
数据不完整的日志。2.1.1 创建
Maven
工程flume-interceptor
。2.1.2 创建包
com.guli.flume.interceptor
。2.1.3 在
pom.xml
中添加如下依赖:<dependencies><dependency><groupId>org.apache.flume</groupId><artifactId>flume-ng-core</artifactId><version>1.7.0</version></dependency> </dependencies><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins> </build>
在
com.guli.flume.interceptor
下创建类LogETLInterceptor
。package com.guli.flume.interceptor;import org.apache.flume.Context; import org.apache.flume.Event; import org.apache.flume.interceptor.Interceptor;import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List;/*** 用于过滤时间戳不合法的数据和不完整的数据*/ public class LogETLInterceptor implements Interceptor {@Overridepublic void initialize() {}@Overridepublic Event intercept(Event event) {String logStr = new String(event.getBody(), Charset.forName("UTF-8"));if (logStr.contains("start")) {if (LogUtils.validateStart(logStr)) {return event;}} else {if (LogUtils.validateEvent(logStr)) {return event;}}return null;}@Overridepublic List<Event> intercept(List<Event> list) {ArrayList<Event> events = new ArrayList<>();for (Event event : list) {if (intercept(event) != null) {events.add(intercept(event));}}return events;}@Overridepublic void close() {}public static class Builder implements Interceptor.Builder {@Overridepublic Interceptor build() {return new LogETLInterceptor();}@Overridepublic void configure(Context context) {}} }
创建工具类
LogUtils
package com.guli.flume.interceptor;import org.apache.commons.lang.math.NumberUtils;public class LogUtils {public static boolean validateStart(String log) {if (log == null) {return false;}if (!log.trim().startsWith("{") || !log.trim().endsWith("}")) {return false;}return true;}public static boolean validateEvent(String log) {if (log.contains("|")) {String[] logFiled = log.split("\\|");if (logFiled.length != 2) {return false;}if (logFiled[0].length() != 13 || !NumberUtils.isDigits(logFiled[0])) {return false;}if (!logFiled[1].trim().startsWith("{") || !logFiled[1].trim().endsWith("}")) {return false;}}return true;} }
类型区分拦截器: 用于将启动日志和事件日志区分开,以便发往
Kafka
的不同Topic
。- 在
com.guli.flume.interceptor
下创建类LogTypeInterceptor
。
package com.guli.flume.interceptor;import org.apache.flume.Context; import org.apache.flume.Event; import org.apache.flume.interceptor.Interceptor;import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.Map;public class LogTypeInterceptor implements Interceptor {@Overridepublic void initialize() {}@Overridepublic Event intercept(Event event) {String logStr = new String(event.getBody(), Charset.forName("UTF-8"));Map<String, String> headers = event.getHeaders();if (logStr.contains("start")) {headers.put("topic", "topic_start");} else {headers.put("topic", "topic_event");}return event;}@Overridepublic List<Event> intercept(List<Event> list) {ArrayList<Event> events = new ArrayList<>();for (Event event : list) {events.add(intercept(event));}return events;}@Overridepublic void close() {}public static class Builder implements Interceptor.Builder {@Overridepublic Interceptor build() {return new LogTypeInterceptor();}@Overridepublic void configure(Context context) {}} }
- 在
打包放入
hadoop101
与hadoop102
的flume
的lib
目录下。
具体配置
在
/opt/module/flume-1.7.0/conf
目录下创建file-flume-kafka.conf
文件。在文件中配置如下内容:
# 组件定义 a1.sources = r1 a1.channels = c1 c2# tailDir Source a1.sources.r1.type = TAILDIR a1.sources.r1.channels = c1 c2 a1.sources.r1.positionFile = /opt/module/flume-1.7.0/taildir_position.json a1.sources.r1.filegroups = f1 a1.sources.r1.filegroups.f1 = /tmp/logs/app.+ a1.sources.r1.fileHeader = true# interceptors a1.sources.r1.interceptors = i1 i2 a1.sources.r1.interceptors.i1.type = com.guli.flume.interceptor.LogETLInterceptor$Builder a1.sources.r1.interceptors.i2.type = com.guli.flume.interceptor.LogTypeInterceptor$Builder a1.sources.r1.selector.type = multiplexing a1.sources.r1.selector.header = topic a1.sources.r1.selector.mapping.topic_start = c1 a1.sources.r1.selector.mapping.topic_event = c2# kafka channels a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel a1.channels.c1.kafka.bootstrap.servers = hadoop101:9092,hadoop102:9092,hadoop103:9092 a1.channels.c1.kafka.topic = topic_start a1.channels.c1.parseAsFlumeEvent = false a1.channels.c1.kafka.consumer.group.id = zgla1.channels.c2.type = org.apache.flume.channel.kafka.KafkaChannel a1.channels.c2.kafka.bootstrap.servers = hadoop101:9092,hadoop102:9092,hadoop103:9092 a1.channels.c2.kafka.topic = topic_event a1.channels.c2.parseAsFlumeEvent = false a1.channels.c2.kafka.consumer.group.id = zgl
4.3 日志采集启动停止脚本
在
hadoop101
的/home/zgl/bin/
下创建脚本f1.sh
。#!/bin/bashcase $1 in "start") {for i in hadoop101 hadoop102doecho " --------启动 $i 采集flume-------"ssh $i "source /etc/profile;nohup /opt/module/flume-1.7.0/bin/flume-ng agent --name a1 --conf-file /opt/module/flume-1.7.0/conf/file-flume-kafka.conf -Dflume.root.logger=INFO,LOGFILE >/dev/null 2>&1 &"done };; "stop") {for i in hadoop101 hadoop102doecho " --------停止 $i 采集flume-------"ssh $i "source /etc/profile;ps -ef | grep file-flume-kafka | grep -v grep |awk '{print \$2}' | xargs kill"done };; esac
nohup
,该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup
就是不挂起的意思,不挂断地运行命令。/dev/null
代表linux
的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。
增加脚本执行权限。
chmod 777 f1.sh
日志采集启动。
f1.sh start
日志采集停止。
f1.sh stop
5. Kafka 安装配置
5.1 Kafka 集群安装
集群规划。
服务名 hadoop101 hadoop102 hadoop103 Kafka √ √ √ 安装。
先 Mark ,之后陆续更新。
5.2 Kafka 集群启动停止脚本
在
hadoop101
的/home/zgl/bin/
目录下创建脚本kk.sh
。#!/bin/bashcase $1 in "start") {for i in hadoop101 hadoop102 hadoop103doecho " --------启动 $i Kafka-------"# 用于KafkaManager监控ssh $i "source /etc/profile;export JMX_PORT=9988 && /opt/module/kafka_2.11/bin/kafka-server-start.sh -daemon /opt/module/kafka_2.11/config/server.properties"done };; "stop") {for i in hadoop101 hadoop102 hadoop103doecho " --------停止 $i Kafka-------"ssh $i "/opt/module/kafka_2.11/bin/kafka-server-stop.sh stop"done };; esac
- 启动
Kafka
时要先开启JMX
端口,是用于后续KafkaManager
监控。
- 启动
增加脚本执行权限。
chmod 777 kk.sh
Kafka
集群启动。kk.sh start
Kafka
集群停止。kk.sh stop
5.3 查看 Kafka Topic 列表
[zgl@hadoop101 kafka_2.11]$ bin/kafka-topics.sh --zookeeper hadoop101:2181 --list
5.4 创建 Kafka Topic
[zgl@hadoop101 kafka_2.11]$ bin/kafka-topics.sh --zookeeper hadoop101:2181 --create --topic topic_start --replication-factor 1 --partitions 1[zgl@hadoop101 kafka_2.11]$ bin/kafka-topics.sh --zookeeper hadoop101:2181 --create --topic topic_event --replication-factor 1 --partitions 1[zgl@hadoop101 kafka_2.11]$ bin/kafka-topics.sh --zookeeper hadoop101:2181 --list
topic_event
topic_start
5.5 Kafka Manager 安装
Kafka Manager
是yahoo
的一个Kafka
监控管理项目。安装。
先 Mark,之后陆续更新。
启动
Kafka Manager
[zgl@hadoop101 kafka-manager-1.3.3.22]$ bin/kafka-manager -Dhttp.port=7456 >/opt/module/kafka-manager-1.3.3.22/start.log 2>&1 &
启动后用浏览器打开 : http://hadoop101:7456 。
- 选择添加
Cluster
:
确定之后,就可以查看整个
Kafka
集群的状态。
5.6 Kafka Manager 启动停止脚本
在
hadoop101
的/home/zgl/bin/
目录下创建脚本km.sh
。#!/bin/bashcase $1 in "start") {echo " -------- 启动 KafkaManager -------"source /etc/profilenohup /opt/module/kafka-manager-1.3.3.22/bin/kafka-manager -Dhttp.port=7456 >start.log 2>&1 & };; "stop"){echo " -------- 停止 KafkaManager -------"source /etc/profile ps -ef | grep ProdServerStart | grep -v grep |awk '{print $2}' | xargs kill };; esac
增加脚本执行权限。
chmod 777 km.sh
km
集群启动km.sh start
km
集群停止km.sh stop
6. Flume 消费 Kafka 数据
6.1 流程分析
6.2 具体配置
在
hadoop103
的opt/module/flume-1.7.0/conf
目录下创建kafka-flume-hdfs.conf
文件。a1.sources = r1 r2 a1.sinks = k1 k2 a1.channels = c1 c2# kafka Source a1.sources.r1.type = org.apache.flume.source.kafka.KafkaSource a1.sources.r1.channels = c1 a1.sources.r1.batchSize = 5000 a1.sources.r1.batchDurationMillis = 2000 a1.sources.r1.kafka.bootstrap.servers = hadoop101:9092,hadoop102:9092,hadoop103:9092 a1.sources.r1.kafka.topics = topic_starta1.sources.r2.type = org.apache.flume.source.kafka.KafkaSource a1.sources.r2.channels = c2 a1.sources.r2.batchSize = 5000 a1.sources.r2.batchDurationMillis = 2000 a1.sources.r2.kafka.bootstrap.servers = hadoop101:9092,hadoop102:9092,hadoop103:9092 a1.sources.r2.kafka.topics = topic_event# File channels a1.channels.c1.type = file a1.channels.c1.checkpointDir = /opt/module/flume-1.7.0/checkpoint/behavior1 a1.channels.c1.dataDirs = /opt/module/flume-1.7.0/data/behavior1/ a1.channels.c1.maxFileSize = 2146435071 a1.channels.c1.capacity = 1000000 a1.channels.c1.keep-alive = 6a1.channels.c2.type = file a1.channels.c2.checkpointDir = /opt/module/flume-1.7.0/checkpoint/behavior2 a1.channels.c2.dataDirs = /opt/module/flume-1.7.0/data/behavior2/ a1.channels.c2.maxFileSize = 2146435071 a1.channels.c2.capacity = 1000000 a1.channels.c2.keep-alive = 6# HDFS sinks a1.sinks.k1.type = hdfs a1.sinks.k1.channel = c1 a1.sinks.k1.hdfs.path = /orgin_data/gmall/log/topic_start/%Y-%m-%d a1.sinks.k1.hdfs.filePrefix = logstart- a1.sinks.k1.hdfs.round = true a1.sinks.k1.hdfs.roundValue = 10 a1.sinks.k1.hdfs.roundUnit = seconda1.sinks.k2.type = hdfs a1.sinks.k2.channel = c2 a1.sinks.k2.hdfs.path = /orgin_data/gmall/log/topic_event/%Y-%m-%d a1.sinks.k2.hdfs.filePrefix = logevent- a1.sinks.k2.hdfs.round = true a1.sinks.k2.hdfs.roundValue = 10 a1.sinks.k2.hdfs.roundUnit = second## 不要产生大量小文件 a1.sinks.k1.hdfs.rollInterval = 10 a1.sinks.k1.hdfs.rollSize = 134217728 a1.sinks.k1.hdfs.rollCount = 0a1.sinks.k2.hdfs.rollInterval = 10 a1.sinks.k2.hdfs.rollSize = 134217728 a1.sinks.k2.hdfs.rollCount = 0## 控制输出文件是原生文件。 a1.sinks.k1.hdfs.fileType = CompressedStream a1.sinks.k2.hdfs.fileType = CompressedStream a1.sinks.k1.hdfs.codeC = lzop a1.sinks.k2.hdfs.codeC = lzop
6.3 日志消费 Flume 启动停止脚本
在
hadoop103
的/home/zgl/bin/
目录下创建脚本f2.sh
。#!/bin/bashcase $1 in "start") {for i in hadoop103do echo " --------启动 $i 消费flume-------"ssh $i "source /etc/profile;nohup /opt/module/flume-1.7.0/bin/flume-ng agent --conf-file /opt/module/flume-1.7.0/conf/kafka-flume-hdfs.conf --name a1 -Dflume.root.logger=INFO,LOGFILE >/opt/module/flume-1.7.0/log.txt 2>&1 &"done };; "stop") {for i in hadoop103do echo " --------停止 $i 消费flume-------"ssh $i "source /etc/profile;ps -ef | grep kafka-flume-hdfs | grep -v grep |awk '{print \$2}' | xargs kill"done };; esac
增加脚本执行权限。
chmod 777 f2.sh
启动。
f2.sh start
停止。
f2.sh stop
7. 采集通道启动停止脚本
在
hadoop101
的/home/zgl/bin/
目录下创建脚本cluster.sh
。#!/bin/bashcase $1 in "start") {echo " -------- 启动集群 -------"hdp.sh startzk.sh startsleep 4s;f1.sh startkk.sh startsleep 6s;f2.sh startkm.sh start };; "stop") {echo " -------- 停止集群 -------"km.sh stopf2.sh stopkk.sh stopsleep 6s;f1.sh stopzk.sh stophdp.sh stop };; esac
增加脚本执行权限。
chmod 777 cluster.sh
启动脚本
cluster.sh start
停止脚本
cluster.sh stop
02 电商数仓(数据采集模块)相关推荐
- 电商数仓笔记2_用户行为采集(数据采集模块)
电商数仓 一.数据采集模块 1.集群所有进程查看脚本 2.Hadoop安装 (1)项目经验之HDFS存储多目录 (2)集群数据均衡 (3)项目经验之支持LZO压缩配置 (4)项目经验之LZO创建索引 ...
- 大数据实战项目之电商数仓(一)
大数据实战项目之电商数仓(一) 项目介绍 数据仓库概念 数据仓库是为企业所有决策制定过程,提供所有系统数据支持的战略集合.通过对数据仓库中数据的分析,可以帮助企业改进业务流程,控制成本,提高产品质 ...
- 电商数仓描述_大数据企业级电商数据仓库架构设计和实现(技术点与企业接轨)...
课程咨询和资料获取请加老师QQ 1011800132 该项目以国内电商巨头实际业务应用场景为依托,紧跟大数据主流需求,对电商数仓的常见实战指标以及难点实战指标进行了详尽讲解,让你迅速成长,获取最前沿 ...
- 尚硅谷大数据项目之电商数仓(4即席查询数据仓库)
尚硅谷大数据项目之电商数仓(即席查询) (作者:尚硅谷大数据研发部) 版本:V4.0 第1章 Presto 1.1 Presto简介 1.1.1 Presto概念 1.1.2 Presto架构 1.1 ...
- 大数据项目之电商数仓、业务数据介绍、电商系统表结构
文章目录 6. 业务数据介绍 6.1 电商系统表结构 6.1.1 活动信息表(activity_info) 6.1.2 活动规则表(activity_rule) 6.1.3 活动商品关联表(activ ...
- 2 大数据电商数仓项目——项目需求及架构设计
2 大数据电商数仓项目--项目需求及架构设计 2.1 项目需求分析 用户行为数据采集平台搭建. 业务数据采集平台搭建. 数据仓库维度建模(核心):主要设计ODS.DWD.DWS.AWT.ADS等各个层 ...
- 电商数仓描述_笔记-尚硅谷大数据项目数据仓库-电商数仓V1.2新版
架构 项目框架 数仓架构 存储压缩 Snappy与LZO LZO安装: 读取LZO文件时,需要先创建索引,才可以进行切片. 框架版本选型Apache:运维麻烦,需要自己调研兼容性. CDH:国内使用最 ...
- 复盘离线电商数仓3.0项目–数据开发梳理
复盘离线电商数仓项目–数据开发梳理 业务数据 数仓分层 ods层到ads层的开发 开源BI工具Superset ODS层业务数据&日志数据 ods层业务数据 使用Sqoop脚本从Mysql数据 ...
- 大数据电商数仓实战v5.0 (尚硅谷)
电商数仓实战 环境搭建快速回忆 这次详细写!------阿里云ECS云服务器抢占式 1.进入环境先创建wts用户 1.useradd wts 2.passwd wts 去/home/下查看有没有wts ...
最新文章
- linux的三个时间
- 配置CITRIX XML 服务与IIS 7.x共享端口
- java添加删除用户信息泄露_java删除用户404错误!!神奇!增改查都没问题啊!!...
- rh9.0虚拟机dmesg启动过程分析(1)
- PHP字符串offset取值特性
- Qt 信号-槽的同步与异步处理
- 【转】【异常处理】Incorrect string value: ‘\xF0\x90\x8D\x83...‘ for column... Emoji表情字符过滤的Java实现
- 【图像分割】基于matlab GUI二值化+灰白质医学影像分割【含Matlab源码 184期】
- Python - OpenCV库的安装
- GUI界面设计学渣笔记———使用PyQt做深度学习的可视化界面
- c语言变量ppt,C语言数据类型和变量课件PPT
- 盒子模型(标准盒模型、怪异盒模型)
- R语言-rethinking包下载安装心得(windows)
- 四川大学图书情报档案专业考研经验贴(2022.9.16已更新)
- JavaScript实时获取现货黄金,白银,美元指数价格代码
- catti二级笔译综合能力真题_catti二级笔译综合能力试题精选及答案解析
- 判断两个向量是否平行
- Java 读取EXCEL表格中的数据,将数据转为SQL语句
- 计算机语言中的逻辑异或的应用,异或同或门逻辑符号_利用或门和非门设计的异或门方案...
- C#如何解析UTF-8编码
热门文章
- Android应用之个人日记本
- JDK8新特性详解Lambda、StreamAPI、Optional等
- Python基础知识随缘补(1)字符串的前缀f,r,u,b
- OkHttp之线程池的使用
- 万字泣血解析割韭菜内幕,程序员别老想着做副业
- 加密算法比较:SHA1,SHA256(SHA2),MD5
- python geometry参数_python arcgis Geometry | 学步园
- 程序思路分享 计算机毕业设计Python+Spark+Hadoop+Flink微博舆情预警系统 微博舆情可视化 舆情大数据 微博大数据 微博爬虫 大数据毕业设计 大数据毕设
- 微信公众号开发测试帐号
- 第133天学习打卡(Docker 初识Docker Docker的基本组成 安装docker 阿里云镜像加速 Docker常用命令)