linux搭建hadoop學習

linux搭建hadoop學習

下載安裝包:
海外資源可能需要翻墻或者找國內資源

cd /opt
wget https://dlcdn.apache.org/hadoop/common/hadoop-2.10.2/hadoop-2.10.2.tar.gz
tar -zxvf hadoop-2.10.2.tar.gz
mv hadoop-2.10.2 hadoop

配置環境變量

# 在/etc/profile文件中添加下面內容
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#生效環境變量
source  /etc/profile

測試安裝,在命令行中執行

hadoop version

我這里執行后報錯,很明顯前面提到過hadoop由java開發,所以還需要配置java環境.

[root@win-local-17 ~]# hadoop version
Error: JAVA_HOME is not set and could not be found.

這里可以參考文檔: https://blog.csdn.net/qq_42402854/article/details/108164936
如果是原本使用rpm包安裝jdk需要注意下,可能你主機上可以執行java命令,但是依然會遇到這個報錯.
這時需要我們在手動配置下環境變量:

# 看下java是在哪個目錄下,然后配置到/etc/profile文件中
which  javaexport JAVA_HOME=/usr/
export PATH=$PATH:$JAVA_HOME/bin

然后再執行:

[root@win-local-17 ~]# hadoop version
Hadoop 2.10.2
Subversion Unknown -r 965fd380006fa78b2315668fbc7eb432e1d8200f
Compiled by ubuntu on 2022-05-24T22:35Z
Compiled with protoc 2.5.0
From source with checksum d3ab737f7788f05d467784f0a86573fe
This command was run using /opt/hadoop/share/hadoop/common/hadoop-common-2.10.2.jar

到這里hadoop的應用程序安裝完成了,
接下來我們開始部署單機模型和偽分布式服務.因為是學習階段所以使用單臺主機部署偽分布式就可以了.如果需要多臺主機部署分布式可以查看文末的參考文檔.

單機模式

先進行一個簡單的示例:用來統計分析單詞的個數和數量

#首先創建一個目錄
cd /opt/hadoop
mkdir input 
cd ./intput

然后創建文件,寫入一些簡單數據
cat test

hadoop yarn
hadoop mapreduce
spark
spark

然后執行一下MapReduce 程序,我們來看下效果:

hadoop jar  /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.2.jar   wordcount input/ wcoutput

程序執行之后會看到有很多輸出,此時主機cpu使用率也會升高,主要看有沒有明顯的報錯出現.,執行執行完成之后,在/opt/hadoop下會創建出一個目錄: wcoutput
可以看到這里將我們給的測試內容中的單詞數量統計出來了.

[root@win-local-17 hadoop]# ll wcoutput
總用量 4
-rw-r--r--. 1 root root 36 58 18:05 part-r-00000
-rw-r--r--. 1 root root  0 58 18:05 _SUCCESS
[root@win-local-17 hadoop]# cat wcoutput/part-r-00000
hadoop  2
mapreduce       1
spark   2
yarn    1
[root@win-local-17 hadoop]# pwd
/opt/hadoop

接下來,我們進行一個nginx日志的統計,上面的測試發現它可以統計簡單的單詞,那么就可以對指定的日志格式內容進行分析,比如我們讓他統計一下nginx日志文件中,請求的客戶端IP的數量和狀態碼的數量.
當然我們不能直接和上面一樣運行命令直接進行統計,hadoop還不能直接實現,需要我們對MapReduce 過程進行自定義,分為map過程和Reduce過程;Hadoop Streaming 允許使用任何可執行程序(如 Python 腳本)作為 MapReduce 作業的 mapper 和 reducer。
這里我們自己寫兩個Python腳本,來實現map過程和Reduce過程.
mapper.py

import sys
import re# 正則表達式用于解析 Nginx 日志行
NGINX_LOG_PATTERN = re.compile(r'^([\d.]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)')for line in sys.stdin:line = line.strip()match = NGINX_LOG_PATTERN.match(line)if match:# 提取 IP 地址ip = match.group(1)# 提取狀態碼status_code = match.group(4)# 輸出 IP 地址和計數print(f"{ip}\t1")# 輸出狀態碼和計數print(f"{status_code}\t1")

