主頁 > 後端開發 > 訊息推送平臺的實時數倉?!flink消費kafka訊息入到hive

訊息推送平臺的實時數倉?!flink消費kafka訊息入到hive

2023-05-11 07:32:30 後端開發

大家好,3y啊,好些天沒更新了,并沒有偷懶,只不過一直在安裝環境,差點都想放棄了,

上一次比較大的更新是做了austin的預覽地址,把企業微信的應用和機器人訊息各種的訊息型別和功能給完善了,上一篇文章也提到了,austin常規的功能已經更新得差不多了,剩下的就是各種細節的完善,

不知道大家還記不記得我當時規劃austin時,所畫出的架構圖:

現在就剩下austin-datahouse這個模塊沒有實作了,也有挺多同學在看代碼的時候問過我這個模塊在哪...其實就是還沒實作,先規劃,牛逼先吹出去(互聯網人必備技能)

訊息推送平臺??推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別

  • https://gitee.com/zhongfucheng/austin/
  • https://github.com/ZhongFuCheng3y/austin

至于這個模塊吧,我預想它的功能就是把austin相關的實時資料寫到資料倉庫里,一方面是做資料備份,另一方面是大多數的報表很多都得依賴資料倉庫去做,實際上,生產環境也會把相關的資料寫到數倉中,

而在公司里,要把資料寫到資料倉庫,這事對開發來說一般很簡單,因為有數倉這個東西,那大多數都會有相關的基礎建設了,對于開發而言,可能就是把日志資料寫到Kafka,在相關的后臺配置下這個topic,就能將這個topic的資料同步到資料倉庫里咯,如果是資料庫的話,那應該大資料平臺有同步資料的功能,對普通開發來說也就配置下表名就能同步到資料倉庫里咯,

反正使用起來很簡單就是了,不過,我其實不知道具體是怎么做的,

但是不要緊啊,反正開源專案對于時間這塊還是很充裕得啊:沒有deadline,沒有產品在隔壁催我寫,沒有相關的技術要跟我對接,那我不懂可以學,于是也花了幾天看了下數倉這塊內容,

在看數倉的同時,我之前在公司經常會聽到資料湖這個詞,我剛畢業的時候是沒聽過的,但這幾年好像這個概念就火起來了,跟大資料那邊聊點事的時候,經常會聽到:資料入湖

那既然看都看了,順便了解資料湖是個什么東西吧?對著瀏覽器一輪檢索之后,我發現這個詞還是挺抽象的,一直沒找到讓我耳目一新的答案,這個資料湖也不知道怎么就火起來了,我瀏覽了一遍之后,我大概可以總結出什么是資料湖,跟資料倉庫有啥區別:

1、資料倉庫是存盤結構化的資料,而資料湖是什么資料都能存(非結構化的資料也能存),結構化資料可以理解為我們的二維表JSON資料,非結構化的資料可以理解為影像檔案之類的,

資料倉庫在寫入的時候,就要定義好schema了,而資料湖在寫入的時候不需要定schema,可以等用到的時候再查出來,強調這點,說明資料湖對資料的schema約束更加靈活,

2、資料倉庫和資料湖并不是替代關系,資料是先進資料湖,將資料加工(ETL)之后,一部分資料會到資料倉庫中,

3、我們知道現有的資料倉庫一般基于Hadoop體系的HDFS分布式檔案系統去搭建的,而資料湖也得存盤資料的嘛,一般也是依賴HDFS,

4、開源的資料湖技術比較出名的有hudiicebergDelta Lake

看完上面的描述,是不是覺得有點空泛,看似學到了很多,但是實際還是不知道資料湖有啥牛逼之處,嗯,我也是這么想的,總體下來,感覺資料湖就相當于資料倉庫的ODS,圍繞著這些資料定義了對應的meta資訊,做元資料的管理,

說到ODS這個詞了,就簡單聊下資料倉庫的分層結構吧,這個行業通用的,一般分為以下:

