搞懂Hadoop、MapReduce、Hive、HBase、YARN及Spark的區別與聯繫

2020-12-14 阿啄debugIT

Hadoop、MapReduce、Hive、HBase、YARN、Spark……初搞大數據的,面對一堆名詞,猶如走進森林,弄得焦頭爛額……別說深入底層架構原理,就連他們之間的區別聯繫,有時候,都搞迷糊……

搞懂大數據各個組件的區別與lian'x

01那什麼是hadoop呢?

Hadoop是一個開源框架,允許使用簡單的編程模型,在跨計算機集群的分布式環境中,存儲和處理大數據。它的設計是從單個伺服器擴展到數千個機器,每個都提供本地計算和存儲。

Hadoop最底部是 Hadoop Distributed File System(HDFS),它存儲 Hadoop 集群中所有存儲節點上的文件。HDFS的上一層是MapReduce 引擎,該引擎由 JobTrackers 和 TaskTrackers 組成。

Hadoop分布式計算平臺,最核心的是,提供海量數據存儲的HDFS,與提供海量數據計算的MapReduce,以及數據倉庫工具Hive和分布式資料庫Hbase。

Hadoop三大組件:

分布式文件系統:HDFS —— 實現將文件分布式存儲在很多的伺服器上分布式運算編程框架:MapReduce——實現多臺機器的分布式並行運算分布式資源調度平臺:YARN —— 幫用戶調度大量的mapreduce程序,併合理分配運算資源

02什麼是MapReduce

MapReduce是一種編程模型,是指定一個Map(映射)函數,用來把一組鍵值對,映射成一組新的鍵值對,指定並發的Reduce(歸約)函數,用來保證所有映射的鍵值對中的每一個共享相同的鍵組。

MapReduce核心思想

分而治之,先分後和:將一個大的、複雜的工作或任務,拆分成多個小的任務,並行處理,最終進行合併。

構建抽象模型:Map和Reduce

MapReduce借鑑了函數式語言中的思想,用Map和Reduce兩個函數,提供了高層的並行編程抽象模型。

Map:

對一組數據元素,進行某種重複式的處理([k1,v1] → [(k2,v2)])

Reduce:

對Map的中間結果,進行某種進一步的結果整理([k2, {v2,…}] → [k3, v3])

03那什麼是hive呢

hive是基於Hadoop的一個數據倉庫工具,用來進行數據提取、轉化、加載,可以存儲、查詢和分析存儲在Hadoop中的大規模數據的機制。

hive數據倉庫工具能將結構化的數據文件映射為一張資料庫表,並提供SQL查詢功能,能將SQL語句轉變成MapReduce任務來執行。

hive與關係型資料庫的SQL略有不同,但支持了絕大多數的語句如DDL、DML以及常見的聚合函數、連接查詢、條件查詢。

hive提供了很多具有進行數據提取轉化加載,用來存儲、查詢和分析存儲在Hadoop中的大規模數據集,並允許用戶自定義函數插件,包括支持UDF(User-Defined Function)、UDAF(User-Defnes AggregateFunction)和UDTF(User-Defined Table-Generating Function),實現對map和reduce函數的定製,為數據操作提供了良好的伸縮性和可擴展性

元數據存儲

hive 將元數據存儲在資料庫中,如 mysql、derby。hive 中的元數據,包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。

解釋器、編譯器、優化器、執行器

解釋器、編譯器、優化器完成HQL 查詢語句,從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在 HDFS 中,並在隨後由 MapReduce 調用執行

hive 的數據存儲

在 HDFS 中,大部分的查詢由 MapReduce 完成(不包含 * 的查詢,比如 select * from tbl 不會生成MapReduce 任務)。

數據存儲模型編輯

hive中包含以下四類數據模型:表(Table)、外部表(External Table)、分區(Partition)、桶(Bucket)。

(1) hive中的Table,和資料庫中的Table在概念上是類似的。在hive中每一個Table都有一個相應的目錄存儲數據

(2)外部表是一個已經存儲在HDFS中,並具有一定格式的數據。使用外部表意味著hive表內的數據,不在hive的數據倉庫內,它會到倉庫目錄以外的位置訪問數據。

外部表和普通表的操作不同:

○建普通表的操作分兩步,即表的創建數據裝入(可以分開也可以同時完成)。

