学习Sqoop前,先装好Hadoop、HIVE和MySQL

帅气的目录

  • 1、Sqoop简介
  • 2、安装
    • 2.1、下载
    • 2.2、环境变量
    • 2.3、解压和移动
    • 2.4、配置文件(此步可略)
    • 2.5、复制 JDBC 驱动程序
    • 2.6、MySQL连接测试
  • 3、基本操作
  • 4、ETL入门示例
    • 4.1、数据准备
    • 4.2、MySQL数据导入到HDFS
    • 4.3、HDFS数据导出到MySQL
  • 5、ETL进阶示例
    • 5.1、数据准备
    • 5.2、MySQL数据导入到HIVE
    • 5.3、HIVE数据导出到MySQL
    • 5.4、增量更新
    • 5.5、Python2脚本部署
  • 6、MySQL数据导入HIVE表分区

1、Sqoop简介

  • 开源的数据传输工具
  • 主用在Hadoop(HDFS)与传统的数据库(MySQL、Oracle…)之间
  • 官网:http://sqoop.apache.org/

2、安装

2.1、下载

  • 本文版本:sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
  • 该版教学地址:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html
wget http://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz

2.2、环境变量

https://blog.csdn.net/Yellow_python/article/details/112692486

2.3、解压和移动

tar -zxf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
mv sqoop-1.4.7.bin__hadoop-2.6.0 $SQOOP_HOME

2.4、配置文件(此步可略)

cd $SQOOP_HOME/conf
mv sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh

2.5、复制 JDBC 驱动程序

cp $HIVE_HOME/lib/mysql-connector-java-*.*.*.jar $SQOOP_HOME/lib/
ll $SQOOP_HOME/lib/ | grep mysql-connector-java-

之前安装MySQL和HIVE时,已经拷贝了一个,因此本文从HIVE那里拿

2.6、MySQL连接测试

sqoop list-databases \
--connect jdbc:mysql://hadoop100:3306/ \
--username root \
--password 123456
基础参数 说明
--connect 连接
--username 账户
--password 密码

3、基本操作

sqoop help

sqoop help import
sqoop help export

4、ETL入门示例

#mermaid-svg-O3D2KflWkGVXIhll {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-O3D2KflWkGVXIhll .error-icon{fill:#552222;}#mermaid-svg-O3D2KflWkGVXIhll .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-O3D2KflWkGVXIhll .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-O3D2KflWkGVXIhll .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-O3D2KflWkGVXIhll .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-O3D2KflWkGVXIhll .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-O3D2KflWkGVXIhll .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-O3D2KflWkGVXIhll .marker{fill:#333333;stroke:#333333;}#mermaid-svg-O3D2KflWkGVXIhll .marker.cross{stroke:#333333;}#mermaid-svg-O3D2KflWkGVXIhll svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-O3D2KflWkGVXIhll .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-O3D2KflWkGVXIhll .cluster-label text{fill:#333;}#mermaid-svg-O3D2KflWkGVXIhll .cluster-label span{color:#333;}#mermaid-svg-O3D2KflWkGVXIhll .label text,#mermaid-svg-O3D2KflWkGVXIhll span{fill:#333;color:#333;}#mermaid-svg-O3D2KflWkGVXIhll .node rect,#mermaid-svg-O3D2KflWkGVXIhll .node circle,#mermaid-svg-O3D2KflWkGVXIhll .node ellipse,#mermaid-svg-O3D2KflWkGVXIhll .node polygon,#mermaid-svg-O3D2KflWkGVXIhll .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-O3D2KflWkGVXIhll .node .label{text-align:center;}#mermaid-svg-O3D2KflWkGVXIhll .node.clickable{cursor:pointer;}#mermaid-svg-O3D2KflWkGVXIhll .arrowheadPath{fill:#333333;}#mermaid-svg-O3D2KflWkGVXIhll .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-O3D2KflWkGVXIhll .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-O3D2KflWkGVXIhll .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-O3D2KflWkGVXIhll .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-O3D2KflWkGVXIhll .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-O3D2KflWkGVXIhll .cluster text{fill:#333;}#mermaid-svg-O3D2KflWkGVXIhll .cluster span{color:#333;}#mermaid-svg-O3D2KflWkGVXIhll div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-O3D2KflWkGVXIhll :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

Sqoop
Sqoop
MySQL
HDFS
MySQL

4.1、数据准备

登录MySQL建2个表,其中一个插入数据,长相如下