1、ODS(Operate Data Store),原始資料層,未經過任何加工的,

2、DIM(Dictionary Data Layer),維度資料層,比如存盤地域、用戶客戶端這些維度的資料,

3、DWD(Data Warehouse Detail),資料明細層,把原始資料經過簡單的加工(去除臟資料,空資料之后就得到明細資料),

4、DWS(Data Warehouse Service),資料維度匯總層,比如將資料明細根據用戶維度做匯總得到的匯總之后的資料,

5、ADS(Application Data Store),資料應用層,這部分資料能給到后端以介面的方式給到前端做可視化使用了,

至于為什么要分層,跟當初我們理解DAO/Service/Controller的思想差不多,大概就是復用便于后續修改變動

扯了那么多吧,聊會ausitn專案吧,我是打算怎么做的呢?因為我的實時計算austin-stream模塊是采用Flink去做的,我打算austin-datahouse也是采用flink去做,

這幾年在大資料領域湖倉一體流批一體這些概念都非常火,而對于austin來說,第一版迭代還不用走得這么急,我目前的想法是利用flinktableapi去對接Hive,通過SupersetMetabaseDataEase 其中一個開源的大資料可視化工具Hive的資料給讀取出來,那第一版就差不多完成了,

現狀

自從我決定開始寫austin-data-house資料倉庫模塊,已經過了兩周有多了,這兩周多我都在被部署安裝環境折磨,中途有很多次就想放棄了,

我初學編程,到現在作業了幾年,我還是沒變,一如既往地討厭安裝環境

花了這么長時間除錯安裝部署環境,實作的功能其實很簡單:消費Kafka的訊息,寫入hive,(我在寫全鏈路追蹤功能實時引擎用的是flink,為了技術架構統一,我還是希望通過flink來實作,)

flink1.9開始支持hive,到目前為止,flink穩定的版本在1.16.0flink支持hive也就這兩年的事,

austin所依賴的組件有很多(正常線上環境都會有這些組件,只是不用我們自己搭建而已),各種組件的環境問題被我一一征服了,但有很大程度上的功勞是在docker-compose上,

說到資料倉庫,第一時間肯定是想到hive,雖然我沒裝過hadoop/hive/hdfs大資料相關的組件,但稍微想想這都是復雜的,那安裝hive自然就會想到有沒有docker鏡像,一鍵安裝可多爽啊,

之前接入的flink也是跑在docker上的,把hive也找個鏡像,兩者融合融合不就行了嘛?

想法很好,我就開干了,

基礎知識

flinkhive融合,實際上是借助hive catalog來打通hivehive catalog對接著hive metastore(hive存盤元資料的地方),

當我們使用flink創建出的元資料,會經由hive catalog 最終持久化到hive metastore,同時我們會利用hive catalog提供的介面對hive進行寫入和讀取,

來源:https://blog.51cto.com/u_15105906/5849229

安裝hive環境

那時候簡單搜了下,還真被我找到了hive的鏡像,沒想到這么幸運,還是支持docker-compose的,一鍵安裝,美滋滋,

https://github.com/big-data-europe/docker-hive

我就簡單復述下程序吧,比較簡單:

1、把倉庫拉到自己的服務器上

git clone [email protected]:big-data-europe/docker-hive.git

2、進入到專案的檔案夾里

cd docker-hive

3、啟動專案

docker-compose up -d

一頓下載之后,可以發現就啟動成功了,通過docker ps 命令就看到運行幾個鏡像了,

沒錯,這就安裝好hive了,是不是非常簡單,具體啟動了什么,我們可以簡單看下docker-compose.yml檔案的內容,

最后,我們可以連上hive的客戶端,感受下快速安裝好hive的成功感,

# 進入bash
docker-compose exec hive-server bash

# 使用beeline客戶端連接
/opt/hive/bin/beeline -u jdbc:hive2://localhost:10000

