版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
分布式存儲系統(tǒng):HBase:HBase數(shù)據(jù)壓縮與編碼技術(shù)教程1HBase數(shù)據(jù)壓縮基礎(chǔ)1.1數(shù)據(jù)壓縮的重要性在分布式存儲系統(tǒng)中,數(shù)據(jù)壓縮扮演著至關(guān)重要的角色。它不僅可以減少存儲空間的需求,降低存儲成本,還能提高數(shù)據(jù)讀寫效率,減少網(wǎng)絡(luò)傳輸?shù)膸捪摹τ谙馠Base這樣的大規(guī)模數(shù)據(jù)存儲系統(tǒng),數(shù)據(jù)壓縮能夠顯著提升其性能和可擴(kuò)展性。1.2HBase中的壓縮機(jī)制HBase支持在存儲層和網(wǎng)絡(luò)層進(jìn)行數(shù)據(jù)壓縮。存儲層壓縮主要應(yīng)用于HFile(HBase的文件格式),在網(wǎng)絡(luò)層則用于RegionServer和Client之間的數(shù)據(jù)傳輸。HBase提供了多種壓縮算法供用戶選擇,包括Gzip、LZO、Snappy等,每種算法都有其特點和適用場景。1.2.1GzipGzip是一種廣泛使用的數(shù)據(jù)壓縮算法,它基于LZ77算法和Huffman編碼,能夠提供較高的壓縮比,但壓縮和解壓縮速度相對較慢。1.2.2LZOLZO是一種快速的壓縮算法,特別適合于實時數(shù)據(jù)處理場景。雖然其壓縮比不如Gzip,但LZO的壓縮和解壓縮速度更快,對于需要頻繁讀寫的HBase表來說,LZO是一個不錯的選擇。1.2.3SnappySnappy是Google開發(fā)的一種高效的數(shù)據(jù)壓縮算法,它在提供良好壓縮比的同時,也保持了較快的壓縮和解壓縮速度。Snappy特別適合于大數(shù)據(jù)處理,是HBase中常用的壓縮算法之一。1.3選擇合適的壓縮算法選擇HBase中的壓縮算法時,需要考慮以下幾個因素:壓縮比:壓縮比越高,存儲空間節(jié)省越多,但壓縮和解壓縮的計算開銷也越大。讀寫性能:壓縮和解壓縮的速度直接影響到HBase的讀寫性能。對于讀寫頻繁的表,選擇壓縮速度較快的算法更為合適。數(shù)據(jù)特性:不同的數(shù)據(jù)特性(如數(shù)據(jù)的可壓縮性、數(shù)據(jù)的訪問模式)會影響壓縮算法的選擇。例如,對于經(jīng)常被訪問的熱點數(shù)據(jù),使用壓縮速度較快的算法可以減少延遲。1.3.1示例:使用Snappy壓縮算法假設(shè)我們有一個HBase表example_table,我們想要使用Snappy壓縮算法來壓縮其數(shù)據(jù)。以下是如何在創(chuàng)建表時指定使用Snappy壓縮的示例://導(dǎo)入HBase和Snappy相關(guān)的庫
importorg.apache.hadoop.hbase.HBaseConfiguration;
importorg.apache.hadoop.hbase.TableName;
importorg.apache.hadoop.hbase.client.Connection;
importorg.apache.hadoop.hbase.client.ConnectionFactory;
importorg.apache.hadoop.hbase.client.Table;
importorg.apache.hadoop.hbase.client.Admin;
importorg.apache.hadoop.hbase.HColumnDescriptor;
importorg.apache.hadoop.hbase.HTableDescriptor;
importpress.Compression;
//創(chuàng)建HBase連接
Configurationconf=HBaseConfiguration.create();
Connectionconnection=ConnectionFactory.createConnection(conf);
//創(chuàng)建表描述符
HTableDescriptortableDescriptor=newHTableDescriptor(TableName.valueOf("example_table"));
//創(chuàng)建列族描述符,并設(shè)置壓縮算法為Snappy
HColumnDescriptorcolumnDescriptor=newHColumnDescriptor("cf1");
columnDescriptor.setCompressionType(Compression.Algorithm.SNAPPY);
tableDescriptor.addFamily(columnDescriptor);
//使用Admin對象創(chuàng)建表
Adminadmin=connection.getAdmin();
admin.createTable(tableDescriptor);
//關(guān)閉連接
admin.close();
connection.close();在這個示例中,我們首先導(dǎo)入了HBase和Snappy相關(guān)的庫,然后創(chuàng)建了一個HBase連接。接著,我們定義了一個表描述符tableDescriptor和一個列族描述符columnDescriptor,并在列族描述符中設(shè)置了壓縮算法為Snappy。最后,我們使用Admin對象創(chuàng)建了表,并關(guān)閉了連接。1.3.2數(shù)據(jù)樣例假設(shè)我們有以下數(shù)據(jù)樣例,存儲在example_table的cf1列族中:RowKeyColumnFamilyQualifierValue001cf1q1Hello001cf1q2World002cf1q1HBase002cf1q2Snappy在使用Snappy壓縮算法后,這些數(shù)據(jù)將被壓縮存儲,從而節(jié)省存儲空間。當(dāng)數(shù)據(jù)被讀取時,Snappy算法將被用于解壓縮數(shù)據(jù),以供應(yīng)用程序使用。1.3.3結(jié)論在HBase中合理選擇和使用壓縮算法,可以顯著提升系統(tǒng)的存儲效率和讀寫性能。Snappy、LZO和Gzip等算法各有優(yōu)劣,用戶應(yīng)根據(jù)具體的數(shù)據(jù)特性和訪問模式,選擇最適合的壓縮算法。2HBase編碼技術(shù)詳解2.1RowKey編碼策略在HBase中,RowKey的設(shè)計至關(guān)重要,因為它直接影響到數(shù)據(jù)的存儲和檢索效率。一個好的RowKey編碼策略可以確保數(shù)據(jù)的均勻分布,減少熱點問題,同時加快查詢速度。下面,我們將探討幾種常見的RowKey編碼策略:2.1.1時間戳前綴將時間戳作為RowKey的前綴,可以確保數(shù)據(jù)按時間順序存儲,便于時間序列數(shù)據(jù)的查詢。例如:#假設(shè)當(dāng)前時間戳為1628716800000(毫秒)
timestamp=1628716800000
#用戶ID為12345
user_id=12345
#拼接RowKey
row_key=f"{timestamp}_{user_id}"2.1.2哈希散列使用哈希函數(shù)對數(shù)據(jù)進(jìn)行散列,可以將RowKey均勻分布在整個表中,避免熱點問題。例如:importhashlib
#用戶名
username="JohnDoe"
#使用MD5哈希函數(shù)
hash_object=hashlib.md5(username.encode())
#轉(zhuǎn)換為16進(jìn)制字符串
row_key=hash_object.hexdigest()2.1.3字符串反轉(zhuǎn)對于字符串類型的RowKey,反轉(zhuǎn)字符串可以避免前綴相同的數(shù)據(jù)聚集在一起。例如:#用戶名
username="JohnDoe"
#反轉(zhuǎn)字符串
row_key=username[::-1]2.2時間戳和版本控制編碼HBase支持?jǐn)?shù)據(jù)的版本控制,每個單元格的數(shù)據(jù)可以有多個版本,通過時間戳來區(qū)分。時間戳可以自動由HBase生成,也可以由用戶自定義。自定義時間戳可以更好地控制數(shù)據(jù)的版本,例如:#當(dāng)前時間戳
timestamp=1628716800000
#用戶ID
user_id=12345
#操作類型(例如:'login')
operation="login"
#拼接RowKey
row_key=f"{user_id}_{operation}_{timestamp}"在上述例子中,RowKey包含了用戶ID、操作類型和時間戳,這樣可以確保每個操作都有一個唯一的版本,并且可以根據(jù)時間戳進(jìn)行查詢。2.3數(shù)據(jù)類型編碼方法HBase支持多種數(shù)據(jù)類型,但在存儲時,所有數(shù)據(jù)都會被轉(zhuǎn)換為字節(jié)序列。因此,了解如何編碼不同類型的數(shù)據(jù)對于優(yōu)化存儲和查詢效率非常重要。2.3.1整型編碼對于整型數(shù)據(jù),可以使用Python的struct模塊進(jìn)行編碼,例如:importstruct
#整型數(shù)據(jù)
integer_data=12345
#編碼為字節(jié)序列
encoded_data=struct.pack('>i',integer_data)2.3.2浮點型編碼浮點型數(shù)據(jù)同樣可以使用struct模塊進(jìn)行編碼,例如:#浮點型數(shù)據(jù)
float_data=123.45
#編碼為字節(jié)序列
encoded_data=struct.pack('>f',float_data)2.3.3字符串編碼字符串?dāng)?shù)據(jù)可以直接編碼為字節(jié)序列,但需要注意編碼方式,例如:#字符串?dāng)?shù)據(jù)
string_data="JohnDoe"
#編碼為字節(jié)序列
encoded_data=string_data.encode('utf-8')2.3.4布爾型編碼布爾型數(shù)據(jù)可以編碼為單個字節(jié),例如:#布爾型數(shù)據(jù)
bool_data=True
#編碼為字節(jié)序列
encoded_data=b'\x01'ifbool_dataelseb'\x00'2.3.5復(fù)合類型編碼對于復(fù)合類型的數(shù)據(jù),可以先將其分解為基本類型,然后分別編碼,最后拼接在一起,例如:#復(fù)合類型數(shù)據(jù)
composite_data={'user_id':12345,'timestamp':1628716800000}
#分別編碼
encoded_user_id=struct.pack('>i',composite_data['user_id'])
encoded_timestamp=struct.pack('>q',composite_data['timestamp'])
#拼接字節(jié)序列
encoded_data=encoded_user_id+encoded_timestamp在上述例子中,我們首先將user_id和timestamp分別編碼為字節(jié)序列,然后將這兩個字節(jié)序列拼接在一起,形成復(fù)合類型數(shù)據(jù)的編碼。通過以上編碼策略和方法,我們可以更有效地在HBase中存儲和檢索數(shù)據(jù),同時確保數(shù)據(jù)的均勻分布和版本控制。3HBase壓縮與編碼實踐3.1壓縮與編碼的性能影響在HBase中,數(shù)據(jù)壓縮和編碼是優(yōu)化存儲和查詢性能的關(guān)鍵技術(shù)。它們通過減少數(shù)據(jù)的物理存儲大小,從而降低磁盤I/O和網(wǎng)絡(luò)傳輸?shù)拈_銷,提高數(shù)據(jù)讀寫速度。HBase支持多種壓縮算法,如Gzip、LZO、Snappy等,以及多種編碼方式,如Plain、Prefix、Diff等。3.1.1壓縮算法Gzip:一種廣泛使用的壓縮算法,壓縮比高,但CPU消耗較大。LZO:提供較快的壓縮和解壓縮速度,壓縮比適中。Snappy:專為大數(shù)據(jù)設(shè)計,壓縮和解壓縮速度非??欤瑝嚎s比略低于Gzip。3.1.2編碼方式Plain:不進(jìn)行任何編碼,直接存儲數(shù)據(jù)。Prefix:對列族內(nèi)的列名進(jìn)行前綴編碼,減少存儲空間。Diff:對連續(xù)的單元格值進(jìn)行差值編碼,適用于數(shù)值型數(shù)據(jù)。3.1.3性能影響分析壓縮和編碼的選擇直接影響到HBase的讀寫性能。例如,使用Snappy壓縮可以顯著減少數(shù)據(jù)傳輸時間,但可能增加CPU負(fù)擔(dān)。Prefix編碼可以減少列名的重復(fù)存儲,但查詢時需要解碼,可能影響查詢速度。3.2最佳實踐案例分析3.2.1案例:日志數(shù)據(jù)存儲優(yōu)化假設(shè)我們有一個日志數(shù)據(jù)表,記錄了大量用戶訪問網(wǎng)站的詳細(xì)信息。每條記錄包含用戶ID、訪問時間、訪問頁面、停留時間等字段。由于數(shù)據(jù)量大,直接存儲會導(dǎo)致磁盤和網(wǎng)絡(luò)傳輸效率低下。實踐步驟選擇壓縮算法:由于日志數(shù)據(jù)量大,選擇Snappy壓縮算法,以平衡壓縮比和速度。選擇編碼方式:對用戶ID和訪問頁面使用Prefix編碼,減少列名的重復(fù)存儲。配置HBase:在HBase表創(chuàng)建時,指定壓縮和編碼方式。代碼示例//創(chuàng)建HBase表,指定使用Snappy壓縮和Prefix編碼
HBaseAdminadmin=newHBaseAdmin(conf);
HTableDescriptortableDescriptor=newHTableDescriptor(TableName.valueOf("Logs"));
HColumnDescriptorcolumnDescriptor=newHColumnDescriptor("logData");
columnDescriptor.setCompressionType(Compression.Algorithm.SNAPPY);
columnDescriptor.setBlockEncoding(BlockType.PREFIX);
tableDescriptor.addFamily(columnDescriptor);
admin.createTable(tableDescriptor);效果分析通過使用Snappy壓縮和Prefix編碼,日志數(shù)據(jù)的存儲空間顯著減少,查詢響應(yīng)時間也有所提升,特別是在大量數(shù)據(jù)讀取時,效果更為明顯。3.3壓縮與編碼在HBase查詢優(yōu)化中的應(yīng)用3.3.1查詢優(yōu)化策略在HBase中,壓縮和編碼不僅可以優(yōu)化存儲,還可以優(yōu)化查詢性能。例如,使用差值編碼(Diff)可以減少查詢時的數(shù)據(jù)解壓量,從而提高查詢速度。3.3.2實踐案例:用戶行為分析假設(shè)我們需要分析用戶在網(wǎng)站上的行為,包括點擊率、瀏覽時間等。這些數(shù)據(jù)通常以時間序列形式存儲,每分鐘記錄一次。實踐步驟選擇壓縮算法:使用LZO壓縮,以快速讀取大量時間序列數(shù)據(jù)。選擇編碼方式:對瀏覽時間使用Diff編碼,因為相鄰時間點的瀏覽時間差異通常較小,可以有效減少存儲空間。配置HBase:在創(chuàng)建表時,指定壓縮和編碼方式。代碼示例//創(chuàng)建HBase表,指定使用LZO壓縮和Diff編碼
HBaseAdminadmin=newHBaseAdmin(conf);
HTableDescriptortableDescriptor=newHTableDescriptor(TableName.valueOf("UserBehavior"));
HColumnDescriptorcolumnDescriptor=newHColumnDescriptor("behaviorData");
columnDescriptor.setCompressionType(Compression.Algorithm.LZO);
columnDescriptor.setBlockEncoding(BlockType.DIFF);
tableDescriptor.addFamily(columnDescriptor);
admin.createTable(tableDescriptor);效果分析通過使用LZO壓縮和Diff編碼,查詢時間序列數(shù)據(jù)時,HBase能夠更快地解壓和解碼數(shù)據(jù),從而提高查詢效率。特別是在分析大量用戶行為數(shù)據(jù)時,這種優(yōu)化策略能夠顯著提升數(shù)據(jù)分析的速度。通過上述案例分析,我們可以看到,在HBase中合理選擇和應(yīng)用壓縮與編碼技術(shù),能夠有效提升數(shù)據(jù)存儲和查詢的性能。在實際應(yīng)用中,應(yīng)根據(jù)數(shù)據(jù)特性和查詢需求,靈活選擇壓縮算法和編碼方式,以達(dá)到最佳的性能優(yōu)化效果。4高級HBase壓縮與編碼技術(shù)4.1自定義壓縮算法實現(xiàn)在HBase中,雖然提供了多種內(nèi)置的壓縮算法,如Gzip、LZO、Snappy等,但在特定的業(yè)務(wù)場景下,這些通用的壓縮算法可能無法滿足特定的數(shù)據(jù)壓縮需求。因此,HBase支持用戶自定義壓縮算法,以實現(xiàn)更高效的數(shù)據(jù)存儲和查詢。4.1.1原理自定義壓縮算法的實現(xiàn)主要依賴于Hadoop的press.CompressionCodec接口。用戶需要創(chuàng)建一個實現(xiàn)該接口的類,該類需要包含compress和decompress方法,用于數(shù)據(jù)的壓縮和解壓縮。此外,還需要實現(xiàn)press.CompressionCodecFactory接口,以便HBase能夠識別和使用自定義的壓縮算法。4.1.2示例代碼下面是一個簡單的自定義壓縮算法的實現(xiàn)示例:importorg.apache.hadoop.conf.Configuration;
importpress.CompressionCodec;
importpress.CompressionCodecFactory;
importpress.CompressionOutputStream;
importpress.DecompressionInputStream;
importjava.io.ByteArrayInputStream;
importjava.io.ByteArrayOutputStream;
importjava.io.IOException;
//自定義壓縮算法類
publicclassCustomCompressionCodecimplementsCompressionCodec{
@Override
publicCompressionOutputStreamcreateOutputStream(Configurationconf)throwsIOException{
returnnewCustomCompressionOutputStream();
}
@Override
publicDecompressionInputStreamcreateInputStream(Configurationconf,DecompressionInputStreamin)throwsIOException{
returnnewCustomDecompressionInputStream(in);
}
//自定義壓縮輸出流
privatestaticclassCustomCompressionOutputStreamextendsCompressionOutputStream{
@Override
publicvoidwrite(intb)throwsIOException{
//實現(xiàn)壓縮邏輯
}
@Override
publicvoidwrite(byte[]b,intoff,intlen)throwsIOException{
//實現(xiàn)壓縮邏輯
}
}
//自定義解壓縮輸入流
privatestaticclassCustomDecompressionInputStreamextendsDecompressionInputStream{
publicCustomDecompressionInputStream(DecompressionInputStreamin){
super(in);
}
@Override
publicintread()throwsIOException{
//實現(xiàn)解壓縮邏輯
return0;
}
@Override
publicintread(byte[]b,intoff,intlen)throwsIOException{
//實現(xiàn)解壓縮邏輯
return0;
}
}
}
//自定義壓縮算法工廠類
publicclassCustomCompressionCodecFactoryextendsCompressionCodecFactory{
publicCustomCompressionCodecFactory(Configurationconf){
super(conf);
}
@Override
protectedClass<?extendsCompressionCodec>getCodecClass(Stringname){
if("custom".equals(name)){
returnCustomCompressionCodec.class;
}
returnnull;
}
}4.1.3數(shù)據(jù)樣例假設(shè)我們有以下數(shù)據(jù)樣例:原始數(shù)據(jù):"Hello,World!ThisisatestmessageforHBasecustomcompression."在自定義壓縮算法中,我們可以實現(xiàn)特定的壓縮邏輯,例如,使用簡單的位移和位操作來壓縮數(shù)據(jù)。然后,使用上述代碼中的CustomCompressionCodec類來壓縮和解壓縮數(shù)據(jù)。4.1.4描述在上述代碼中,我們定義了一個CustomCompressionCodec類,它實現(xiàn)了CompressionCodec接口。在CustomCompressionCodec類中,我們定義了兩個內(nèi)部類CustomCompressionOutputStream和CustomDecompressionInputStream,分別用于數(shù)據(jù)的壓縮和解壓縮。然而,為了簡化示例,我們沒有在這些內(nèi)部類中實現(xiàn)具體的壓縮和解壓縮邏輯。此外,我們還定義了一個CustomCompressionCodecFactory類,它實現(xiàn)了CompressionCodecFactory接口。在CustomCompressionCodecFactory類中,我們重寫了getCodecClass方法,以便HBase能夠識別和使用自定義的壓縮算法。4.2編碼與壓縮在大數(shù)據(jù)場景下的優(yōu)化在大數(shù)據(jù)場景下,HBase的數(shù)據(jù)量通常非常大,因此,編碼和壓縮的優(yōu)化對于提高數(shù)據(jù)存儲和查詢的效率至關(guān)重要。以下是一些常見的優(yōu)化策略:選擇合適的編碼方式:HBase支持多種編碼方式,如Prefix、Diff、RLE等。選擇合適的編碼方式可以顯著減少數(shù)據(jù)的存儲空間,從而提高數(shù)據(jù)的壓縮效率。使用高效的壓縮算法:在HBase中,壓縮算法的選擇對數(shù)據(jù)的壓縮效率和查詢性能有重要影響。通常,Snappy和LZO等壓縮算法在大數(shù)據(jù)場景下表現(xiàn)較好,因為它們在提供較高壓縮比的同時,也保持了較快的壓縮和解壓縮速度。使用塊緩存:HBase的塊緩存可以將經(jīng)常訪問的數(shù)據(jù)緩存在內(nèi)存中,從而避免頻繁的磁盤I/O操作。在大數(shù)據(jù)場景下,合理使用塊緩存可以顯著提高數(shù)據(jù)的查詢性能。使用行級壓縮:在HBase中,可以使用行級壓縮來進(jìn)一步減少數(shù)據(jù)的存儲空間。行級壓縮可以將整個HBase行壓縮為一個單獨的壓縮塊,從而提高數(shù)據(jù)的壓縮效率。4.2.1示例代碼下面是一個使用Snappy壓縮算法和Prefix編碼方式的HBase表創(chuàng)建示例:importorg.apache.hadoop.hbase.HBaseConfiguration;
importorg.apache.hadoop.hbase.TableName;
importorg.apache.hadoop.hbase.client.Admin;
importorg.apache.hadoop.hbase.client.Connection;
importorg.apache.hadoop.hbase.client.ConnectionFactory;
importorg.apache.hadoop.hbase.util.Bytes;
//創(chuàng)建HBase表
publicclassCreateTableWithSnappyAndPrefix{
publicstaticvoidmain(String[]args)throwsException{
Configurationconf=HBaseConfiguration.create();
Connectionconnection=ConnectionFactory.createConnection(conf);
Adminadmin=connection.getAdmin();
HTableDescriptortableDescriptor=newHTableDescriptor(TableName.valueOf("testTable"));
HColumnDescriptorcolumnDescriptor=newHColumnDescriptor("cf");
columnDescriptor.s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 物業(yè)維修工程委托審價合同
- 商標(biāo)授權(quán)試用合同范例
- 產(chǎn)品制作生產(chǎn)合同范例
- 平房拆除重建合同范例
- 合作養(yǎng)蜂合同范例
- 攪拌站回收合同范例
- 建材涂料工程合同范例
- 欠貨款抵押合同范例
- 五金下游合同范例
- 包裝修轉(zhuǎn)讓合同范例
- 大學(xué)生心理健康教育-大學(xué)生心理健康導(dǎo)論
- 糖尿病病人的麻醉
- GB/T 29309-2012電工電子產(chǎn)品加速應(yīng)力試驗規(guī)程高加速壽命試驗導(dǎo)則
- GB 29216-2012食品安全國家標(biāo)準(zhǔn)食品添加劑丙二醇
- 柔弱的人課文課件
- 動物寄生蟲病學(xué)課件
- 電梯曳引系統(tǒng)設(shè)計-畢業(yè)設(shè)計
- 瑪帕導(dǎo)條刀具課件
- 班會課件 勿以惡小而為之勿以善小而不為
- 中醫(yī)針灸治療中風(fēng)后語言障礙病例分析專題報告
- 2022年學(xué)校寒假德育特色作業(yè)實踐方案(詳細(xì)版)
評論
0/150
提交評論