mysql -uroot -p123456
DROP DATABASE IF EXISTS b1;
CREATE DATABASE b1;
CREATE TABLE IF NOT EXISTS b1.t1 (f1 INT(9) PRIMARY KEY,f2 CHAR(9));
INSERT INTO b1.t1 VALUES (1,'a'),(2,'b'),(3,null),(4,'b');
SELECT * FROM b1.t1;
CREATE TABLE IF NOT EXISTS b1.t2 (f1 INT(9) PRIMARY KEY,f2 CHAR(9));

4.2、MySQL数据导入到HDFS

sqoop import \
--connect jdbc:mysql://hadoop100:3306/b1 \
--username root --password 123456 \
--target-dir /b1/t1 \
--delete-target-dir \
--query 'SELECT * FROM t1 WHERE $CONDITIONS' \
--num-mappers 2 \
--split-by f1
常用参数 说明
--target-dir HDFS目标目录
--delete-target-dir 删除目标目录(若存在)
--append 追加形式写入(不和--delete-target-dir同用)
--query 查询语句,其中$CONDITIONS是固定要加上去的
--num-mappers <n> Map任务并行数,默认4,建议设成1
--split-by <column-name> Map并行数≠1时,要设 按什么列来横切表,然后分配给Map

结果查看hadoop fs -ls /b1/t1

4.3、HDFS数据导出到MySQL

sqoop export \
--connect jdbc:mysql://hadoop100:3306/b1 \
--username root --password 123456 \
--num-mappers 2 \
--export-dir /b1/t1 \
--table t2
常用描述 描述
--export-dir <dir> HDFS导出的源路径
--table <table-name> 目的地MySQL表名

导出MySQL结果

5、ETL进阶示例

#mermaid-svg-vGcA5hOxVgTewgD0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-vGcA5hOxVgTewgD0 .error-icon{fill:#552222;}#mermaid-svg-vGcA5hOxVgTewgD0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vGcA5hOxVgTewgD0 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-vGcA5hOxVgTewgD0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vGcA5hOxVgTewgD0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vGcA5hOxVgTewgD0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vGcA5hOxVgTewgD0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vGcA5hOxVgTewgD0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vGcA5hOxVgTewgD0 .marker.cross{stroke:#333333;}#mermaid-svg-vGcA5hOxVgTewgD0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vGcA5hOxVgTewgD0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vGcA5hOxVgTewgD0 .cluster-label text{fill:#333;}#mermaid-svg-vGcA5hOxVgTewgD0 .cluster-label span{color:#333;}#mermaid-svg-vGcA5hOxVgTewgD0 .label text,#mermaid-svg-vGcA5hOxVgTewgD0 span{fill:#333;color:#333;}#mermaid-svg-vGcA5hOxVgTewgD0 .node rect,#mermaid-svg-vGcA5hOxVgTewgD0 .node circle,#mermaid-svg-vGcA5hOxVgTewgD0 .node ellipse,#mermaid-svg-vGcA5hOxVgTewgD0 .node polygon,#mermaid-svg-vGcA5hOxVgTewgD0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vGcA5hOxVgTewgD0 .node .label{text-align:center;}#mermaid-svg-vGcA5hOxVgTewgD0 .node.clickable{cursor:pointer;}#mermaid-svg-vGcA5hOxVgTewgD0 .arrowheadPath{fill:#333333;}#mermaid-svg-vGcA5hOxVgTewgD0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vGcA5hOxVgTewgD0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vGcA5hOxVgTewgD0 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-vGcA5hOxVgTewgD0 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-vGcA5hOxVgTewgD0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vGcA5hOxVgTewgD0 .cluster text{fill:#333;}#mermaid-svg-vGcA5hOxVgTewgD0 .cluster span{color:#333;}#mermaid-svg-vGcA5hOxVgTewgD0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vGcA5hOxVgTewgD0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

Sqoop
hive
Sqoop
MySQL
HDFS
HIVE
MySQL
同步策略 说明 数据特点 示例
全量同步 覆盖写入 量小 商品表、品牌表
增量同步 追加写入 量大、增量、不改 支付表、退款表
增量变化同步 追加和修改 量大、增量、会改 订单流水表、优惠券流水表
特殊同步 覆盖写入
(很久才一次)
数据不常变 日期表、地区表
鞋子尺码表

5.1、数据准备

1、MySQL建表