深陷迷霧

hive安裝好了之后,我就馬不停蹄地想知道怎么跟flink進行融合了,我就搜了幾篇博客看個大概,后來發現大多數博客的內容其實就是翻譯了flink官網的內容,

不過,翻博客的程序中讓我大致了解了一點:如果我要使用flink連接hive,那我要手動flink連接hivejar包匯入到flink/lib目錄下,

說實話,這還是比較麻煩的,我還以為只需要在我的工程里匯入相關的依賴就好了,沒想到還得自己手動把jar包下來下來,然后傳入到flink的安裝目錄下,

我吭哧吭哧地做了,但把我寫好的工程jar包傳上去提交給jobmanager不是缺這就是少那依賴,我相信我能搞掂,反正就是版本依賴的問題嘛,我在行的,

后面又發現在flink工程專案里用maven引入hadoop依賴是不夠的,flink新版本里默認打的鏡像是沒有hadoop的,要手動在flink環境目錄下引入hadoop,這個也是麻煩的,但只要我在鏡像里下載些環境,也不是不能干,

1、安裝vim

apt-get update

apt-get install vim

2、安裝hadoop

2.1、下載hadoop

wget https://archive.apache.org/dist/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz

2.2、解壓hadoop

tar -zxf hadoop-2.7.4.tar.gz

2.3、配置環境變數

vim /etc/profile
export HADOOP_HOME=/opt/hadoop-2.7.4
export PATH=$HADOOP_HOME/bin:$PATH
export HADOOP_CLASSPATH=`hadoop classpath`
source /etc/profile

2.4、在flink的docker容器里還得把.bashrc也得改了才生效

過于樂觀的我,搞了10天左右吧,終于頂不住了,下定決心:我一定要統一版本,不能修修補補了,該什么版本就走什么版本,推倒從來吧,我就按著flink官網來走,一步一步走下來不可能錯的吧!

flink最新的版本是v1.17-SNAPSHOT,那我就挑上一個穩定的版本就行了!順便一看,我之前寫全鏈路追蹤austin接入flink的時候,代碼的還是14.3版本,但管不了這么多了,就用1.16.0版本吧,

首先,我發現我的flink鏡像拉取的是最新的版本image: flink:latest,那我得找1.16.0版本的docker-compose來部署,版本就得統一,后面的事才好搞,這個好找,在官網很快就找到了:image: flink:1.16.0-scala_2.12

新的鏡像搞下來了以后,我又吭哧地把相關的jar都手動地匯入到flink容器里,另外,我發現官網寫的pom依賴,壓根就下載不下來的,這不對勁啊

<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-table-api-java-bridge_2.12</artifactId>
  <version>1.16.0</version>
  <scope>provided</scope>
</dependency>

我開始以為是我的maven倉庫配置問題,找遍了倉庫在那個artifactId下,最大的也就只有1.14.x的版本,去找了下flinkissue,發現有人跟我一樣的問題,

https://github.com/apache/flink/pull/21553

繼續嘗試提交我自己寫好的flink.jar,毫無意外地,又報錯了,有些是之前的報錯,我很快地就能解決掉,

我一想,意識到是哪里沒做好了:hive的版本,hadoop的版本,flink的版本這三者也要約束,那我轉頭一看,發現之前我從鏡像里拉下來hive版本是2.3.2,里面裝的hadoop版本是2.7.4,于是,我又統一了這三者的版本,信心很足,感覺一定能成,

再次提交,還是有問題,瘋狂Google但就是一直找不到解決方案,能查出來的資料,網上的全都是“原始”安裝部署的,就沒有通過flink docker鏡像跟hive融合的,而且也不是跨機器的(給出來的案例都是在同一臺機器上,我是hive部署一臺機器上,flink部署在另一臺機器上),

花了幾天除錯還是解決不掉,怎么搞呢?放棄又不甘心,咋整?繼續推倒重來唄