reducer.py

import syscurrent_key = None
current_count = 0for line in sys.stdin:line = line.strip()key, count = line.split('\t', 1)try:count = int(count)except ValueError:continueif current_key == key:current_count += countelse:if current_key:print(f"{current_key}\t{current_count}")current_key = keycurrent_count = countif current_key:print(f"{current_key}\t{current_count}")

這里通過mapper.py對輸入的日志內容進行過濾,提取IP和狀態碼,輸入一個鍵值對。而reducer.py就是對map中輸出的鍵值對,對相同鍵值進行累計,得到次數。
然后我們在創建目錄和日志文件內容:

mkdir nginx-input
cd nginx-input
[root@win-local-17 nginx-input]# ll
總用量 36
-rw-r--r--. 1 root root   502 58 18:34 mapper.py
-rw-r--r--. 1 root root 26326 58 18:48 nginx.log
-rw-r--r--. 1 root root   474 58 18:35 reducer.py
[root@win-local-17 nginx-input]# head nginx.log  -n 3
192.168.112.125 - - [03/Apr/2025:20:25:15 +0800] "HEAD /app/psychicai/psychicai_test.ipa HTTP/2.0" 200 0 "-" "com.apple.appstored/1.0 iOS/17.5.1 model/iPhone13,2 hwp/t8101 build/21F90 (6; dt:229) AMS/1" "-"
192.168.112.125 - - [03/Apr/2025:20:25:15 +0800] "GET /app/psychicai/icon_1024@1x.png HTTP/2.0" 200 162747 "-" "com.apple.appstored/1.0 iOS/17.5.1 model/iPhone13,2 hwp/t8101 build/21F90 (6; dt:229) AMS/1" "-"
192.168.112.125 - - [03/Apr/2025:20:25:21 +0800] "GET /app/psychicai/psychicai_test.ipa HTTP/2.0" 200 74397692 "-" "com.apple.appstored/1.0 iOS/17.5.1 model/iPhone13,2 hwp/t8101 build/21F90 (6; dt:229) AMS/1" "-"

文件內容準備好之后,我們執行命令用自定義的腳本去執行兩個階段:(主機需要有Python3的環境)

cd /opt/hadoop/nginx-inputhadoop jar ../share/hadoop/tools/lib/hadoop-streaming-*.jar \
-input  ./nginx.log \
-output /output \
-mapper "python3 mapper.py" \
-reducer "python3 reducer.py"

執行期間我們會看到有很對輸出,觀察里面是否有明顯報錯.