mysql -uroot -p123456
DROP DATABASE IF EXISTS b2;
CREATE DATABASE b2;
CREATE TABLE IF NOT EXISTS b2.t1
(f1 INT(9) PRIMARY KEY,f2 CHAR(9),f3 DATE,f4 INT(9));
INSERT INTO b2.t1 VALUES (1,'a','2020-1-1',NULL);
INSERT INTO b2.t1 VALUES (2,'b','2020-1-1',NULL);
INSERT INTO b2.t1 VALUES (3,'a','2020-1-2',5);
INSERT INTO b2.t1 VALUES (4,'b','2020-1-2',NULL);
SELECT * FROM b2.t1;
CREATE TABLE IF NOT EXISTS b2.t2
(f1 INT(9) PRIMARY KEY,f2 CHAR(9),f3 DATE);

2、HIVE建表,设分区

DROP DATABASE IF EXISTS b2 CASCADE;  --删库
CREATE DATABASE b2 LOCATION '/b2';  --建库
CREATE TABLE b2.t1 (f1 INT ,f2 STRING,f4 INT)
PARTITIONED BY (f3 DATE)  --按日期分区
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'  --行格式
LOCATION '/b2/t1';

5.2、MySQL数据导入到HIVE

参数 说明
--null-string <null-string> The string to be written for a null value for string columns
--null-non-string <null-string> The string to be written for a null value for non-string columns
--fields-terminated-by <char> 字段分隔符,默认,
--lines-terminated-by <char> 行分隔符,默认\n

1、按日期导入HDFS

sqoop import \
--connect jdbc:mysql://hadoop100:3306/b2 \
--username root --password 123456 \
--delete-target-dir --target-dir /h1/b2/t1/2020-1-1 \
--query "SELECT f1,f2,f4 FROM t1 WHERE f3='2020-1-1' AND \$CONDITIONS" \
--fields-terminated-by '\t' --lines-terminated-by '\n' \
--null-string '\\N' --null-non-string '\\N' \
--num-mappers 1

2、HDFS导进HIVE

LOAD DATA  -- 数据导入
INPATH '/h1/b2/t1/2020-1-1'  --数据来源
OVERWRITE  --覆盖写入
INTO TABLE b2.t1  --数据终点
PARTITION(f3='2020-1-1')  --分区
;

LOAD DATA

LOAD DATA

3、查询数据SELECT * FROM b2.t1;

5.3、HIVE数据导出到MySQL

参数 说明
--input-null-string <null-string> The string to be interpreted as null for string columns
--input-null-non-string <null-string> The string to be interpreted as null for non-string columns
--update-mode <mode> 更新模式,包括:updateonly(默认)和allowinsert
--update-key <col-name> allowinsert模式下,作为更新依据的列名
若有多列就用逗号分隔
--columns <col,col,col…> 指定导出的列
--input-fields-terminated-by <char> 字段分隔符,默认,
--input-lines-terminated-by <char> 行分隔符,默认\n
sqoop export \
--connect jdbc:mysql://hadoop100:3306/b2 \
--username root --password 123456 \
--table t2 \
--num-mappers 1 \
--input-fields-terminated-by '\t' \
--input-null-string '\\N' --input-null-non-string '\\N' \
--update-mode allowinsert \
--update-key f1 \
--columns f1,f2 \
--export-dir '/b2/t1/f3=2020-01-01'

查看MySQL:SELECT * FROM b2.t2;

5.4、增量更新

1、按日期导入HDFS

sqoop import \
--connect jdbc:mysql://hadoop100:3306/b2 \
--username root --password 123456 \
--delete-target-dir --target-dir /h1/b2/t1/2020-1-2 \
--query "SELECT f1,f2,f4 FROM t1 WHERE f3='2020-1-2' AND \$CONDITIONS" \
--fields-terminated-by '\t' --lines-terminated-by '\n' \
--input-null-string '\\N' --null-non-string '\\N' \
--num-mappers 1

2、HDFS导进HIVE

LOAD DATA  -- 数据导入
INPATH '/h1/b2/t1/2020-1-2'  --数据来源
OVERWRITE  --覆盖写入
INTO TABLE b2.t1  --数据终点
PARTITION(f3='2020-1-2')  --分区
;

3、查询数据SELECT * FROM b2.t1;

4、HIVE数据导出到MySQL,注意不要缺少0

sqoop export \
--connect jdbc:mysql://hadoop100:3306/b2 \
--username root --password 123456 \
--table t2 \
--num-mappers 1 \
--input-fields-terminated-by '\t' \
--input-null-string '\\N' --input-null-non-string '\\N' \
--update-mode allowinsert \
--update-key f1 \
--columns f1,f2 \
--export-dir /b2/t1/f3=2020-01-02

5、查看MySQL:SELECT * FROM b2.t2;

5.5、Python2脚本部署