在使用flink容器除錯的程序中我已經發現了:

1、拉下來的docker鏡像里的內容,跟官網所描述的jar包是有出入的,有的是要我手動去下載的,但當時我覺得既然版本已經限定了,那應該問題也不大,

2、hadoop環境變數在flink docker 容器下很難除錯,每次重新推倒從來的時候,我都得手動配置一次,步驟也繁瑣,即便我掛載了相關的jar包和整個目錄

3、flink容器內重啟和啟動集群環境不可控,老是出現奇奇怪怪的問題,

那這一次,我就不用docker-compose部署flink了,直接在centos安裝部署flink,繼續整,

隨著我每一次推倒重來,我就覺得我離成功越來越近越來越近,從環境變數報錯缺失CALSS_PATH的問題,已經到了sql的語法的問題,從sql語法的問題到找不到遠程地址namenode can't found的問題,從遠程地址的問題,到HDFS呼叫不通的問題,最后,終于除錯成功了,

下面就記錄我能除錯成功的安裝程序,各種坑錯誤例外就不記錄了(篇幅問題),這里也吐槽夠了,

安裝flink環境

1、下載flink壓縮包

wget https://dlcdn.apache.org/flink/flink-1.16.0/flink-1.16.0-bin-scala_2.12.tgz

2、解壓flink

tar -zxf flink-1.16.0-bin-scala_2.12.tgz

3、修改該目錄下的conf下的flink-conf.yaml檔案中rest.bind-address配置,不然遠程訪問不到8081埠,將其改為0.0.0.0

rest.bind-address: 0.0.0.0

4、將flink官網提到連接hive所需要的jar包下載到flinklib目錄下(一共4個)

wget https://repo.maven.apache.org/maven2/org/apache/flink/flink-sql-connector-hive-2.3.9_2.12/1.16.0/flink-sql-connector-hive-2.3.9_2.12-1.16.0.jar

wget https://repo.maven.apache.org/maven2/org/apache/hive/hive-exec/2.3.4/hive-exec-2.3.4.jar

wget https://repo.maven.apache.org/maven2/org/apache/flink/flink-connector-hive_2.12/1.16.0/flink-connector-hive_2.12-1.16.0.jar 

wget https://repo.maven.apache.org/maven2/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar

5、按照官網指示把flink-table-planner_2.12-1.16.0.jarflink-table-planner-loader-1.16.0.jar 這倆個jar包移動其目錄;

mv $FLINK_HOME/opt/flink-table-planner_2.12-1.16.0.jar $FLINK_HOME/lib/flink-table-planner_2.12-1.16.0.jar
mv $FLINK_HOME/lib/flink-table-planner-loader-1.16.0.jar $FLINK_HOME/opt/flink-table-planner-loader-1.16.0.jar

6、把后續kafka所需要的依賴也下載到lib目錄下

wget https://repo1.maven.org/maven2/org/apache/flink/flink-connector-kafka/1.16.0/flink-connector-kafka-1.16.0.jar

wget https://repo1.maven.org/maven2/org/apache/kafka/kafka-clients/3.3.1/kafka-clients-3.3.1.jar

安裝hadoop環境

由于hive的鏡像已經鎖死了hadoop的版本為2.7.4,所以我這邊flink所以來的hadoop也是下載2.7.4版本

1、下載hadoop壓縮包

wget https://archive.apache.org/dist/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz

2、解壓hadoop

tar -zxf hadoop-2.7.4.tar.gz

安裝jdk11

由于高版本的flink需要jdk 11,所以這邊安裝下該版本的jdk

yum install java-11-openjdk.x86_64
yum install java-11-openjdk-devel.x86_64

配置jdk、hadoop的環境變數

這一步為了能讓flink在啟動的時候,加載到jdkhadoop的環境,

1、編輯/etc/profile檔案

vim /etc/profile

2、檔案內容最底下增加以下配置:

JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.17.0.8-2.el7_9.x86_64
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
export HADOOP_HOME=/root/hadoop-2.7.4
export PATH=$HADOOP_HOME/bin:$PATH
export HADOOP_CLASSPATH=`hadoop classpath`

3、讓組態檔生效

source /etc/profile

austin資料倉庫工程代碼

直接上austin倉庫地址,文章篇幅就不貼代碼了,該寫的注釋我都寫了,

http://gitee.com/zhongfucheng/austin

這個工程代碼量非常少,一共就4個核心檔案pom.xml/hive-site.xml/AustinHiveBootStrap.java,要使用的時候注意該兩處地方即可:

1、com.java3y.austin.datahouse.constants.DataHouseConstant#KAFKA_IP_PORT將這里改成自己的kafkaipport

2、hive-site.xml檔案全域替換掉hive_ip為自己的hive地址,一共兩處

我們把jar包上傳到服務器,然后使用命令提交jar包給flink執行,也可以打開flink的管理后臺,在頁面上提交jar包并啟動,我這里就選擇使用命令的方式來提交,主要因為在外網透出flink的埠,很容器被攻擊(我已經重裝系統幾次了,,)

(flink命令在$FLINK_HOME/bin下)

./start-cluster.sh
./flink run austin-data-house-0.0.1-SNAPSHOT.jar

啟動Kafka生產者寫入測驗資料

啟動消費者的命令(將ipport改為自己服務器所部署的Kafka資訊):

$KAFKA_HOME/bin/kafka-console-producer.sh --topic austinTraceLog  --broker-list ip:port

輸入測驗資料:

{"state":"1","businessId":"2","ids":[1,2,3],"logTimestamp":"123123"}

即將成功

到這一步,離勝利就非常近了,但還是有通信的問題:flink無法識別namenode/namenodedatanode之間的通信問題等等,于是我們需要做以下措施:

1、hive在部署的時候,增加datanode/namenode的通信埠,部署hive使用這個docker-compose檔案的內容:

version: "3"

services:
  namenode:
    image: bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8
    volumes:
      - namenode:/hadoop/dfs/name
    environment:
      - CLUSTER_NAME=test
    env_file:
      - ./hadoop-hive.env
    ports:
      - "50070:50070"
      - "9000:9000"
      - "8020:8020"
  datanode:
    image: bde2020/hadoop-datanode:2.0.0-hadoop2.7.4-java8
    volumes:
      - datanode:/hadoop/dfs/data
    env_file:
      - ./hadoop-hive.env
    environment:
      SERVICE_PRECONDITION: "namenode:50070"
    ports:
      - "50075:50075"
      - "50010:50010"
      - "50020:50020"
  hive-server:
    image: bde2020/hive:2.3.2-postgresql-metastore
    env_file:
      - ./hadoop-hive.env
    environment:
      HIVE_CORE_CONF_javax_jdo_option_ConnectionURL: "jdbc:postgresql://hive-metastore/metastore"
      SERVICE_PRECONDITION: "hive-metastore:9083"
    ports:
      - "10000:10000"
  hive-metastore:
    image: bde2020/hive:2.3.2-postgresql-metastore
    env_file:
      - ./hadoop-hive.env
    command: /opt/hive/bin/hive --service metastore
    environment:
      SERVICE_PRECONDITION: "namenode:50070 datanode:50075 hive-metastore-postgresql:5432"
    ports:
      - "9083:9083"
  hive-metastore-postgresql:
    image: bde2020/hive-metastore-postgresql:2.3.0
    ports:
      - "5432:5432"
  presto-coordinator:
    image: shawnzhu/prestodb:0.181
    ports:
      - "8080:8080"
volumes:
  namenode:
  datanode:

2、在部署flink服務器上增加hosts,有以下(ip為部署hive的地址):

127.0.0.1 namenode
127.0.0.1 datanode
127.0.0.1 b2a0f0310722

