hive基礎總結(面試常用)

来源:https://www.cnblogs.com/wenBlog/archive/2019/02/11/10361404.html
-Advertisement-
Play Games

hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。Metastore (hive元數據)Hive將元數據存儲在資料庫中,比如mysql ,derby.Hive中的元數據包括表的名稱 ...


hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。

Metastore (hive元數據)
Hive將元數據存儲在資料庫中,比如mysql ,derby.Hive中的元數據包括表的名稱,表的列和分區及其屬性,表的數據所在的目錄

Hive數據存儲在HDFS,大部分的查詢、計算由mapreduce完成
Hive數據倉庫於資料庫的異同

 (1)由於Hive採用了SQL的查詢語言HQL,因此很容易將Hive理解為資料庫。其實從結構上來看,Hive和資料庫除了擁有類似的查詢語言,
 再無類似之處。
(2)數據存儲位置。  hdfs   raw local fs
(3)數據格式。 分隔符
(4)數據更新。hive讀多寫少。Hive中不支持對數據的改寫和添加,所有的數據都是在載入的時候中確定好的。
INSERT INTO … VALUES添加數據,使用UPDATE … SET修改數據  不支持的
HDFS 一次寫入多次讀取
(5) 執行。hive通過MapReduce來實現的  而資料庫通常有自己的執行引擎。
(6)執行延遲。由於沒有索引,需要掃描整個表,因此延遲較高。另外一個導致Hive執行延遲高的因素是MapReduce框架
(7)可擴展性
(8)數據規模。
hive幾種基本表類型:內部表、外部表、分區表、桶表
內部表(管理表)和外部表的區別:

創建表
外部表創建表的時候,不會移動數到數據倉庫目錄中(/user/hive/warehouse),只會記錄表數據存放的路徑
內部表會把數據複製或剪切到表的目錄下
刪除表
外部表在刪除表的時候只會刪除表的元數據信息不會刪除表數據
內部表刪除時會將元數據信息和表數據同時刪除
表類型一、管理表或內部表Table Type: MANAGED_TABLE

create table if not exists dept(
deptno int,
deptname string,
address string
)
row  format delimited fields terminated by '\t';

//載入HDFS文件到Hive表中
load data inpath '/input/dept.txt' into table dept;

//用來指定原文件的列分隔符
row  format delimited fields terminated by '\t';
load 如果操作的HDFS上的文件,代表著會移動或者剪切文件

desc formatted dept;  //描述表結構信息
Location:               hdfs://bigdata/user/hive/warehouse/db01.db/dept  
Table Type:             MANAGED_TABLE 

 


表類型二、外部表

create  external table emp(
empno int,
empname string,
empjob string,
mgno int,
birthday string,
salary float,
bonus float,
depno int
)
row  format delimited fields terminated by '\t'
location '/input/demo';

//描述表結構
desc formatted emp;
Location:               hdfs://bigdata/input/demo    
Table Type:             EXTERNAL_TABLE

刪除內部表
drop table dept;

刪除外部表
drop table emp;

清空表數據
truncate table student;

 


表類型三、分區表

分區表創建表的時候需要指定分區欄位,分區欄位與普通欄位的區別:分區欄位會在HDFS表目錄下生成一個分區欄位名稱的目錄,而普通欄位則不會,查詢的時候可以當成普通欄位來使用,一般不直接和業務直接相關。

create  table emp_part(
 empno int,
 empname string,
 empjob string,
 mgrno int,
 birthday string,
 salary float,
 bonus float,
 deptno   int
 )
 partitioned by (province string)
row format delimited fields terminated by '\t';

//向分區表載入數據
load data local inpath '/home/user01/emp.txt' into table emp_part partition (province='CHICAGO');

//描述表信息
desc formatted  emp_part;

//查詢全表數據
select * from emp_part;

//查詢分區欄位表數據
select * from emp_part where province='CHICAGO';

//查看分區信息
show partitions emp_part;