數據裝入過程中,實際數據會移動到數據表,所在的hive數據倉庫文件目錄中,其後對該數據表的訪問,將直接訪問所對應文件目錄中的數據

刪除表時,該表的元數據和在數據倉庫目錄下的實際數據將同時刪除

○外部表的創建只有一個步,創建表和裝入數據同時完成。外部表的實際數據存儲在創建語句

location參數,指定的外部HDFS文件路徑中,但這個數據並不會移動到hive數據倉庫的文件目錄中。

刪除外部表時,僅刪除其元數據

刪除外部表時,僅刪除其元數據,保存在外部HDFS文件目錄中的數據不會被刪除。

(3)分區對應於資料庫中的分區列的密集索引,但是hive中分區的組織方式,和資料庫中的很不相同。在hive中,表中的一個分區對應於表下的一個目錄,所有的分區的數據都存儲在對應的目錄中。

hive分區

(4)桶對指定列,進行哈希(hash)計算,會根據哈希值切分數據,目的是為了並行,每一個桶對應一個文件

hive桶

(5)分區又分桶

可以對數據表分區之後繼續分桶,但是分區之後繼續分桶,我們在hdfs文件系統上看不出分桶的多個數據表文件,只能看見一個文件,但是能從文件路徑上看出分區的信息。

分區又分桶

04那什麼是hbase呢?

HBase是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,是一個面向列的資料庫,在表中它由行排序。表模式定義只能列族,也就是鍵值對。一個表有多個列族,以及每一個列族可以有任意數量的列。後續列的值連續存儲在磁碟上。表中的每個單元格值都具有時間戳

HBase系統架構體系圖

組成部件說明:

Client:

使用HBase RPC機制與HMaster和HRegionServer進行通信。Client與HMaster進行管理類操作。Client與HRegionServer進行數據讀寫類操作。Zookeeper:

Zookeeper Quorum存儲-ROOT-表地址、HMaster地址。HRegionServer把自己以Ephedral方式註冊到Zookeeper中,HMaster隨時感知各個HRegionServer的健康狀況。Zookeeper避免HMaster單點問題。HMaster:

HMaster沒有單點問題,HBase可以啟動多個HMaster,通過Zookeeper的Master Election機制,保證總有一個Master在運行。

主要負責Table和Region的管理工作:

管理用戶對表的增刪改查操作。管理HRegionServer的負載均衡,調整Region分布。Region Split後,負責新Region的分布。在HRegionServer停機後,負責失效HRegionServer上Region遷移。HRegionServer:

HBase中最核心的模塊,主要負責響應用戶I/O請求,向HDFS文件系統中讀寫。

HRegionServer向HDFS文件系統中讀寫

HRegionServer管理一系列HRegion對象;每個HRegion對應Table中一個Region,HRegion由多個HStore組成;每個HStore對應Table中一個Column Family的存儲;Column Family就是一個集中的存儲單元,故將具有相同IO特性的Column放在一個Column Family會更高效。HStore:

HBase存儲的核心。由MemStore和StoreFile組成。MemStore是Stored Memory Buffer。

HLog:

引入HLog原因:在分布式系統環境中,無法避免系統出錯或者宕機,一旦HRegionServer意外退出,MemStore中的內存數據就會丟失,引入HLog就是防止這種情況。

工作機制:

每個HRegionServer中都會有一個HLog對象,HLog是一個實現Write Ahead Log的類,每次用戶操作寫入MemStore的同時,也會寫一份數據到HLog文件,HLog文件定期會滾動出新,並刪除舊的文件(已持久化到StoreFile中的數據)。

當HRegionServer意外終止後,HMaster會通過Zookeeper感知,HMaster首先處理遺留的HLog文件,將不同region的log數據拆分,分別放到相應region目錄下,然後再將失效的region重新分配,領取到這些region的HRegionServer,在Load Region的過程中,會發現有歷史HLog需要處理,因此會Replay HLog中的數據到MemStore中,然後flush到StoreFiles,完成數據恢復。

hbase具體操作使用

在HBase中,namespace命名空間,是對一組表邏輯分組,類似RDBMS中的database,方便對表在業務上劃分。Apache HBase從0.98.0,0.95.2兩個版本開始支持namespace級別的授權操作,HBase全局管理員可以創建、修改和回收namespace的授權。