其中 b2a0f0310722datanode的主機名,該主機名會隨著hivedocker而變更,我們可以登錄namenode的后臺地址找到其主機名,而方法則是在部署hive的地址輸入:

http://localhost:50070/dfshealth.html#tab-datanode

3、把工程下的hive-site.xml檔案拷貝到$FLINK_HOME/conf

4、hadoop的組態檔hdfs-site.xml增加以下內容(我的目錄在/root/hadoop-2.7.4/etc/hadoop

<property>
    <name>dfs.client.use.datanode.hostname</name>
    <value>true</value>
    <description>only cofig in clients</description>
</property>

5、啟動flink-sql的客戶端:

./sql-client.sh

6、在sql客戶端下執行以下腳本命令,注:hive-conf-dir要放在$FLINK_HOME/conf

CREATE CATALOG my_hive WITH (
    'type' = 'hive',
    'hive-conf-dir' = '/root/flink-1.16.0/conf'
);
use catalog my_hive;
create database austin;

7、重啟flink集群

./stop-cluster.sh
./start-cluster.sh

8、重新提交執行flink任務

./flink run austin-data-house-0.0.1-SNAPSHOT.jar

資料可視化

到上面為止,我們已經把資料寫入到hive表了,我們是不可能每一次都在命令列視窗里查詢hive的資料,一般在公司里都會有可視化平臺供我們開發/數倉/資料分析師/運營 去查詢hive的資料,

我簡單看了幾個開源的可視化平臺:Superset/Metabase/DataEase,最后選擇了Metabase,無他,看著順眼一些,

部署Metabase很簡單,也是使用docker進行安裝部署,就兩行命令(后續我會將其加入到docker-compose里面),

docker pull metabase/metabase:latest
docker run -d -p 5001:3000 --name metabase metabase/metabase

完了之后,我們就可以打開5001埠到Metabase的后臺了,

我們可以在Metabase的后臺添加presto進而連接hive去查詢記錄,

這個presto服務我們在搭建hive的時候已經一起啟動了,所以這里直接使用就好了,

到這一步,我們就可以通過在頁面上寫sql把訊息推送程序中埋點的明細資料查詢出來

最后

這資料倉庫整個安裝環境和除錯程序確實折騰人,多次推倒重來(甚至不惜重裝系統重來),還好最后輸入Kafka一條訊息,在hive表里能看到一條記錄,能看到結果之后,折騰或許是值得的,

如果想學Java專案的,強烈推薦我的開源專案訊息推送平臺Austin(8K stars) ,可以用作畢業設計,可以用作校招,可以看看生產環境是怎么推送訊息的,開源專案訊息推送平臺austin倉庫地址:

訊息推送平臺??推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別

  • https://gitee.com/zhongfucheng/austin/
  • https://github.com/ZhongFuCheng3y/austin

參考資料:

  • https://nightlies.apache.org/flink/flink-docs-release-1.16/docs/connectors/table/hive/overview/
  • https://blog.51cto.com/u_15105906/5849229
  • https://blog.csdn.net/qq_38403590/article/details/126172610
更多的文章可往:文章的目錄導航

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/552103.html

標籤:其他

上一篇:Hibernate 基本操作、懶加載以及快取

下一篇:返回列表

標籤雲
其他(158773) Python(38125) JavaScript(25413) Java(18025) C(15225) 區塊鏈(8263) C#(7972) AI(7469) 爪哇(7425) MySQL(7175) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5338) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4570) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1972) 功能(1967) Web開發(1951) HtmlCss(1935) python-3.x(1918) 弹簧靴(1913) C++(1913) xml(1889) PostgreSQL(1875) .NETCore(1860) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • 訊息推送平臺的實時數倉?!flink消費kafka訊息入到hive

    大家好,3y啊。好些天沒更新了,并沒有偷懶,只不過一直在安裝環境,差點都想放棄了。 上一次比較大的更新是做了austin的預覽地址,把企業微信的應用和機器人訊息各種的訊息型別和功能給完善了。上一篇文章也提到了,austin常規的功能已經更新得差不多了,剩下的就是各種細節的完善。 不知道大家還記不記得 ......

    uj5u.com 2023-05-11 07:32:30 more
  • Hibernate 基本操作、懶加載以及快取

    上一篇咱們介紹了 Hibernate 以及寫了一個 Hibernate 的工具類,快速入門體驗了一波 Hibernate 的使用,我們只需通過 Session 物件就能實作資料庫的操作了。

    現在,這篇介紹使用 Hibernate 進行基本的 CRUD、懶加載以及快取的知識。 ......

    uj5u.com 2023-05-11 07:32:24 more
  • 【Visual Leak Detector】核心原始碼剖析(VLD 2.5.1)

    使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇對 VLD 2.5.1 原始碼做記憶體泄漏檢測的思路進行剖析。 ......

    uj5u.com 2023-05-11 07:32:18 more
  • 34基于Java的學生選課系統或學生課程管理系統

    基于java的學生課程管理系統,基于java的學生選課系統,javaWeb的學生選課系統,學生成績管理系統,課表管理系統,學院管理系統,大學生選課系統設計與實作,網上選課系統,課程成績打分。 ......

    uj5u.com 2023-05-11 07:32:13 more
  • 最佳實踐:路徑路由匹配規則的設計與實作

    本文設計并實作了一種專用于路徑路由匹配的規則,以一種簡單而通用的方式描述一組路徑的特征,來簡化這種場景路由描述難度,讓小白可以快速學習并上手。 ......

    uj5u.com 2023-05-11 07:25:44 more
  • 文盤Rust —— rust連接oss | 京東云技術團隊

    物件存盤是云的基礎組件之一,各大云廠商都有相關產品。這里跟大家介紹一下rust與物件存盤交到的基本套路和其中的一些技巧。 ......

    uj5u.com 2023-05-10 10:44:00 more
  • Java的抽象類 & 介面

    抽象類:在子類繼承父類時,父類的一些方法實作是不明確的(父類對子類的實作一無所知)。這時需要使父類是抽象類,在子類中提供方法的實作。

    介面(interface)技術主要用來描述類具有什么功能,而并不給出每個功能的具體實作。 ......

    uj5u.com 2023-05-10 10:38:48 more
  • 【11個適合畢設的Python可視化大屏】用pyecharts開發拖拽式可視

    你好,我是@馬哥python說,一枚10年程式猿。 一、效果演示 以下是我近期用Python開發的原創可視化資料分析大屏,非常適合畢設用,下面逐一展示:(以下是截圖,實際上有動態互動效果哦) 以下大屏均為@馬哥python說的個人原創,請勿轉載。 1.1 影視劇分析大屏 1.2 豆瓣電影分析大屏A ......

    uj5u.com 2023-05-10 10:27:16 more
  • 【11個適合畢設的Python可視化大屏】用pyecharts開發拖拽式可視

    你好,我是@馬哥python說,一枚10年程式猿。 一、效果演示 以下是我近期用Python開發的原創可視化資料分析大屏,非常適合畢設用,下面逐一展示:(以下是截圖,實際上有動態互動效果哦) 以下大屏均為@馬哥python說的個人原創,請勿轉載。 1.1 影視劇分析大屏 1.2 豆瓣電影分析大屏A ......

    uj5u.com 2023-05-10 10:25:24 more
  • Java的抽象類 & 介面

    抽象類:在子類繼承父類時,父類的一些方法實作是不明確的(父類對子類的實作一無所知)。這時需要使父類是抽象類,在子類中提供方法的實作。

    介面(interface)技術主要用來描述類具有什么功能,而并不給出每個功能的具體實作。 ......

    uj5u.com 2023-05-10 10:24:35 more