//增加分區
aler table emp_part add [if not exist] partition(provine='zhejiang',city='hangzhou')

//刪除分區
aler table emp_part drop [if  exist] partition(provine='zhejiang',city='hangzhou')

 


外部分區表

create external  table  dept_part(
deptno int,
deptname string,
address string
)
partitioned by (province string)
row  format delimited fields terminated by '\t'
location '/input/demo';

//手動增加分區欄位及外部目錄:
alter table dept_part add partition (province='BOSTON') location '/input/demo/BOSTON';

//手動增加分區欄位(自動生成分區目錄)
alter table dept_part add partition (province='NEW YORK');


表類型四:桶表

將內部表,外部表和分區表進一步組織成桶表
可以將表的列通過Hash演算法進一步分解成不同的文件存儲

create table test_bucket_table(
id int,
name string
)
clustered by (id) into 5 bucket;


創建表的方式
方式一 create + load

create [external] table table_name(
    col1_name col1_type,
    ...
    coln_name coln_type
    )
    row  format delimited fields terminated  by '\t';

   //load載入數據
    laod data [local] inpth '本地文件(linux)/HDFS' [overwrite] into table  table_name;

方式二 like + load

//複製表結構
    create table tableB like tableA;    //首先必須要有tableA

//load載入數據
    laod data [local] inpth '本地文件(linux)/HDFS' [overwrite] into table  table_name;

 


方式三 as 創建表的同時載入數據

create table emp_insert(
id int,
name string,
job string,
salary float
)
row format  delimited fields terminated by ',';

//insert into 載入數據
insert into table emp_insert select empno,empname,empjob,salary from emp_part1 where day='20170308' and  hour='14';

方式四 create + insert

//創建表

create table emp_insert(
id int,
name string,
job string,
salary float
)
row format  delimited fields terminated by ',';

//insert into 載入數據
insert into table emp_insert select empno,empname,empjob,salary from emp_part1 where day='20170308' and  hour='14';


載入數據的方式
載入方式一

//載入本地文件到Hive表   --使用存儲介質(移動硬碟)
laod data local inpth '本地文件(linux)' [overwrite] into table  table_name;

載入方式二

//創建表時通過select查詢語句載入數據
 create table tableB row format delimited filelds termianted by ','  as select * from tableA;  

 


載入方式三

//創建表時通過select查詢語句載入數據
 create table tableB row format delimited filelds termianted by ','  as select * from tableA;  


載入方式四

//創建表時通過select查詢語句載入數據
 create table tableB row format delimited filelds termianted by ','  as select * from tableA;  


載入方式五

//先創建表,通過insert into table table_namea  select  *  fom tableB


載入方式六

<property>
  <name>hive.fetch.task.conversion</name>
  <value>more</value>
  <description>
    Some select queries can be converted to single FETCH task
    minimizing latency.Currently the query should be single
    sourced not having any subquery and should not have
    any aggregations or distincts (which incurrs RS),
    lateral views and joins.
    1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
    2. more    : SELECT, FILTER, LIMIT only (+TABLESAMPLE, virtual columns)
  </description>
</property>



幾種導出數據的方式

    1.insert overwrite ... 導出到本地目錄
     insert overwrite local directory '/home/user01/export' row format delimited fields terminated by ' ' select * from emp_part1;

    2.insert overwrite ... 導出到HDFS之上
    insert overwrite directory '/export' select * from emp_part1 where day='20170308';

    3.hive -e 'HQL query'  >> test
    bin/hive -e 'select * from db01.student' >> test.txt

    4)sqoop


Hive 自定義函數函數