touch etl.py
chmod 777 etl.py
vim etl.py
#!/usr/bin/python
import sys, datetime
from subprocess import check_outputa = sys.argv
# print ayesterday = datetime.date.today() - datetime.timedelta(days=1)
ymd = a[1] if len(a) == 2 else yesterday.strftime('%Y-%m-%d')
# print ymdsqoop_import = r'''
sqoop import
--connect jdbc:mysql://hadoop100:3306/b2
--username root --password 123456
--delete-target-dir --target-dir /h1/b2/t1/%s
--query "SELECT f1,f2,f4 FROM t1 WHERE f3='%s' AND \$CONDITIONS"
--fields-terminated-by '\t' --lines-terminated-by '\n'
--null-string '\\N' --null-non-string '\\N'
--num-mappers 1
''' % (ymd, ymd)
# print sqoop_importhive = r'''
hive -e "LOAD DATA INPATH '/h1/b2/t1/%s'
OVERWRITE INTO TABLE b2.t1 PARTITION(f3='%s');"
''' % (ymd, ymd)
# print hivesqoop_export = r'''
sqoop export
--connect jdbc:mysql://hadoop100:3306/b2
--username root --password 123456
--table t2
--num-mappers 1
--input-fields-terminated-by '\t' --input-lines-terminated-by '\n'
--input-null-string '\\N' --input-null-non-string '\\N'
--update-mode allowinsert
--update-key f1
--columns f1,f2
--export-dir /b2/t1/f3=%s
''' % ymd
# print sqoop_exportdef sh(cmd):return check_output(' '.join(cmd.split()), shell=True)sh(sqoop_import)
sh(hive)
sh(sqoop_export)

执行脚本,注意不要缺少0

./etl.py
./etl.py 2020-01-01
./etl.py 2020-01-02
./etl.py 2020-01-03

6、MySQL数据导入HIVE表分区

sqoop import \
--hive-import \
--hive-overwrite \
--null-string '\\N' --null-non-string '\\N' \
--num-mappers 1 \
--hive-drop-import-delims \
--connect jdbc:mysql://主机:端口号/库名 \
--username MySQL用户 \
--password MySQL密码 \
--hive-database HIVE库名 \
--hive-table HIVE表名 \
--hive-partition-key 分区名 \
--hive-partition-value 分区值 \
--query "SELECT 字段 FROM 表 WHERE 日期=分区值 AND \$CONDITIONS" \
--target-dir HDFS临时路径 \
--delete-target-dir
--compress
Argument Description Comment
--hive-home <dir> 覆写$HIVE_HOME
--hive-import 必要
--hive-overwrite 覆盖已存在的数据 常用
--hive-table <table-name> 写到哪个HIVE表 必要
--hive-drop-import-delims 丢弃字符串中的\n\r\01 建议加上,并且HIVE表使用默认分隔符\01
--hive-delims-replacement 替代字符串中的\n\r\01
--hive-partition-key 分区字段名 常用
--hive-partition-value <v> 分区值 常用
--compress 启用压缩 常用
--compression-codec <c> 使用Hadoop压缩编码解码器 默认gzip
--target-dir HDFS临时路径 建议/temp/sqoop/{hive_db}/{hvie_tb}
--delete-target-dir 删除HDFS临时路径(若存在) 必要

--target-dir过程,我截到了3个阶段:
1、创建HDFS路径并写入数据
2、数据写完,准备导入到HIVE
3、导入到HIVE后,删除HDFS路径

[yellow@hadoop102 ~]$ hadoop fs -ls HDFS临时路径
Found 1 items
drwxr-xr-x   - yellow supergroup          0 2022-04-06 20:59 HDFS临时路径/_temporary[yellow@hadoop102 ~]$ hadoop fs -ls HDFS临时路径
Found 2 items
-rw-r--r--   2 yellow supergroup          0 2022-04-06 20:59 HDFS临时路径/_SUCCESS
-rw-r--r--   2 yellow supergroup        122 2022-04-06 20:59 HDFS临时路径/part-m-00000.gz[yellow@hadoop102 ~]$ hadoop fs -ls HDFS临时路径
ls: `HDFS临时路径': No such file or directory

若出现报错

ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf.
Make sure HIVE_CONF_DIR is set correctly.ERROR tool.ImportTool: Import failed: java.io.IOException:
java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf

报错解决

cp $HIVE_HOME/lib/hive-common-3.1.2.jar $SQOOP_HOME/lib/

大数据(3i)Sqoop安装和操作相关推荐

  1. 大数据各组件安装(数据中台搭建)

    文章目录 一.基础环境配置(三台机器都操作) 1.修改主机名: 2.关闭防火墙: 3.关闭Selinux: 4.文件描述符配置: 5.关闭 THP: 6.自定义 JDK 安装: 6.1 删除默认ope ...

  2. 大数据及Linux安装

    大数据及Linux安装 大数据背景 现在的社会发展相当迅速,科技发达,信息流通,使得人们之间的交流越来越密切,生活也越来越方便,在智能手机.智能穿戴设备基本普及的高科技时代的背景下,大数据应运而生. ...

  3. gblfy大数据技术之安装CentOS系列

    gblfy大数据技术之安装CentOS系列 1检查BIOS虚拟化支持(可以先执行第二步,如果不支持再回来设置) 2新建虚拟机 3新建虚拟机向导 4创建虚拟空白光盘 5安装Linux系统对应的CentO ...

  4. 【大数据】Sqoop使用常见问题

    写在前面:博主是一只经过实战开发历练后投身培训事业的"小山猪",昵称取自动画片<狮子王>中的"彭彭",总是以乐观.积极的心态对待周边的事物.本人的技 ...

  5. 大数据之clickhouse安装部署

    一.clickhouse简介 ClickHouse是俄罗斯的Yandex于2016年开源的一个用于联机分析(OLAP:Online Analytical Processing)的列式数据库管理系统(D ...

  6. 大数据开发之安装mysql

    文章目录 前言 一.安装mysql数据库(我们安装Mysql分支--MariaDB) 二.熟悉mysql常用命令,包括sql命令 三.命令专题 查询 排序 分类汇总 多表查询 limit子句用法 四. ...

  7. 【大数据】07 安装软件

    软件的安装是一个非常重要的环节,因为人使用电脑的目的就是使用程序,如果一个系统你连软件都不会装,那你就根本不会用. Linux 的软件安装包括以下三种: 编译安装 rpm安装:包 yum安装:仓库 首 ...

  8. 大数据Hadoop环境安装

    前言 工作场景的需要,最近开始学习起了大数据相关的东西.对于我这个初学者,大数据入门就是首先得学会Hadoop环境的安装,按照步骤如遇相关问题,请指正. Hadoop环境的安装,我是用自己电脑借助VM ...

  9. 连接端口 配置hive_Hadoop大数据平台数据仓库Hive管理操作

    #大数据# #hadoop# #Hive# #数据仓库# #大数据平台# HWI是Hive Web Interface的简称,在Hive的安装包中默认不提供,需要下载源码编译后运行. 1.1 Hive ...

  10. Hive大数据-Hive的安装与启动---大数据之Hive工作笔记0005

    然后我们再去看这个hive的安装,其实正确的学习路径应该是,首先去看 一下hadoop,因为大数据中,很多知识都是基于hadoop的,然后再去看hive,然后再去 看hbase,spark,flink ...

最新文章

  1. 什么时候会执行viewDidLoad方法
  2. Windows 10版星巴克应用现身官网
  3. ML_Multiple Linear Regression
  4. python的一个小原理
  5. poj3660 Cow Contest
  6. msys2(msys2-i686-20180531)32位下安装GMT4.5.6
  7. 前端HTML银行管理系统界面部分实现
  8. 用python写恶搞病毒
  9. Linux系统编程学习笔记
  10. 打造你自己的 MAME 模拟器。
  11. 下载加速小妙招,我不允许你不知道
  12. AR涂涂乐⭐六、 UGUI精灵格式、自动延迟截图、优化“4”、移出扫描框终止截图进程
  13. Curl POST to HTTPS url gives SSLRead() error:curl: (56) SSLRead() return error -9806
  14. Java线程池的四种创建方式
  15. K.M.P算法个人浅谈
  16. ASEMI代理AD823AARZ-RL原装ADI车规级AD823AARZ-RL
  17. 多可系统如何设置登录IP限制
  18. 如何抓包分析BLE 空口报文(GAP + GATT + LESC procedure)?
  19. 给您简单介绍术业进销存管理系统
  20. Windows下PCIe接口的多串口卡驱动开发小结

热门文章

  1. egret 微信小游戏 分享游戏截图
  2. 如何实用gho文件安装操作系统
  3. Dzz任务板初版完成笔记-仿trello私有部署的一款轻量团队任务协作工具。
  4. GEE基本概念(二)——3. filtermapreducer
  5. 海归35岁,阿里P7offer, 是否接受?
  6. 模板方法模式(java语言实现)
  7. [现代控制理论]7_线性控制器设计_Linear Controller Design
  8. 纯css实现视差滚动加文字,纯CSS视差滚动原理及实例
  9. Linux那些事儿之我是U盘(28)第一次亲密接触(四)
  10. vue-sytle样式抽离