[root@win-local-17 nginx-input]# hadoop jar ../share/hadoop/tools/lib/hadoop-streaming-*.jar \
> -input  ./nginx.log \
> -output /output \
> -mapper "python3 mapper.py" \
> -reducer "python3 reducer.py"
25/05/08 18:50:59 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
25/05/08 18:50:59 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
25/05/08 18:51:19 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized
25/05/08 18:51:40 INFO mapred.FileInputFormat: Total input files to process : 1
25/05/08 18:51:40 INFO mapreduce.JobSubmitter: number of splits:1
25/05/08 18:51:41 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local1405416554_0001
25/05/08 18:51:41 INFO mapreduce.Job: The url to track the job: http://localhost:8080/
25/05/08 18:51:41 INFO mapred.LocalJobRunner: OutputCommitter set in config null
25/05/08 18:51:41 INFO mapreduce.Job: Running job: job_local1405416554_0001
25/05/08 18:51:41 INFO mapred.LocalJobRunner: OutputCommitter is org.apache.hadoop.mapred.FileOutputCommitter
25/05/08 18:51:41 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
25/05/08 18:51:41 INFO output.FileOutputCommitter: FileOutputCommitter skip cleanup _temporary folders under output directory:false, ignore cleanup failures: false
25/05/08 18:51:41 INFO mapred.LocalJobRunner: Waiting for map tasks
25/05/08 18:51:41 INFO mapred.LocalJobRunner: Starting task: attempt_local1405416554_0001_m_000000_0
25/05/08 18:51:42 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
25/05/08 18:51:42 INFO output.FileOutputCommitter: FileOutputCommitter skip cleanup _temporary folders under output directory:false, ignore cleanup failures: false
25/05/08 18:51:42 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
25/05/08 18:51:42 INFO mapred.MapTask: Processing split: file:/opt/hadoop/nginx-input/nginx.log:0+26326
25/05/08 18:51:42 INFO mapred.MapTask: numReduceTasks: 1
25/05/08 18:51:42 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
25/05/08 18:51:42 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
25/05/08 18:51:42 INFO mapred.MapTask: soft limit at 83886080
25/05/08 18:51:42 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
25/05/08 18:51:42 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
25/05/08 18:51:42 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
25/05/08 18:51:42 INFO streaming.PipeMapRed: PipeMapRed exec [/usr/local/bin/python3, mapper.py]
25/05/08 18:51:42 INFO Configuration.deprecation: mapred.work.output.dir is deprecated. Instead, use mapreduce.task.output.dir
25/05/08 18:51:42 INFO Configuration.deprecation: map.input.start is deprecated. Instead, use mapreduce.map.input.start
25/05/08 18:51:42 INFO Configuration.deprecation: mapred.task.is.map is deprecated. Instead, use mapreduce.task.ismap
25/05/08 18:51:42 INFO Configuration.deprecation: mapred.task.id is deprecated. Instead, use mapreduce.task.attempt.id
25/05/08 18:51:42 INFO Configuration.deprecation: mapred.tip.id is deprecated. Instead, use mapreduce.task.id
25/05/08 18:51:42 INFO Configuration.deprecation: mapred.local.dir is deprecated. Instead, use mapreduce.cluster.local.dir
25/05/08 18:51:42 INFO Configuration.deprecation: map.input.file is deprecated. Instead, use mapreduce.map.input.file
25/05/08 18:51:42 INFO Configuration.deprecation: mapred.skip.on is deprecated. Instead, use mapreduce.job.skiprecords
25/05/08 18:51:42 INFO Configuration.deprecation: map.input.length is deprecated. Instead, use mapreduce.map.input.length
25/05/08 18:51:42 INFO Configuration.deprecation: mapred.job.id is deprecated. Instead, use mapreduce.job.id
25/05/08 18:51:42 INFO Configuration.deprecation: user.name is deprecated. Instead, use mapreduce.job.user.name
25/05/08 18:51:42 INFO Configuration.deprecation: mapred.task.partition is deprecated. Instead, use mapreduce.task.partition
25/05/08 18:51:42 INFO streaming.PipeMapRed: R/W/S=1/0/0 in:NA [rec/s] out:NA [rec/s]
25/05/08 18:51:42 INFO streaming.PipeMapRed: R/W/S=10/0/0 in:NA [rec/s] out:NA [rec/s]
25/05/08 18:51:42 INFO streaming.PipeMapRed: R/W/S=100/0/0 in:NA [rec/s] out:NA [rec/s]
25/05/08 18:51:42 INFO streaming.PipeMapRed: Records R/W=100/1
25/05/08 18:51:42 INFO streaming.PipeMapRed: MRErrorThread done
25/05/08 18:51:42 INFO streaming.PipeMapRed: mapRedFinished
.......

在這期間也可以觀察到主機cpu和負載會有很明顯的升高,

top - 18:51:42 up 2 days,  8:32,  3 users,  load average: 0.16, 0.05, 0.06
Tasks: 154 total,   1 running, 153 sleeping,   0 stopped,   0 zombie
%Cpu(s): 12.5 us,  2.8 sy,  0.0 ni, 84.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1867048 total,   211396 free,   249168 used,  1406484 buff/cache
KiB Swap:  1048572 total,  1048404 free,      168 used.  1304388 avail MemPID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND25764 root      20   0 2304916 138548  22392 S 155.5  7.4   0:12.16 java