HBase系統默認定義了兩個預設的namespace:

hbase:系統內建表,包括namespace和meta表。default:用戶建表時,未指定namespace的表都創建在此命令的進退

命令的進退

hbase的一般操作

1、查看HBase運行狀態 status

2、創建表 create <table>,{NAME => <family>, VERSIONS => <VERSIONS>}

3、查看所有表 list

4、描述表詳情 describe 'User'

5、判斷表是否存在 exists 'User'

6、啟用或禁用表 is_disabled 'User' is_enabled 'User'

7、添加記錄,即插入數據,語法:put <table>,<rowkey>,<family:column>,<value>

8、根據rowKey查詢某個記錄,語法:get <table>,<rowkey>,[<family:column>, ...]

9、查詢所有記錄,語法:scan <table>,{COLUMNS => [family:column, ...], LIMIT => num}

另外,還可以添加TIMERANGE和FILTER等高級功能,STARTROW、ENDROW必須大寫,否則報錯,查詢結果不包含等於ENDROW的結果集。

10、統計表記錄數,語法:count <table>, {INTERVAL => intervalNum,CACHE => cacheNum}

INTERVAL設置多少行顯示一次及對應的rowkey,默認1000;CACHE每次去取的緩存區大小,默認是10,調整該參數可提高查詢速度。

hbase部分操作

hbase的刪除操作

hbase的刪除操作

hbase批量命令

bulkload為hbase的批量插入命令,應用於大數據量的插入,沒有性能問題。

批量插入命令

bulkload應用

業務場景:Hive離線計算好的數據,需要同步到HBase供在線業務查詢,思路是用HBase自帶的ImportTsv工具

Hive跑批:

建表語句,要用文本格式,即Tsv格式,分割符可以自己定義:

建表語句

跑批語句,注意設置不要compress,否則ImportTsv工具無法識別。

跑批語句,注意設置不要compress

生成中間的HFile。

生成中間的HFile

說明:config_dir是hbase的配置目錄,裡面包含hbase-site.xml,這個步驟ImportTsv會去讀取hive_table_dir中的文件,並分析hbase table的region分布,生成對應region的hfile,放到hfile_path中。

hbase中的ImportTsv與bulkload對比說明:

Hive表必須是帶分隔符的文本格式,而且不能壓縮(比如啟用了mapreduce的output snappy壓縮也不行)。ImportTsv可以直接一條條插入hbase,這時mapper解析一條,就插入一條,沒有reduce階段;相比bulkload,大批量數據性能不好。bulkload的優點是快,生成的hfile直接註冊到region server,數據對應用立即可見,沒有wal log,沒有flush。

05那什麼是YARN呢

Apache Hadoop YARN (Yet Another Resource Negotiator,另一種資源協調者)是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統,可為上層應用提供統一的資源管理和調度,它的引入為集群在利用率、資源統一管理和數據共享等方面帶來了巨大好處。

Hadoop 資源管理器

Container

容器(Container)是 Yarn對資源做的一層抽象,對底層進行封裝,只提供給上層一個調用接口。

yarn資源管理器

如上所示,Yarn 將CPU核數,內存這些計算資源都封裝成為一個個的容器(Container)。需要注意兩點:

容器由 Node Manager 啟動和管理,並被它所監控。容器被 Resource Manager 進行調度。Resource Manager

最中央的那個 ResourceManager(RM)。顧名思義,是負責資源管理的,整個系統有且只有一個 RM,來負責資源的調度。它也包含了兩個主要的組件:定時調用器(Scheduler)以及應用管理器(Application Manager)。

應用管理器(Application Manager)

顧名思義,應用管理器,就是負責管理 Client 用戶提交的應用。定時調度器(Scheduler)不對用戶提交的程序監控,監控應用的工作,正是由應用管理器(Application Manager)完成的。

每當 Client 提交一個 Application 時候,就會新建一個Application Master 。由這個 Application Master ,去與 Resource Manager申請容器資源,獲得資源後,會將要運行的程序,發送到容器上啟動,然後進行分布式計算

為什麼是把運行程序發送到容器上去運行

如果以傳統的思路來看,是程序運行著不動,然後數據進進出出不停流轉。但當數據量大的時候就沒法這麼玩了,因為海量數據移動成本太大,時間太長。

提交一個 Application 到 Yarn 的流程