UDF 一進一齣 處理原文件內容某些欄位包含 [] “”
UDAF 多進一齣 sum() avg() max() min()
UDTF 一進多出 ip -> 國家 省 市
Hive4種排序

    order by //可以指定desc 降序 asc 升序
    order by會對輸入做全局排序,因此只有一個Reducer(多個Reducer無法保證全局有序),然而只有一個Reducer,會導致當輸入規模較大時,消耗較長的計算時間。

    sort by 【對分區內的數據進行排序】
    sort by不是全局排序,其在數據進入reducer前完成排序,因此,如果用sort by進行排序,並且設置mapred.reduce.tasks>1,則sort by只會保證每個reducer的輸出有序,並不保證全局有序。sort by不同於order by,它不受Hive.mapred.mode屬性的影響,sort by的數據只能保證在同一個reduce中的數據可以按指定欄位排序。使用sort by你可以指定執行的reduce個數(通過set mapred.reduce.tasks=n來指定),對輸出的數據再執行歸併排序,即可得到全部結果。

    distribute by 【對map輸出進行分區】
    distribute by是控制在map端如何拆分數據給reduce端的。hive會根據distribute by後面列,對應reduce的個數進行分發,預設是採用hash演算法。sort by為每個reduce產生一個排序文件。在有些情況下,你需要控制某個特定行應該到哪個reducer,這通常是為了進行後續的聚集操作。distribute by剛好可以做這件事。因此,distribute by經常和sort by配合使用。

    cluster by
    cluster by除了具有distribute by的功能外還兼具sort by的功能。當distribute by和sort by 是同一個欄位的時候可以使用cluster by替代。但是排序只能是倒敘排序,不能指定排序規則為ASC或者DESC。

三種分組的區別

    row_number:不管col2欄位的值是否相等,行號一直遞增,比如:有兩條記錄的值相等,但一個是第一,一個是第二
    rank:上下兩條記錄的col2相等時,記錄的行號是一樣的,但下一個col2值的行號遞增N(N是重覆的次數),比如:有兩條併列第一,下一個是第三,沒有第二
    dense_rank:上下兩條記錄的col2相等時,下一個col2值的行號遞增1,比如:有兩條併列第一,下一個是第二

Hive優化

    1.fetch task任務不走MapReduce,可以在hive配置文件中設置最大化和最小化fetch task任務;通常在使用hiveserver2時調整為more;

設置參數的優先順序:在命令行或者代碼設置參數 > hive-site.xml>hive-default.xml
 set hive.fetch.task.conversion=more;   //單次交互模式下有效,
 bin/hive --hiveconf hive.fetch.task.conversion=more

上面的兩種方法都可以開啟了Fetch任務,但是都是臨時起作用的;如果你想一直啟用這個功能,可以在${HIVE_HOME}/conf/hive-site.xml裡面加入以下配置:

<property>
  <name>hive.fetch.task.conversion</name>
  <value>more</value>
  <description>
    Some select queries can be converted to single FETCH task
    minimizing latency.Currently the query should be single
    sourced not having any subquery and should not have
    any aggregations or distincts (which incurrs RS),
    lateral views and joins.
    1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
    2. more    : SELECT, FILTER, LIMIT only (+TABLESAMPLE, virtual columns)
  </description>
</property>

 
    2.strict mode:嚴格模式設置,嚴格模式下將會限制一些查詢操作
    文件格式,ORC PARQUET 等
    分區表
    select 查詢不加where過濾條件,不會執行

開啟嚴格模式
hive提供的嚴格模式,禁止3種情況下的查詢模式。
a:當表為分區表時,where字句後沒有分區欄位和限制時,不允許執行。
b:當使用order by語句時,必須使用limit欄位,因為order by 只會產生一個reduce任務。
c:限制笛卡爾積的查詢。sql語句不加where不會執行

<property>
  <name>hive.mapred.mode</name>
  <value>nonstrict</value>
  <description>The mode in which the Hive operations are being performed.
     In strict mode, some risky queries are not allowed to run. They include:
       Cartesian Product.
       No partition being picked up for a query.
       Comparing bigints and strings.
       Comparing bigints and doubles.
       Orderby without limit.
  </description>
</property>

 


    3.優化sql語句,如先過濾再join,先分組再做distinct;