我這里測試了100條日志數據執行10s左右就結束了,然后我們可以看到執行結果.

[root@win-local-17 nginx-input]# ll /output/
總用量 4
-rw-r--r--. 1 root root 107 58 18:51 part-00000
-rw-r--r--. 1 root root   0 58 18:51 _SUCCESS
[root@win-local-17 nginx-input]# cat /output/part-00000
192.168.112.125 3
192.168.113.187 5
192.168.114.57  1
192.168.115.0   3
192.168.89.136  88
200     53
206     2
405     45

這里他將日志中的客戶端IP,以及狀態碼都統計出來, 我們在用命令去過濾一下,對比一下統計結果

[root@win-local-17 nginx-input]# cat nginx.log | awk '{print $1}' |sort -n | uniq -c3 192.168.112.1255 192.168.113.1871 192.168.114.573 192.168.115.088 192.168.89.136
[root@win-local-17 nginx-input]# cat nginx.log |grep -w '200' |wc -l
53
[root@win-local-17 nginx-input]# cat nginx.log |grep -w '206' |wc -l
2
[root@win-local-17 nginx-input]# cat nginx.log |grep -w '405' |wc -l
45
[root@win-local-17 nginx-input]# wc -l nginx.log
100 nginx.log

通過我們手動對日志文件進行統計可以看到,最終的結果跟上面使用MapReduce的方式一樣,通過這種自定義的方式,可以使用多場景化,當然后面再不斷地學習中還會有更好工具幫助簡化自定義的數據分析方式.

偽分布式模式

偽分布式則是在一臺主機上模擬出分布式的各個進程運行狀態,方便我們了解學習.
配置集群,修改hadoop的配置文件: /opt/hadoop/etc/hadoop/core-site.xml (該配置文件是 Hadoop 集群的核心配置文件之一,主要用于定義 Hadoop 分布式系統的全局設置和通用屬性,控制 Hadoop 各個組件之間的通信、數據傳輸和基本行為。這個文件決定了 Hadoop 集群如何運行以及各個服務之間如何交互。)
core-site.xml

<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property><name>fs.defaultFS</name><!-- namenode主機地址,本地地址 --><value>hdfs://192.168.44.17:8020</value>
</property><!-- 指定Hadoop運行時產生文件的存儲目錄 -->
<property><name>hadoop.tmp.dir</name><value>/opt/hadoop/data/tmp</value></property>
</configuration>

hdfs-site.xml

<configuration><!-- 指定HDFS副本的數量 --><property><name>dfs.replication</name><value>1</value></property>
</configuration>

修改上面的配置后,啟動集群

  1. 格式化 NameNode(第一次啟動時格式化,以后就不要總格式化)
hdfs namenode -format
# 執行之后會有很多輸出,檢查是否有明顯異常
25/05/09 11:16:23 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at win-local-17/192.168.44.17
************************************************************/
  1. 啟動 NameNode
cd /opt/hadoop/etc/hadoop
[root@win-local-17 hadoop]# hadoop-daemon.sh start namenode
starting namenode, logging to /opt/hadoop/logs/hadoop-root-namenode-win-local-17.out
[root@win-local-17 hadoop]# cat  /opt/hadoop/logs/hadoop-root-namenode-win-local-17.out
ulimit -a for user root
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7206
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7206
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
  1. 啟動DataNode
cd /opt/hadoop/etc/hadoop
[root@win-local-17 hadoop]# hadoop-daemon.sh start datanode
starting datanode, logging to /opt/hadoop/logs/hadoop-root-datanode-win-local-17.out
[root@win-local-17 hadoop]# cat /opt/hadoop/logs/hadoop-root-datanode-win-local-17.out
ulimit -a for user root
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7206
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7206
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
  1. 查看進程是否啟動成功