提交一個 Application 到 Yarn 的流程

但是中國有一句老話山不過來,我就過去。

大數據分布式計算就是這種思想,既然大數據難以移動,那就把容易移動的應用程式,發布到各個節點進行計算,這就是大數據分布式計算的思路。

Node Manager

Node Manager 是 Resource Manager 在每臺機器的上代理,負責容器的管理,並監控他們的資源使用情況(cpu,內存,磁碟及網絡等),以及向 Resource Manager / Scheduler 提供這些資源使用報告。

06那什麼是spark呢?

Spark 是一個用來實現快速,而通用的集群計算的平臺。

在速度方面,Spark 擴展了廣泛使用的 MapReduce 計算模型,而且高效地支持更多計算模式,包括交互式查詢和流處理。在處理大規模數據集時,速度快就意味著,可以進行交互式的數據操作,否則每次操作就需要等待數分鐘甚至數小時。

Spark 的一個主要特點就是能夠在內存中進行計算,因而更快。不過即使是,必須在磁碟上進行的複雜計算,Spark 依然比MapReduce 更加高效

總的來說,Spark 適用於各種各樣,原先需要多種不同的分布式平臺的場景,包括批處理、迭代算法、交互式查詢、流處理

通過在一個統一的框架下,支持這些不同的計算,Spark可以簡單而低耗地把各種處理流程整合在一起,大大減輕了原先需要對各種平臺分別管理的負擔。

spark通用內存並行計算框架

Spark 所提供的接口非常豐富。除了提供基於 Python、Java、Scala 和 SQL 的簡單易用的API 以及內建的豐富的程序庫以外,Spark 還能和其他大數據工具密切配合使用。例如,Spark 可以運行在 Hadoop 集群上,訪問包括 Cassandra 在內的任意 Hadoop 數據源。

Spark 以其先進的設計理念,迅速成為社區的熱門項目,圍繞著 Spark 推出了 SparkSQL、SparkStreaming、MLlib 和 GraphX 等組件,逐漸形成大數據處理一站式解決平臺。

07以上技術棧區別於聯繫

根據 Hadoop MapReduce 的工作流程,可以分析出 Hadoop MapRedcue 的一些缺點。

1)Hadoop MapRedue 的表達能力有限。

所有計算都需要轉換成 Map 和 Reduce 兩個操作,不能適用於所有場景,對於複雜的數據處理過程難以描述。

2)磁碟 I/O 開銷大。

Hadoop MapReduce 要求每個步驟間的數據序列化到磁碟,所以 I/O 成本很高,導致交互分析和迭代算法開銷很大,而幾乎所有的最優化和機器學習都是迭代的。所以,Hadoop MapReduce 不適合於交互分析和機器學習

3)計算延遲高。

如果想要完成比較複雜的工作,就必須將一系列的 MapReduce 作業,串聯起來,然後順序執行這些作業。每一個作業,都是高時延的,而且只有在前一個作業完成之後,下一個作業才能開始啟動。因此,Hadoop MapReduce 不能勝任比較複雜的多階段的計算服務

Spark 是借鑑了 Hadoop MapReduce 技術發展而來的,繼承了其分布式並行計算的優點,並改進了 MapReduce 明顯的缺陷。

Spark 使用Scala 語言進行實現,它是一種面向對象的函數式程式語言,能夠像操作本地集合對象一樣,輕鬆地操作分布式數據集。它具有運行速度快、易用性好、通用性強和隨處運行等特點,具體優勢如下。

1)Spark 提供了內存計算,把中間結果,放到內存中,帶來了更高的迭代運算效率。通過支持有向無環圖(DAG)的分布式,並行計算的編程框架,Spark 減少了迭代過程中數據需要寫入磁碟的需求,提高了處理效率。

2)Spark 為我們提供了一個全面、統一的框架,用於管理各種有著不同性質(文本數據、圖表數據等)的數據集和數據源(批量數據或實時的流數據)的大數據處理的需求。

Spark 使用內存緩存來提升性能,因此進行交互式分析也足夠快速,緩存同時提升了迭代算法的性能,這使得 Spark 非常適合數據理論任務,特別是機器學習。

3)Spark 比 Hadoop 更加通用。Hadoop 只提供了 Map 和 Reduce 兩種處理操作,而Spark 提供的數據集操作類型更加豐富,從而可以支持更多類型的應用。