Select count(*) cnt
From store_sales ss
     join household_demographics hd on (ss.ss_hdemo_sk = hd.hd_demo_sk)
     join time_dim t on (ss.ss_sold_time_sk = t.t_time_sk)
     join store s on (s.s_store_sk = ss.ss_store_sk)
Where
     t.t_hour = 8
     t.t_minute >= 30
     hd.hd_dep_count = 2
order by cnt;

 


    4.MapReduce過程的map、shuffle、reduce端的snappy壓縮

    需要先替換hadoop的native本地包開啟壓縮
    在mapred-site.xml文件設置啟用壓縮及壓縮編碼
    在執行SQL執行時設置啟用壓縮和指定壓縮編碼

set mapreduce.output.fileoutputformat.compress=true;
set mapreduce.output.fileoutputformat.compress.codec=org apache.hadoop.io.compress.SnappyCodec;


    5.大表拆分成子表,提取中間結果集,減少每次載入數據
    多維度分析,多個分析模塊
    每個分析模塊涉及欄位不一樣,而且並不是表的全部欄位

    6.分區表及外部表
    設計二級分區表(一級欄位為天,二級欄位設置小時)
    創建的的是外部表,創建表時直接指定數據所在目錄即可,不用再用load載入數據

    7.設置map和reduce個數:預設情況下一個塊對應一個map任務,map數據我們一般不去調整,reduce個數根據reduce處理的數據量大小進行適當調整體現“分而治之”的思想

hive-site.xml
hive.mapred.reduce.tasks.speculative.execution=true;
<property>
  <name>hive.mapred.reduce.tasks.speculative.execution</name>
  <value>true</value>
  <description>Whether speculative execution for reducers should be turned on. </description>
</property>

 


    8.JVM重用:一個job可能有多個map reduce任務,每個任務會開啟一個JVM虛擬機,預設情況下一個任務對應一個JVM,任務運行完JVM即銷毀,我們可以設置JVM重用參數,一般不超過5個,這樣一個JVM內可以連續運行多個任務

JVM重用是Hadoop調優參數的內容,對Hive的性能具有非常大的影響,特別是對於很難避免小文件的場景或者task特別多的場景,這類場景大多數執行時間都很短。hadoop預設配置是使用派生JVM來執行map和reduce任務的,這是jvm的啟動過程可能會造成相當大的開銷,尤其是執行的job包含有成千上萬個task任務的情況。
JVM重用可以使得JVM實例在同一個JOB中重新使用N次,N的值可以在Hadoop的mapre-site.xml文件中進行設置(建議參考5~10)
mapred.job.reuse.jvm.num.tasks(舊版)
mapreduce.job.jvm.numtasks(新版)
hadoop.apache.org/docs/r2.5.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
http://hadoop.apache.org/docs/r2.5.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

也可在hive的執行設置:

hive-site.xml
hive.mapred.reduce.tasks.speculative.execution=true;
<property>
  <name>hive.mapred.reduce.tasks.speculative.execution</name>
  <value>true</value>
  <description>Whether speculative execution for reducers should be turned on. </description>
</property>

 
    9.推測執行:例如一個Job應用有10個MapReduce任務(map 及reduce),其中9個任務已經完成,那麼application Master會在另外啟動一個相同的任務來運行未完成的那個,最後哪個先運行完成就把另一個kill掉

    啟用speculative最大的好處是,一個map執行的時候,系統會在其他空閑的伺服器上啟動相同的map來同時運行,哪個運行的快就使用哪個的結果,另一個運行慢的在有了結果之後就會被kill。

hive-site.xml
hive.mapred.reduce.tasks.speculative.execution=true;
<property>
  <name>hive.mapred.reduce.tasks.speculative.execution</name>
  <value>true</value>
  <description>Whether speculative execution for reducers should be turned on. </description>
</property>


數據傾斜