[root@win-local-17 hadoop]# jps
80615 NameNode
80726 DataNode
80790 Jps
[root@win-local-17 hadoop]# netstat -anltp |grep java
tcp        0      0 192.168.44.17:8020      0.0.0.0:*               LISTEN      80615/java
tcp        0      0 0.0.0.0:50070           0.0.0.0:*               LISTEN      80615/java
tcp        0      0 0.0.0.0:50010           0.0.0.0:*               LISTEN      80726/java
tcp        0      0 0.0.0.0:50075           0.0.0.0:*               LISTEN      80726/java
tcp        0      0 0.0.0.0:50020           0.0.0.0:*               LISTEN      80726/java
tcp        0      0 127.0.0.1:43496         0.0.0.0:*               LISTEN      80726/java
tcp        0      0 192.168.44.17:37402     192.168.44.17:8020      ESTABLISHED 80726/java
tcp        0      0 192.168.44.17:8020      192.168.44.17:37402     ESTABLISHED 80615/java

簡單介紹上面端口對應的服務:

8020: HDFS 的 NameNode 服務。
50070: NameNode 的 Web UI 服務,可以通過瀏覽器訪問
50010: DataNode 的數據傳輸端口,DataNode 使用該端口與其他 DataNode 節點或客戶端進行數據塊的傳輸。當客戶端需要讀取或寫入數據時,會通過該端口與相應的 DataNode 進行數據交互。
50075: DataNode 的 Web UI 服務。
50020: DataNode 的元數據服務端口。用于 DataNode 與 NameNode 之間進行數據塊的元數據信息交換,例如 DataNode 向 NameNode 匯報自己所存儲的數據塊信息

通過web端訪問一下HDFS的系統:
在這里面可以系統的相關信息以及節點和日志的信息
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
5. 啟動 YARN 并運行 MapReduce 程序
修改yarn-site.xml配置文件,添加下面內容
/opt/hadoop/etc/hadoop/yarn-site.xml

<configuration><!-- 指定 NodeManager 節點上運行的輔助服務列表。在 Hadoop 中,mapreduce_shuffle 是一個關鍵的輔助服務,專門用于處理 MapReduce 作業中的數據混洗(Shuffle)階段。 --><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><!-- 指定YARN的ResourceManager的地址,默認端口是8088--><property><name>yarn.resourcemanager.webapp.address</name><value>0.0.0.0:8088</value></property>
</configuration>
mv mapred-site.xml.template mapred-site.xml

修改mapred-site.xml

<configuration><!-- 指定MR運行在YARN上 --><property><name>mapreduce.framework.name</name><value>yarn</value></property>
</configuration>
  1. 啟動集群
    啟動前必須保證 NameNode 和 DataNode 已經啟動
    啟動ResourceManager
[root@win-local-17 hadoop]# yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /opt/hadoop/logs/yarn-root-resourcemanager-win-local-17.out

啟動NodeManager啟動NodeManager

[root@win-local-17 hadoop]# yarn-daemon.sh start nodemanager
starting nodemanager, logging to /opt/hadoop/logs/yarn-root-nodemanager-win-local-17.out

查看進程運行:

[root@win-local-17 hadoop]# jps
90321 NodeManager
90593 ResourceManager
80615 NameNode
80726 DataNode
90716 Jps

如果遇到報錯: 端口一直報錯無法使用,可以將端口改為8098,再重啟啟動ResourceManager正常運行了.
然后訪問web端就能看到:
在這里插入圖片描述
參考文檔:
https://developer.aliyun.com/article/1046126
https://www.cnblogs.com/liugp/p/16607424.html#%E4%BA%8Chadoop-hdfs-ha-%E6%9E%B6%E6%9E%84%E4%B8%8E%E5%8E%9F%E7%90%86

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82463.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82463.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82463.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kubernetes生產實戰(十六):集群安全加固全攻略

Kubernetes集群安全加固全攻略&#xff1a;生產環境必備的12個關鍵策略 在容器化時代&#xff0c;Kubernetes已成為企業應用部署的核心基礎設施。但根據CNCF 2023年云原生安全報告顯示&#xff0c;75%的安全事件源于K8s配置錯誤。本文將基于生產環境實踐&#xff0c;系統講解集…