Spark 的計算模式也屬於 MapReduce 類型,但提供的操作不僅包括 Map 和 Reduce,還提供了包括 Map、Filter、FlatMap、Sample、GroupByKey、ReduceByKey、Union、Join、Cogroup、MapValues、Sort、PartionBy 等多種轉換操作,以及 Count、Collect、Reduce、Lookup、Save 等行為操作。

4)Spark 基於 DAG 的任務調度執行機制,比 Hadoop MapReduce 的迭代執行機制更優越。

Spark 各個處理結點之間的通信模型,不再像 Hadoop 一樣,只有 Shuffle 一種模式,程序開發者可以使用 DAG 開發複雜的多步數據管道,控制中間結果的存儲、分區等。

Hadoop 與 Spark 執行流程對比

從中可以看出,Hadoop 不適合於做迭代計算,因為每次迭代都需要從磁碟中讀入數據,向磁碟寫中間結果,而且每個任務都需要從磁碟中讀入數據,處理的結果也要寫入磁碟,磁碟 I/O 開銷很大。

而 Spark 將數據載入內存後,後面的迭代都可以直接使用內存中的中間結果做計算,從而避免了從磁碟中頻繁讀取數據。

對於多維度隨機查詢也是一樣。在對 HDFS 同一批數據,做成百或上千維度查詢時,Hadoop 每做一個獨立的查詢,都要從磁碟中讀取這個數據;而 Spark只需要從磁碟中讀取一次後,就可以針對保留在內存中的中間結果進行反覆查詢。

Spark 在 2014 年打破了 Hadoop 保持的基準排序(Sort Bench mark)記錄,使用 206 個結點在 23 分鐘的時間裡完成了 100TB 數據的排序,而 Hadoop 則是使用了 2000 個結點在 72 分鐘才完成相同數據的排序。也就是說,Spark 只使用了百分之十的計算資源,就獲得了 Hadoop 3 倍的速度。

儘管與 Hadoop 相比,Spark 有較大優勢,但是並不能夠取代 Hadoop。

因為 Spark 是基於內存進行數據處理的,所以不適合於數據量特別大、對實時性要求不高的場合。另外,Hadoop 可以使用廉價的通用伺服器來搭建集群,而 Spark 對硬體要求比較高,特別是對內存和 CPU 有更高的要求。