對於普通的join操作,會在map端根據key的hash值,shuffle到某一個reduce上去,在reduce端做join連接操作,記憶體中緩存join左邊的表,遍歷右邊的表,依次做join操作。所以在做join操作時候,將數據量多的表放在join的右邊。

當數據量比較大,並且key分佈不均勻,大量的key都shuffle到一個reduce上了,就出現了數據的傾斜。

常見的數據傾斜出現在group by和join..on..語句中。

join(數據傾斜)
在進行兩個表join的過程中,由於hive都是從左向右執行,要註意講小表在前,大表在後(小表會先進行緩存)。

map/reduce程式執行時,reduce節點大部分執行完畢,但是有一個或者幾個reduce節點運行很慢,導致整個程式的處理時間很長,這是因為某一個key的條數比其他key多很多(有時是百倍或者千倍之多),這條key所在的reduce節點所處理的數據量比其他節點就大很多,從而導致某幾個節點遲遲運行不完,此稱之為數據傾斜。hive在跑數據時經常會出現數據傾斜的情況,使的作業經常reduce完成在99%後一直卡住,最後的1%花了幾個小時都沒跑完,這種情況就很可能是數據傾斜的原因,

hive.groupby.skewindata=true; 

如果是group by過程出現傾斜應將此項設置true。
<property>
  <name>hive.groupby.skewindata</name>
  <value>false</value>
  <description>Whether there is skew in data to optimize group by queries</description>
</property>

hive.optimize.skewjoin.compiletime=true;

如果是join 過程中出現傾斜應將此項設置為true
不影響結果可以考慮過濾空值
<property>
  <name>hive.optimize.skewjoin.compiletime</name>
  <value>false</value>
</property> 

hive.optimize.skewjoin.compiletime=true; 如果是join過程出現傾斜應該設置為true
此時會將join語句轉化為兩個mapreduce任務,第一個會給jion欄位加隨機散列
set hive.skewjoin.key=100000; 這個是join的鍵對應的記錄條數超過這個值則會進行優化。

可以在空值前面加隨機散列
3種常見的join
Map-side Join

mapJoin的主要意思就是,當鏈接的兩個表是一個比較小的表和一個特別大的表的時候,我們把比較小的table直接放到記憶體中去,然後再對比較大的表格進行map操作。join就發生在map操作的時候,每當掃描一個大的table中的數據,就要去去查看小表的數據,哪條與之相符,繼而進行連接。這裡的join並不會涉及reduce操作。map端join的優勢就是在於沒有shuffle,真好。在實際的應用中,我們這樣設置:
***1. set hive.auto.convert.join=true;
這樣設置,hive就會自動的識別比較小的表,繼而用mapJoin來實現兩個表的聯合。看看下麵的兩個表格的連接。

<property>
  <name>hive.auto.convert.join.noconditionaltask.size</name>
  <value>10000000</value> The default is 10MB
 </property>


DistributedCache是分散式緩存的一種實現,它在整個MapReduce框架中起著相當重要的作用,他可以支撐我們寫一些相當複雜高效的分散式程

這裡的第一句話就是運行本地的map join任務,繼而轉存文件到XXX.hashtable下麵,在給這個文件裡面上傳一個文件進行map join,之後才運行了MR代碼去運行計數任務。說白了,在本質上mapjoin根本就沒有運行MR進程,僅僅是在記憶體就進行了兩個表的聯合。

mapjoin使用場景
1.關聯操作中有一張表非常小
2.不等值的鏈接操作

自動執行

set hive.auto.convert.join=true;
hive.mapjoin.smalltable.filesize=25;預設值是25mb  
<property>
  <name>hive.mapjoin.smalltable.filesize</name>
  <value>25000000</value>
 </property>


手動執行 A為小表 如果A表超過25M,還想使用map join;
select /+mapjoin(A)/ f.a,f.b from A t join B f on(f.a==t.a)

hive入門學習:join的三種優化方式 - HAHA的專欄 - 博客頻道 - CSDN.NET
http://blog.csdn.net/liyaohhh/article/details/50697519
Reduce-side Join