類加載機制詳解:雙親委派模型與打破它的方式

在復雜的 Java 系統中&#xff0c;類加載是最基礎卻常被忽略的一環。理解 JVM 的類加載機制&#xff0c;特別是 雙親委派模型&#xff08;Parent Delegation Model&#xff09;&#xff0c;是我們深入掌握熱部署、插件機制、ClassLoader 隔離、ClassNotFound 錯誤等問題的關鍵。…

Android SDK 開發中的 AAR 與 JAR 區別詳解

在 Android SDK 開發中&#xff0c;構建項目時我們常常會看到生成兩個不同的文件&#xff1a;一個是 build/outputs/aar/*.aar&#xff0c;另一個是 build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar。很多初學者會疑惑&#xff1a;它們之間有什么區別&am…

服務器配置錯誤導致SSL/TLS出現安全漏洞,如何進行排查?

SSL/TLS 安全漏洞排查與修復指南 一、常見配置錯誤類型? 弱加密算法與密鑰問題? 使用弱密碼套件&#xff08;如DES、RC4&#xff09;或密鑰長度不足&#xff08;如RSA密鑰長度<2048位&#xff09;&#xff0c;導致加密強度不足。 密鑰管理不當&#xff08;如私鑰未加密存…

Day20打卡-奇異值SVD分解

今天學習非特征篩選的方法&#xff1a; 知識點回顧&#xff1a; 線性代數概念回顧&#xff08;可不掌握&#xff09;奇異值推導&#xff08;可不掌握&#xff09;奇異值的應用 特征降維&#xff1a;對高維數據減小計算量、可視化數據重構&#xff1a;比如重構信號、重構圖像&am…

temu采購自養號全流程解析:從賬號搭建到安全下單的技術閉環

temu 自養號采購下單技術是一個精細的過程&#xff0c;需要從多個方面進行考慮和操作&#xff0c;其核心在于通過技術手段模擬真實用戶行為&#xff0c;構建獨立、安全的賬號環境以確保賬號的安全性、真實性和采購下單的成功率。以下是對該技術的詳細解析 1. 賬號準備 手機號…

相機Camera日志分析之八:高通Camx HAL架構opencamera三級日志詳解及關鍵字

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了:相機Camera日志分析之七:高通Camx HAL架構opencamera二級日志詳解及關鍵字 這一篇我們開始講: 相機Camera日志分析之八:高通Camx HAL架構opencamera三級日志詳解及關鍵字 目錄 【關注我,后續持續…

自定義類型-結構體(二)

結構體內存對齊 偏移量 指的是結構體中某個成員相對于結構體起始地址的字節距離 第一個成員的起始位置為0&#xff0c;一個字節表示一個單位 這里的數字表示的是該成員地址與結構體首地址之間的值 對齊規則 1.結構體第一個成員的第一個字節的偏移量為0 2.其余成員變量要…

【免費工具】圖吧工具箱2025.02正式版

DIY愛好者的必備工具 軟件截圖&#xff1a; —————【下 載 地 址】——————— 【本章單下載】&#xff1a;https://drive.uc.cn/s/f08aad37ddb14 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/HPQywvPc7iLZu1k0ODFcWMt2n0d?fromfrom_copylink …

DAX 權威指南1:DAX計算、表函數與計算上下文

參考《DAX 權威指南 第二版》 文章目錄 二、DAX簡介2.1 理解 DAX 計算2.2 計算列和度量值2.3 變量2.3.1 VAR簡介2.3.2 VAR的特性 2.4 DAX 錯誤處理2.4.1 DAX 錯誤類型2.4.1.1 轉換錯誤2.4.1.2 算術運算錯誤2.4.1.3 空值或 缺失值 2.4.2 使用IFERROR函數攔截錯誤2.4.2.1 安全地進…

【Linux系統】從零開始構建簡易 Shell:從輸入處理到命令執行的深度剖析