相關焦點

  • spark啟動worker失敗 - CSDN
    02:50 jdkdrwxr-xr-x 2 root root 4096 Jun 17 08:09 src_old[root@cdh1 local]# cp /mnt/hgfs/hive/spark/scala-2.9.3.tgz .
  • 數據分析工程師面試集錦5——Spark面試指南
    6、說說SparkContext和SparkSession有什麼區別和聯繫?SparkContext是使用Spark功能的入口點。SparkSession是Spark2.x後引入的概念。7、hadoop和spark的都是並行計算,那麼他們有什麼相同和區別?(優勢在哪裡,只寫區別)1.兩者都是用mr模型來進行並行計算,但機制不同。
  • 編寫Hive的UDF(查詢平臺數據同時向mysql添加數據)
    創建包結構創建一個基礎信息類所有輸出到mysql資料庫中的自定義MR任務的自定義key均需要實現該抽象類代碼內容,主要是實現org.apache.hadoop.io.WritableComparable類,其它不需要寫
  • 大數據架構師基礎:hadoop家族,Cloudera系列產品介紹
    大數據我們都知道hadoop,可是還會各種各樣的技術進入我們的視野:Spark,Storm,impala,讓我們都反映不過來。
  • HBase的讀寫和javaAPI的使用
    一、hbase系統管理表hbase:namespace,記錄了hbase中所有namespace的信息 ,當前系統下有哪些namespace信息scan 'hbase:namespace'hbase:meta,記錄了region信息scan 'hbase:meta'二、讀寫思想client(get、scan)rowkey條件(1)由於rowkey是存儲在region
  • 8臺Hadoop伺服器進行集群規劃前配置
    >集群規劃如下:(伺服器編號為hadoop221-hadoop228)註:1、NameNodes和zkfc一一對應;2、DataNode和NodeManager都是works文件配置;3、Zookeeper至少3個,必須奇數臺;
  • Hive基於UDF進行文本分詞
    本文大綱UDF 簡介Hive作為一個sql查詢引擎,自帶了一些基本的函數,比如count(計數),sum(求和),有時候這些基本函數滿足不了我們的需求,這時候就要寫hive hdf(user defined funation),又叫用戶自定義函數。
  • 快速入門HBase,熟悉hbase shell操作
    HBase的名字的來源於Hadoop database,即hadoop資料庫,不同於一般的關係資料庫,它是一個適合於非結構化數據存儲的資料庫,而且它是基於列的而不是基於行的模式。HBase shell是HBase的一套命令行工具,類似傳統數據中的sql概念,可以使用shell命令來查詢HBase中數據的詳細情況。
  • 大數據入門:Spark RDD、DataFrame、DataSet
    尤其是在涉及到數據結構的部分,理解清楚這三者的共性與區別,非常有必要。今天的大數據入門分享,我們就主要來講講Spark RDD、DataFrame、DataSet。DataFrame、DataSet和RDD有什麼區別?
  • 一文詳解 SparkStreaming 如何整合 Kafka!附代碼可實踐
    0.10以後只保留了direct模式(Reveiver模式不適合生產環境),並且0.10版本API有變化(更加強大)結論:我們學習和開發都直接使用0.10版本中的direct模式,但是關於Receiver和Direct的區別面試的時候要能夠答得上來spark-streaming-kafka-0-8(了解)
  • Hello,Funspark!Hello,World——華奧電競品牌全新升級
    以「極致生活」和「電競精神」為基礎,華奧全新的賽事品牌Funspark 誕生了。和過去相比,如今的電競不僅衍生出了許多曾經想像不到的業態,連賽事本身輸出的內容也在變得極為豐富。不管對一個新產業,還是對於一個賽事,豐富都意味著未來可能出現的多種可能性。Funspark也一樣。
  • Spark Streaming 對比 JStorm
    Muise spark core主要包含了以下特性:Kafka Offset自動管理支持Exactly Once與At Least Once語義提供Metric註冊系統,用戶可註冊自定義metric基於系統與用戶自定義metric進行預警Long running on Yarn,提供容錯機制
  • 大數據入門:Hadoop HDFS存儲原理
    HDFS即Hadoop distributed file system(hadoop分布式文件系統),在Hadoop當中負責分布式存儲階段的任務,它是一個分布式的文件系統,也可以用來存放單個機器的數據,只是大部分用來存儲分布式數據。HDFS跟window下的NTFS一樣可以通過目錄樹來查找數據。
  • Spark錦標賽第二賽季超燃啟動 再掀主機遊戲新狂歡
    報名通道及詳細賽事信息請關注:https://site.gcores.com/spark/season2/ 虎牙直播連結:www.huya.com/spark2020 房間號:660161 2019年起,機核與華奧電競攜手舉辦火花錦標賽,在挖掘更多電競項目的同時,力爭為觀眾展現多元化的電競賽事,同時也努力為主機電競探索一條可持續發展的道路
  • 大疆與line合作款spark,七夕還不知道送什麼?
    大疆推出與line合作款sparkQiao那個攝影師,每日原創攝影教程與最新資訊分享,喜歡攝影千萬不要錯過。最近大疆合作不斷,先是被爆出mavic2pro將與哈蘇合作,現又推出了一個布朗熊款spark對於那些不熟悉的人來說,Line Friends是一個韓國聊天app內的俏皮角色們。雖然其他角色也有可能與DJI Spark無人機合作,但唯一確認的是布朗熊。
  • 正手和反手引體向上有什麼區別?練之前要搞懂哪些事?
    那麼,正手和反手除了姿勢不一樣之外還有什麼區別呢?今天小編就帶大家來揭秘一下,讓你更清楚地認識引體向上。閱讀本篇文章你將獲得以下內容:1、正手和反手引體向上的區別2、正手和反手引體向上正確的做法3、如何提高我們做引體向上的能力一、正手和反手引體向上的區別
  • 防凍液紅、綠、藍有啥區別?沒搞懂之前別亂加,車壞了哭都來不及
    防凍液紅、綠、藍有啥區別?沒搞懂之前別亂加,車壞了哭都來不及汽車這個東西其實現在很多車主都想著讓自己的汽車壽命長,從買車的時候就開始研究自己的購車預算能夠買到哪些質量不錯的汽車。