***hive join操作預設使用的就是reduce join
Reduce-side Join原理上要簡單得多,它也不能保證相同key但分散在不同dataset中的數據能夠進入同一個Mapper,整個數據集合的排序
在Mapper之後的shuffle過程中完成。相對於Map-side Join,它不需要每個Mapper都去讀取所有的dataset,這是好處,但也有壞處,
即這樣一來Mapper之後需要排序的數據集合會非常大,因此shuffle階段的效率要低於Map-side Join。
***reduce side join是一種最簡單的join方式,其主要思想如下:
在map階段,map函數同時讀取兩個文件File1和File2,為了區分兩種來源的key/value數據對,對每條數據打一個標簽(tag)

semi join 小表對大表 是reudce join的變種 map階段過濾掉不需要join的欄位 相當於Hivw SQL加的where過濾
SMB Join(sort merge bucket)

SMB 存在的目的主要是為瞭解決大表與大表間的 Join 問題,分桶其實就是把大表化成了“小表”,然後 Map-Side Join 解決之,這是典型的分而治之的思想。

1 set hive.enforce.bucketing=true;
2 set hive.enforce.sorting=true;


表優化數據目標:相同數據儘量聚集在一起


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.創建文件夾:mkdir 文件夾名稱 2.查看IP地址信息:ipconfig -a 3.查看記憶體使用情況:free -m 4.查看CPU使用情況:top 5.查看磁碟使用情況:df -a/-h 6.查看當前文件夾大小:du -sh 7.創建文件:touch -linux.sh(空白文件) cat> ...
  • 文件許可權 瞭解文件許可權前需要先知道用戶和用戶組的概念 用戶:https://www.cnblogs.com/holmes-cat/p/10345553.html用戶組:https://www.cnblogs.com/holmes-cat/p/10346842.html 1.使用 ll -a 命令可以 ...
  • 發佈與訂閱模型在許多編程語言中都有實現,也就是我們經常說的設計模式中的一種--觀察者模式。在一些應用場合,例如發送方並不是以固定頻率發送消息,如果接收方頻繁去咨詢發送方,這種操作無疑是很麻煩並且不友好的。 舉個生活的例子,一個喜歡購買鮮牛奶的人,需要每天在上班的時候/下班的時候都專門去牛奶店購買鮮牛 ...
  • 對MySQL有研究的讀者,可能會發現MySQL更新很快,在安裝方式上,MySQL提供了兩種經典安裝方式:解壓式和一鍵式,雖然是兩種安裝方式,但我更提倡選擇解壓式安裝,不僅快,還乾凈。在操作系統上,MySQL也支持多類型操作系統,如linux,windows等,如下為MySQL幾個重大變化的操作系統。 ...
  • --1.創建臨時空間 create temporary tablespace zyj_temp tempfile 'D:\app2\user\virtual\oradata\orcl\zyj_temp.dbf' size 50m autoextend on next 50m maxsize 2048... ...
  • 1. WordCount程式 1.1 WordCount源程式 1.2 運行程式,Run As->Java Applicatiion 1.3 編譯打包程式,產生Jar文件 2 運行程式 2.1 建立要統計詞頻的文本文件 wordfile1.txt Spark Hadoop Big Data word ...
  • 第二章 shanzm [TOC] 第二章 查詢結果排序 2.1 以指定順序返回查詢結果 問題: 你想顯示部門編號為 10 的員工的名字、職位和工資,並根據工資從低到高排序。 解決方案: 使用 代碼如下: 當然你可以使用多欄位排序 比如先按照sal升序排序,然自後按照入職日期降序排列 【註意】 1. ...
  • --以下幾個為相關表SELECT * FROM v$lock;SELECT * FROM v$sqlarea;SELECT * FROM v$session;SELECT * FROM v$process ;SELECT * FROM v$locked_object;SELECT * FROM al ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...