文章目錄 前言一、打印命令行提示符代碼功能概述 二、讀取鍵盤輸入的指令2.1 為什么不繼續使用scanf()而換成了fgets()&#xff1f;2.2 調試輸出的意義2.3 為什么需要去掉換行符&#xff1f; 三、指令切割補充知識&#xff1a; strtok 的函數原型 四、普通命令的執行代碼功能概…

湖倉一體架構在金融典型數據分析場景中的實踐

在數字經濟與金融科技深度融合的今天&#xff0c;數據已成為金融機構的核心戰略資產。然而&#xff0c;傳統數據架構面臨著三大困局&#xff0c;制約著金融機構數據價值的充分釋放。 一、需求驅動更多銀行數據分析場景 金融機構&#xff0c;特別是銀行業&#xff0c;面臨著雙重…

基于Llama3的開發應用(一):Llama模型的簡單部署

Llama模型的簡單部署 0 前言1 環境準備1.1 硬件環境1.2 軟件環境 2 Meta-Llama-3-8B-Instruct 模型簡介2.1 Instruct含義2.2 模型下載 3 簡單調用4 FastAPI 部署4.1 通過FastAPI簡單部署4.2 測試 5 使用 streamlit 構建簡易聊天界面6 總結 0 前言 本系列文章是基于Meta-Llama-…

模擬太陽系(C#編寫的maui跨平臺項目源碼)

源碼下載地址&#xff1a;https://download.csdn.net/download/wgxds/90789056 本資源為用C#編寫的maui跨平臺項目源碼&#xff0c;使用Visual Studio 2022開發環境&#xff0c;基于.net8.0框架&#xff0c;生成的程序為“模擬太陽系運行”。經測試&#xff0c;生成的程序可運行…

基于人工智能的個性化 MySQL 學習路徑推薦研究

基于人工智能的個性化 MySQL 學習路徑推薦研究 摘要: 隨著信息技術的飛速發展,數據庫在各行業應用廣泛,MySQL 作為主流數據庫之一,學習需求龐大。然而,不同學習者在知識水平、學習進度和目標上存在差異,傳統統一的學習路徑難以滿足個性化需求。本研究通過運用人工智能技…

OSPF綜合應用

? 要求&#xff1a; 1&#xff0c;R5為ISP&#xff0c;其上只能配置IP地址&#xff1b;R4作為企業邊界路由器&#xff0c; 出口公網地址需要通過PPP協議獲取&#xff0c;并進行chap認證 2&#xff0c;整個OSPF環境IP基于172.16.0.0/16劃分&#xff1b; 3&#xff0c;所有設備…

中國古代史1

朝代歌 三皇五帝始&#xff0c;堯舜禹相傳。 夏商與西周&#xff0c;東周分兩段。 春秋和戰國&#xff0c;一統秦兩漢。 三分魏蜀吳&#xff0c;二晉前后延。 南北朝并立&#xff0c;隋唐五代傳。 宋元明清后&#xff0c;皇朝至此完。 原始社會 元謀人&#xff0c;170萬年前…

ensp的華為小實驗

1.先進行子網劃分 2.進行接口的IP地址配置和ospf的簡易配置&#xff0c;先做到全網小通 3.進行ospf優化 對區域所有區域域間路由器進行一個匯總 對區域1進行優化 對區域2.3進行nssa設置 4.對ISP的路由進行協議配置 最后ping通5.5.5.5

華為OD機試真題——荒島求生(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳實現

2025 A卷 200分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C、GO六種語言的最佳實現方式&#xff1b; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析&#xff1b; 本文收錄于專欄&#xff1a;《2025華為OD真題目錄…

IOC和Bean

IOC IOC將對象的創建&#xff0c;依賴關系的管理和生命周期的控制從應用程序代碼中解耦出來了 IOC容器的依賴注入(DI) 在程序運行過程中動態的向某個對象中注入他所需要的其他對象 依賴注入是基于反射實現的 Spring IOC 容器使用的是Map&#xff08;concorrentMap&#xff…