日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HBase源码分析之HRegion上compact流程分析(三)

發布時間:2025/1/21 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HBase源码分析之HRegion上compact流程分析(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? 在《HBase源碼分析之HRegion上compact流程分析(二)》一文中,我們沒有講解真正執行合并的CompactionContext的compact()方法。現在我們來分析下它的具體實現。

? ? ? ? 首先,CompactionContext表示合并的上下文信息,它只是一個抽象類,其compact()并沒有實現,代碼如下:

/*** Runs the compaction based on current selection. select/forceSelect must have been called.* @return The new file paths resulting from compaction.*/public abstract List<Path> compact() throws IOException;? ? ? ? 那么,我們來找下它的實現類。它一共有兩種實現類:DefaultCompactionContext和StripeCompaction,今天我們以DefaultCompactionContext為例來講解。

? ? ? ? 首先看下DefaultCompactionContext中compact()方法的實現:

@Overridepublic List<Path> compact() throws IOException {return compactor.compact(request);}? ? ? ? 這個compactor可以根據參數hbase.hstore.defaultengine.compactor.class配置,但是默認實現為DefaultCompactor。那么,接下來,我們看下它的實現:

/*** Do a minor/major compaction on an explicit set of storefiles from a Store.* 在一個Store中明確的storefiles集合中執行一個minor或者major合并*/public List<Path> compact(final CompactionRequest request) throws IOException {// 從請求中獲取文件詳情fd,fd是FileDetails類型FileDetails fd = getFileDetails(request.getFiles(), request.isAllFiles());// 構造合并過程追蹤器CompactionProgressthis.progress = new CompactionProgress(fd.maxKeyCount);// Find the smallest read point across all the Scanners.// 找到scanners中的最小的可讀點,實際上就是找到最小能夠讀取數據的點long smallestReadPoint = getSmallestReadPoint();List<StoreFileScanner> scanners;Collection<StoreFile> readersToClose;// 根據參數hbase.regionserver.compaction.private.readers確定是否使用私有readersif (this.conf.getBoolean("hbase.regionserver.compaction.private.readers", false)) {// clone all StoreFiles, so we'll do the compaction on a independent copy of StoreFiles,// HFileFiles, and their readers// 克隆所有的StoreFiles,以便我們將在StoreFiles、HFileFiles以及它們的readers等一個獨立的副本上執行合并// 根據請求中待合并文件的數目創建一個StoreFile列表:readersToClosereadersToClose = new ArrayList<StoreFile>(request.getFiles().size());// 將待合并文件復制一份加入readersToClose列表for (StoreFile f : request.getFiles()) {readersToClose.add(new StoreFile(f));}// 根據readersToClose列表,即待合并文件的副本創建文件瀏覽器FileScannersscanners = createFileScanners(readersToClose, smallestReadPoint);} else {// 創建空的列表readersToClosereadersToClose = Collections.emptyList();// 根據實際請求中的待合并文件列表創建文件瀏覽器FileScannersscanners = createFileScanners(request.getFiles(), smallestReadPoint);}StoreFile.Writer writer = null;List<Path> newFiles = new ArrayList<Path>();boolean cleanSeqId = false;IOException e = null;try {InternalScanner scanner = null;try {/* Include deletes, unless we are doing a compaction of all files */// 確定scan類型scanType:// 如果compact請求是MAJOR或ALL_FILES合并,則scanType為COMPACT_DROP_DELETES;// 如果compact請求是MINOR合并,則scanType為COMPACT_RETAIN_DELETES。ScanType scanType =request.isAllFiles() ? ScanType.COMPACT_DROP_DELETES : ScanType.COMPACT_RETAIN_DELETES;// 如果有協處理器,調用協處理器的preCreateCoprocScanner()方法scanner = preCreateCoprocScanner(request, scanType, fd.earliestPutTs, scanners);if (scanner == null) {// 如果協處理器中未創建scanner,調用createScanner()方法創建一個scanner = createScanner(store, scanners, scanType, smallestReadPoint, fd.earliestPutTs);}// 如果有協處理器,調用協處理器的preCompact()方法scanner = postCreateCoprocScanner(request, scanType, scanner);if (scanner == null) {// NULL scanner returned from coprocessor hooks means skip normal processing.return newFiles;}// Create the writer even if no kv(Empty store file is also ok),// because we need record the max seq id for the store file, see HBASE-6059// 確定最小讀取點smallestReadPointif(fd.minSeqIdToKeep > 0) {smallestReadPoint = Math.min(fd.minSeqIdToKeep, smallestReadPoint);cleanSeqId = true;}// When all MVCC readpoints are 0, don't write them.// See HBASE-8166, HBASE-12600, and HBASE-13389.// 調用HStore的createWriterInTmp()方法,獲取writerwriter = store.createWriterInTmp(fd.maxKeyCount, this.compactionCompression, true,fd.maxMVCCReadpoint > 0, fd.maxTagsLength > 0);// 調用performCompaction()方法,執行合并boolean finished = performCompaction(scanner, writer, smallestReadPoint, cleanSeqId);// 如果沒有完成合并if (!finished) {// 關閉writerwriter.close();// 刪除writer中的臨時文件store.getFileSystem().delete(writer.getPath(), false);writer = null;// 拋出異常throw new InterruptedIOException( "Aborting compaction of store " + store +" in region " + store.getRegionInfo().getRegionNameAsString() +" because it was interrupted.");}} finally {// 關閉scannerif (scanner != null) {scanner.close();}}} catch (IOException ioe) {e = ioe;// Throw the exceptionthrow ioe;}finally {try {if (writer != null) {if (e != null) {// 無異常的話,關閉writerwriter.close();} else {// 存在異常的話,寫入元數據,關閉writer,并將寫入地址加入newFileswriter.appendMetadata(fd.maxSeqId, request.isAllFiles());writer.close();newFiles.add(writer.getPath());}}} finally {// 依次關閉readersToClose中StoreFile的Readerfor (StoreFile f : readersToClose) {try {f.closeReader(true);} catch (IOException ioe) {LOG.warn("Exception closing " + f, ioe);}}}}// 返回newFilesreturn newFiles;}? ? ? ? 總結下DefaultCompactor的compact()方法的處理流程,大體有如下幾點:

? ? ? ? 1、通過父類Compactor的getFileDetails()方法從請求中獲取文件詳情fd,fd是FileDetails類型,這個FileDetails類型的文件詳情中主要包含如下信息:

? ? ? ? ? ? ? (1)合并之后總的keyvalue數目:maxKeyCount;

? ? ? ? ? ? ? (2)如果是major合并,最早的Put時間戳earliestPutTs;

? ? ? ? ? ? ? (3)合并時文件中最大的序列號maxSeqId;

? ? ? ? ? ? ? (4)相關文件中最新的MemStore數據讀取點maxMVCCReadpoint;

? ? ? ? ? ? ? (5)最大的tag長度maxTagsLength;

? ? ? ? ? ? ? (6)在major合并期間需要保持的最小序列號minSeqIdToKeep。

? ? ? ? 2、構造合并過程追蹤器CompactionProgress,用于追蹤合并過程;

? ? ? ? 3、通過父類Compactor的getSmallestReadPoint()方法找到所有scanners中的最小的可讀點,實際上就是找到最小能夠讀取數據的點smallestReadPoint;

? ? ? ? 4、根據參數hbase.regionserver.compaction.private.readers確定是否使用私有readers,默認為false不使用:

? ? ? ? ? ? ? 4.1、如果需要使用,即參數配置為true的話,克隆所有的StoreFiles,以便我們將在StoreFiles、HFileFiles以及它們的readers等一個獨立的副本上執行合并;

? ? ? ? ? ? ? ? ? ? ? ?4.1.1、根據請求中待合并文件的數目創建一個StoreFile列表:readersToClose;

? ? ? ? ? ? ? ? ? ? ? ?4.1.2、將請求中待合并文件逐一復制加入readersToClose列表;

? ? ? ? ? ? ? ? ? ? ? ?4.1.3、根據readersToClose列表,即待合并文件的副本創建文件瀏覽器FileScanners;

? ? ? ? ? ? ? 4.2、如果不需要使用,即參數配置為false的話,使用請求中實際發送的文件列表;

? ? ? ? ? ? ? ? ? ? ? ?4.2.1、創建空的列表readersToClose;

? ? ? ? ? ? ? ? ? ? ? ?4.2.2、根據實際請求中的待合并文件列表創建文件瀏覽器FileScanners;

? ? ? ? ?5、根據compact請求類型確定scan類型scanType:

? ? ? ? ? ? ? ?如果compact請求是MAJOR或ALL_FILES合并,則scanType為COMPACT_DROP_DELETES;

? ? ? ? ? ? ? ?如果compact請求是MINOR合并,則scanType為COMPACT_RETAIN_DELETES。

? ? ? ? ?6、如果有協處理器,調用協處理器的preCreateCoprocScanner()方法,獲得scanner,如果協處理器中未創建scanner,調用createScanner()方法創建一個;

? ? ? ? ?7、如果有協處理器,調用協處理器的preCompact()方法;

? ? ? ? ?8、根據之前獲取的smallestReadPoint和文件詳情fd中的minSeqIdToKeep確定最小讀取點smallestReadPoint,并置狀態位cleanSeqId;

? ? ? ? ?9、調用HStore的createWriterInTmp()方法,獲取writer;

? ? ? ? 10、調用父類Compactor的performCompaction()方法,利用scanner、writer、smallestReadPoint、cleanSeqId執行合并:

? ? ? ? ? ? ? ? 實際上就是利用scanner讀取舊文件數據,利用writer寫入新文件數據。

? ? ? ? 11、如果沒有完成合并:關閉writer、刪除writer中的臨時文件并拋出異常;

? ? ? ? 12、關閉scanner;

? ? ? ? 13、無異常的話,關閉writer;存在異常的話,寫入元數據,關閉writer,并將寫入地址加入newFiles;

? ? ? ? 14、依次關閉readersToClose中StoreFile的Reader;

? ? ? ? 15、返回newFiles。

? ? ? ? 大體流程就是如此。針對其中的某些細節,我們逐一進行分析。

? ? ? ? 首先說下這個文件詳情FileDetails,它是通過getFileDetails()方法獲取的。文件詳情FileDetails類定義如下:

/** The sole reason this class exists is that java has no ref/out/pointer parameters. */protected static class FileDetails {/** Maximum key count after compaction (for blooms) */// 合并之后總的keyvalue數目public long maxKeyCount = 0;/** Earliest put timestamp if major compaction */// 如果是major合并,最早的Put時間戳earliestPutTspublic long earliestPutTs = HConstants.LATEST_TIMESTAMP;/** The last key in the files we're compacting. */// 合并時文件中最大的序列號public long maxSeqId = 0;/** Latest memstore read point found in any of the involved files */// 相關文件中最新的MemStore數據讀取點maxMVCCReadpointpublic long maxMVCCReadpoint = 0;/** Max tags length**/// 最大的tag長度maxTagsLengthpublic int maxTagsLength = 0;/** Min SeqId to keep during a major compaction **/// 在major合并期間需要保持的最小序列號minSeqIdToKeeppublic long minSeqIdToKeep = 0;}

? ? ? ? 而它的獲取方法如下:

/*** Extracts some details about the files to compact that are commonly needed by compactors.* 提取文件合并的一些細節* @param filesToCompact Files.* @param allFiles Whether all files are included for compaction* @return The result.*/protected FileDetails getFileDetails(Collection<StoreFile> filesToCompact, boolean allFiles) throws IOException {// 構造一個FileDetails實例fdFileDetails fd = new FileDetails();// 計算保持MVCC的最新HFile時間戳:當前時間-24小時 * keepSeqIdPeriod// keepSeqIdPeriod為一個參數,即被指定的在major合并期間MVCC值可以保持多少天long oldestHFileTimeStampToKeepMVCC = System.currentTimeMillis() - (1000L * 60 * 60 * 24 * this.keepSeqIdPeriod); // 遍歷需要合并的文件for (StoreFile file : filesToCompact) {// 如果allFiles為true,即所有文件都需要檢測,且文件的修改時間小于上述保持MVCC的最新HFile時間戳if(allFiles && (file.getModificationTimeStamp() < oldestHFileTimeStampToKeepMVCC)) {// when isAllFiles is true, all files are compacted so we can calculate the smallest // MVCC value to keep// 如果文件細節中需要保持的最小序列號小于文件MemStore的時間戳if(fd.minSeqIdToKeep < file.getMaxMemstoreTS()) {// 將文件MemStore的時間戳賦值給fd的需要保持的最小序列號minSeqIdToKeepfd.minSeqIdToKeep = file.getMaxMemstoreTS();}}// 獲取文件的最大序列號IDlong seqNum = file.getMaxSequenceId();// 賦值給文件細節fd中的maxSeqId,記錄待合并文件的最大序列號IDfd.maxSeqId = Math.max(fd.maxSeqId, seqNum);// 獲取ReaderStoreFile.Reader r = file.getReader();if (r == null) {LOG.warn("Null reader for " + file.getPath());continue;}// NOTE: use getEntries when compacting instead of getFilterEntries, otherwise under-sized// blooms can cause progress to be miscalculated or if the user switches bloom// type (e.g. from ROW to ROWCOL)// 獲取文件中的keyvalue數量,實際上就是列的數量,// HBase底層對每個列都是按照keyvalue格式存儲的,key包含rowkey+column family+quality+tm等,value即列值long keyCount = r.getEntries();// 累加keyvalue數目maxKeyCountfd.maxKeyCount += keyCount;// calculate the latest MVCC readpoint in any of the involved store files// 計算所有相關存儲文件的最新mvcc讀取點maxMVCCReadpoint// 先加載文件信息fileInfoMap<byte[], byte[]> fileInfo = r.loadFileInfo();byte tmp[] = null;// Get and set the real MVCCReadpoint for bulk loaded files, which is the// SeqId number.// 如果是Bulk導入的,maxMVCCReadpoint為fd的maxMVCCReadpoint和文件SequenceID中較大者if (r.isBulkLoaded()) {fd.maxMVCCReadpoint = Math.max(fd.maxMVCCReadpoint, r.getSequenceID());}else {// 否則,讀取文件信息中最大的memstore時間戳MAX_MEMSTORE_TS_KEYtmp = fileInfo.get(HFileWriterV2.MAX_MEMSTORE_TS_KEY);if (tmp != null) {// maxMVCCReadpoint就是fd的maxMVCCReadpoint和文件信息中最大的memstore時間戳MAX_MEMSTORE_TS_KEY中較大者fd.maxMVCCReadpoint = Math.max(fd.maxMVCCReadpoint, Bytes.toLong(tmp));}}// 更新最大標簽長度maxTagsLengthtmp = fileInfo.get(FileInfo.MAX_TAGS_LEN);if (tmp != null) {fd.maxTagsLength = Math.max(fd.maxTagsLength, Bytes.toInt(tmp));}// If required, calculate the earliest put timestamp of all involved storefiles.// This is used to remove family delete marker during compaction.long earliestPutTs = 0;// 獲取最早的Put時間戳earliestPutTsif (allFiles) {tmp = fileInfo.get(StoreFile.EARLIEST_PUT_TS);if (tmp == null) {// There's a file with no information, must be an old one// assume we have very old putsfd.earliestPutTs = earliestPutTs = HConstants.OLDEST_TIMESTAMP;} else {earliestPutTs = Bytes.toLong(tmp);fd.earliestPutTs = Math.min(fd.earliestPutTs, earliestPutTs);}}if (LOG.isDebugEnabled()) {LOG.debug("Compacting " + file +", keycount=" + keyCount +", bloomtype=" + r.getBloomFilterType().toString() +", size=" + StringUtils.humanReadableInt(r.length()) +", encoding=" + r.getHFileReader().getDataBlockEncoding() +", seqNum=" + seqNum +(allFiles ? ", earliestPutTs=" + earliestPutTs: ""));}}// 返回合并細節fdreturn fd;}? ? ? ? 接下來再看下找到scanners中的最小的可讀點,實際上就是找到最小能夠讀取數據的點,它是通過父類Compactor的getSmallestReadPoint()方法實現的,代碼如下:

protected long getSmallestReadPoint() {// 獲取的是HStore中的SmallestReadPointreturn store.getSmallestReadPoint();}? ? ? ? 可以看出,父類的該方法實際上還是通過HStore中的getSmallestReadPoint()方法實現的,如下:

@Overridepublic long getSmallestReadPoint() {// 獲取的是Region中的SmallestReadPoint,因為HBase是行級事務,SmallestReadPoint應該也是行級的return this.region.getSmallestReadPoint();}? ? ? ? 而HStore實際上最終獲取的是Region中的SmallestReadPoint,這也從側面反映了那個我們熟知的問題:因為HBase是行級事務,SmallestReadPoint應該也是行級的。而具體的SmallestReadPoint該如何獲取,我們在以后的多版本控制協議MVCC中再細講。

? ? ? ? 接下來,我們再看下如何創建文件瀏覽器FileScanners,它是通過父類Compactor的createFileScanners()方法來構造的,代碼如下:

/*** Creates file scanners for compaction.* @param filesToCompact Files.* @return Scanners.*/protected List<StoreFileScanner> createFileScanners(final Collection<StoreFile> filesToCompact, long smallestReadPoint) throws IOException {return StoreFileScanner.getScannersForStoreFiles(filesToCompact, false, false, true,smallestReadPoint);}? ? ? ? 它是一個專門為合并創建scanner的方法,這個scanner區別于客戶端的scanner,我們繼續看StoreFileScanner的getScannersForStoreFiles()方法,如下:

/*** Return an array of scanners corresponding to the given set of store files,* And set the ScanQueryMatcher for each store file scanner for further* optimization*/public static List<StoreFileScanner> getScannersForStoreFiles(Collection<StoreFile> files, boolean cacheBlocks, boolean usePread,boolean isCompaction, ScanQueryMatcher matcher, long readPt) throws IOException {List<StoreFileScanner> scanners = new ArrayList<StoreFileScanner>(files.size());// 遍歷StoreFile文件filesfor (StoreFile file : files) {// 獲取每個文件的ReaderStoreFile.Reader r = file.createReader();// 根據Reader獲取StoreFileScanner類型的scanner,這個scanner專門用于讀取StoreFileStoreFileScanner scanner = r.getStoreFileScanner(cacheBlocks, usePread,isCompaction, readPt);scanner.setScanQueryMatcher(matcher);// 加入scanner列表scannersscanners.add(scanner);}// 返回scanner列表return scanners;}? ? ? ? 很簡單,不再贅述,讀者可以自己閱讀源碼。

? ? ? ? 繼續,我們再看下如果獲取一個內部InternalScanner類型的scanner,它是通過createScanner()來獲取的,代碼如下:

/*** 創建一個scanner* * @param store store* @param scanners Store file scanners.* @param scanType Scan type.* @param smallestReadPoint Smallest MVCC read point.* @param earliestPutTs Earliest put across all files.* @return A compaction scanner.*/protected InternalScanner createScanner(Store store, List<StoreFileScanner> scanners,ScanType scanType, long smallestReadPoint, long earliestPutTs) throws IOException {// 構造一個Scan實例scanScan scan = new Scan();// 設置最大版本號,即列簇被設置的最大版本號(是不是從這里就能看出,compact時會做數據清理工作呢,O(∩_∩)O)scan.setMaxVersions(store.getFamily().getMaxVersions());// 返回一個StoreScanner實例return new StoreScanner(store, store.getScanInfo(), scan, scanners,scanType, smallestReadPoint, earliestPutTs);}? ? ? ? 這里的scanner,實際上是StoreScanner類型的實例,它是針對Store的內部Scanner,而且,這里有一個重點,創建scan時會設置最大版本號,即列簇被設置的最大版本號,那么我們是不是從這里就能看出,compact時會做數據清理工作呢,答案當然是肯定的。所以HBase在數據修改時,并不是簡單的刪除,而是增加一個版本,而過期數據則會在compact過程中,通過scanner設置最大版本號的方式來過濾掉,這種處理方式是很高效的,它體現了HBase低延遲的特點。

? ? ? ? 有了讀數據的scanner,我們接著來看下寫數據的writer。畢竟數據得有讀有寫,才能將舊文件合并成新文件,而writer是通過HStore的createWriterInTmp()方法來創建的,如下:

/** @param maxKeyCount* @param compression Compression algorithm to use* @param isCompaction whether we are creating a new file in a compaction* @param includesMVCCReadPoint - whether to include MVCC or not* @param includesTag - includesTag or not* @return Writer for a new StoreFile in the tmp dir.*/@Overridepublic StoreFile.Writer createWriterInTmp(long maxKeyCount, Compression.Algorithm compression,boolean isCompaction, boolean includeMVCCReadpoint, boolean includesTag)throws IOException {final CacheConfig writerCacheConf;// 是否為合并if (isCompaction) {// 如果是合并,不在writerCacheConf上緩存數據// Don't cache data on write on compactions.writerCacheConf = new CacheConfig(cacheConf);writerCacheConf.setCacheDataOnWrite(false);} else {writerCacheConf = cacheConf;}InetSocketAddress[] favoredNodes = null;// 獲取有利節點if (region.getRegionServerServices() != null) {favoredNodes = region.getRegionServerServices().getFavoredNodesForRegion(region.getRegionInfo().getEncodedName());}// 創建HFile上下文HFileContextHFileContext hFileContext = createFileContext(compression, includeMVCCReadpoint, includesTag,cryptoContext);// 創建StoreFile的StoreFile,需要使用上述信息,比如文件系統、文件路徑、合并器、最大keyvalue數目、有利節點等StoreFile.Writer w = new StoreFile.WriterBuilder(conf, writerCacheConf,this.getFileSystem())// 文件系統.withFilePath(fs.createTempName())// 文件路徑.withComparator(comparator)// 合并器.withBloomType(family.getBloomFilterType()).withMaxKeyCount(maxKeyCount)// 最大keyvalue數目.withFavoredNodes(favoredNodes)// 有利節點.withFileContext(hFileContext)// HFile上下文信息.build();return w;}? ? ? ? 這個writer本質上是StoreFile的Writer,它是針對存儲文件的寫入者,其中包含很多關鍵信息,比如文件系統、文件路徑、合并器、最大keyvalue數目、有利節點、HFile上下文信息等。

? ? ? ? 有了scanner,可以讀數據了,又有了writer,也可以寫數據了,那么我們就可以開始合并了:由舊文件讀取數據,往新文件寫入數據。我們看下Compactor的performCompaction()方法,代碼如下:

/*** Performs the compaction.* 執行合并* * @param scanner Where to read from.* @param writer Where to write to.* @param smallestReadPoint Smallest read point.* @param cleanSeqId When true, remove seqId(used to be mvcc) value which is <= smallestReadPoint* @return Whether compaction ended; false if it was interrupted for some reason.*/protected boolean performCompaction(InternalScanner scanner,CellSink writer, long smallestReadPoint, boolean cleanSeqId) throws IOException {// 已寫字節數long bytesWritten = 0;// 處于寫過程的字節數long bytesWrittenProgress = 0;// Since scanner.next() can return 'false' but still be delivering data,// we have to use a do/while loop.// Cell列表List<Cell> cells = new ArrayList<Cell>();// 周期性檢測的閾值:合并已被處理的數據量大小,取參數hbase.hstore.close.check.interval,默認為10Mlong closeCheckInterval = HStore.getCloseCheckInterval();long lastMillis = 0;if (LOG.isDebugEnabled()) {lastMillis = EnvironmentEdgeManager.currentTime();}long now = 0;// 進入一個do...while循環,一直循環的條件是hasMore為true,即scanner中還有數據boolean hasMore;do {// scanner中是否還存在數據,取出到cells中hasMore = scanner.next(cells, compactionKVMax);if (LOG.isDebugEnabled()) {now = EnvironmentEdgeManager.currentTime();}// output to writer:// 遍歷cells,寫入writerfor (Cell c : cells) {if (cleanSeqId && c.getSequenceId() <= smallestReadPoint) {CellUtil.setSequenceId(c, 0);}// 寫入writerwriter.append(c);// keyvalue大小int len = KeyValueUtil.length(c);// 計數器累加:kv累計數目和累計大小++progress.currentCompactedKVs;progress.totalCompactedSize += len;if (LOG.isDebugEnabled()) {bytesWrittenProgress += len;}// check periodically to see if a system stop is requested// 周期性檢測是否一個系統停止被請求if (closeCheckInterval > 0) {// 累加已寫字節數bytesWrittenbytesWritten += len;// 如果已寫字節數bytesWritten大于closeCheckIntervalif (bytesWritten > closeCheckInterval) {// 重置已寫字節數bytesWritten bytesWritten = 0;// 判斷HStore是否可寫,不可寫的話,說明一個system stop請求已發起,則通過progress取消合并if (!store.areWritesEnabled()) {progress.cancel();return false;}}}}// Log the progress of long running compactions every minute if// logging at DEBUG levelif (LOG.isDebugEnabled()) {if ((now - lastMillis) >= 60 * 1000) {LOG.debug("Compaction progress: " + progress + String.format(", rate=%.2f kB/sec",(bytesWrittenProgress / 1024.0) / ((now - lastMillis) / 1000.0)));lastMillis = now;bytesWrittenProgress = 0;}}// 情況cell列表cells.clear();} while (hasMore);// 合并過程progress標記已完成progress.complete();return true;}? ? ? ? 這個合并執行的過程還是比較簡單的,它通過一個do...while循環,不斷的從scanner中讀取數據,放入cell列表,然后遍歷cells,將Cell依次寫入writer,并累加kv數目和大小,直到scanner中數據被處理完。如此,舊文件數據不斷的被讀取出來,然后將其不斷的寫入新文件,最好通過合并過程progress標記合并已完成。大致就是這個流程。

? ? ? ? 這里有個需要特別說明的地方,在數據合并過程中,還需要周期性的檢測是否有外部發起系統關系的請求,如果是的話,則需要取消合并。這個周期性不是針對時間的,而是針對一個已合并數據量的閾值closeCheckInterval,這個closeCheckInterval取自參數hbase.hstore.close.check.interval,默認為10M。在合并過程中,被合并數據大小bytesWritten不斷的被累加,直到超過閾值closeCheckInterval,清空,并且根據HStore的可寫狀態來判斷是否有外部發起系統停止的請求,如果有的話,通過progress取消合并,否則繼續進入下一個累加至閾值再進行判斷的周期。

? ? ? ? 接下來,根據上述合并的結果finished,來判斷后續處理步驟:如果沒有完成合并:關閉writer、刪除writer中的臨時文件并拋出異常。

? ? ? ? 最好,如果存在異常e,寫入元數據,關閉writer,并將寫入地址加入newFiles;如果不存在異常e,則關閉writer,返回合并后的文件列表newFiles。不管結果如何,最終依次關閉readersToClose中StoreFile的Reader。

? ? ? ? 至此,整個HRegion中精確到HStore上的compact流程就分析完畢了。限于篇幅的原因,可能部分細節簡單掠過或者沒有提及,留待以后再慢慢分析吧!






? ? ? ??







總結

以上是生活随笔為你收集整理的HBase源码分析之HRegion上compact流程分析(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

在线岛国av | 91欧美国产| www.五月激情.com | 日批网站在线观看 | 国产成人三级一区二区在线观看一 | 亚洲国产精久久久久久久 | 国产黄视频在线观看 | 国产成人一区二区在线观看 | 欧美性脚交 | 91成人久久| 91在线免费看片 | 五月婷婷丁香综合 | 超碰97公开 | 丁香激情五月 | 8x成人在线 | 午夜久久福利影院 | 欧洲亚洲国产视频 | 国产午夜精品免费一区二区三区视频 | 国产破处在线视频 | 日韩va在线观看 | 国产精品久久久久免费观看 | 91精品在线麻豆 | 黄p网站在线观看 | 黄色av高清| 午夜国产福利在线 | 日韩午夜视频在线观看 | 亚洲精品66 | 人人干人人干人人干 | 久久成人午夜视频 | 久草精品电影 | 亚洲综合成人av | 91探花国产综合在线精品 | 久久国产精品免费视频 | 亚洲精品国产综合久久 | 粉嫩av一区二区三区四区五区 | 91色偷偷| 国产五月天婷婷 | 免费看国产曰批40分钟 | 99精品观看| 97视频在线观看免费 | 亚洲三级黄色 | 99精品视频在线观看视频 | 久久综合射 | 欧美性性网 | 99视频偷窥在线精品国自产拍 | 午夜精品久久久久久久久久 | 国产黄色片一级 | 国内小视频在线观看 | 亚洲综合色站 | 激情五月婷婷综合网 | 国产精品美女久久久久久久 | 日韩三级.com | 一本一道久久a久久精品 | 91亚瑟视频 | 久久爱综合 | 美女激情影院 | 精品二区视频 | 欧美日韩高清一区二区三区 | 91麻豆高清视频 | 91视频免费网址 | 99 精品 在线| 亚洲黄色app | 国产区精品区 | 欧美一二三在线 | 亚洲免费资源 | 特级西西人体444是什么意思 | 偷拍区另类综合在线 | 综合网在线视频 | 91精品国产99久久久久久红楼 | 欧美精品日韩 | 久久久久久欧美二区电影网 | 性色av一区二区三区在线观看 | 五月婷婷六月丁香 | 欧洲亚洲激情 | 国产麻豆精品久久一二三 | 在线观看日韩免费视频 | 96亚洲精品久久久蜜桃 | 久久亚洲人 | 少妇搡bbbb搡bbb搡忠贞 | 麻豆av一区二区三区在线观看 | 亚洲精品在线视频播放 | 在线黄色av| 久久免费大片 | 婷婷六月在线 | 成人毛片一区 | 国产成人av电影 | 天天色天| 国产99久久久久久免费看 | 色香蕉视频 | 国产精品久久久久久久久久久久久久 | 在线观看爱爱视频 | 五月婷婷操 | 欧美日韩精品国产 | 久久久免费播放 | 亚洲六月丁香色婷婷综合久久 | 有码中文字幕在线观看 | 九九国产精品视频 | 久久字幕精品一区 | 91福利社区在线观看 | 国产精品入口久久 | 日韩av电影免费在线观看 | 国产精品99蜜臀久久不卡二区 | 99在线观看 | 久久最新 | 日本三级吹潮在线 | 日韩中文字幕免费 | aaa毛片视频| 91亚洲影院 | 国产不卡在线 | 日韩精品极品视频 | 国产v视频| 精品国产一区二区三区av性色 | 91传媒在线观看 | 日日日操操 | 人人干干人人 | 婷婷在线播放 | 久久色网站 | av免费网站观看 | av午夜电影 | av字幕在线 | 亚洲资源 | 国产精品2018| 久久久久久久久久久久电影 | 久久在草| 色婷婷国产| 亚洲六月丁香色婷婷综合久久 | 六月丁香激情综合 | 国产精品一区二区你懂的 | 黄网站a| 2021国产精品视频 | 国产精品va最新国产精品视频 | 麻豆网站免费观看 | 热久久免费视频精品 | 色.www| 91九色国产视频 | 在线不卡的av | 国产视频一区二区三区在线 | 日本在线观看一区二区 | 色999视频 | 国产精品理论片在线观看 | 成人av高清在线观看 | 亚洲天堂在线观看完整版 | 天天做天天爱天天爽综合网 | 午夜在线看 | 国产精品久久久久久久久久东京 | 中文字幕免费不卡视频 | 91精品一区二区三区蜜桃 | 麻豆精品在线 | 亚洲国产精品人久久电影 | 久草精品视频在线看网站免费 | 色婷婷av一区二 | 999电影免费在线观看 | 91热精品视频| 久草在线资源观看 | 在线免费观看av网站 | 欧美午夜视频在线 | 国内精品视频免费 | 欧美最爽乱淫视频播放 | 97精品视频在线播放 | 亚洲精品影视 | 午夜久久久久久久久久久 | 国产91精品久久久久久 | 国产精品久久久亚洲 | 亚洲高清不卡av | 久久影视一区 | 成人免费共享视频 | 日韩精品最新在线观看 | 超碰人人射 | 99免费在线播放99久久免费 | 最近2019年日本中文免费字幕 | 免费网站黄| 天天天天射 | 国产免费一区二区三区最新 | 国产99久久久精品 | 成人a v视频| 亚洲日韩欧美一区二区在线 | 久久福利在线 | 日本午夜在线亚洲.国产 | 成人国产电影在线观看 | 国产成人一区二区三区在线观看 | 久青草国产在线 | 国产欧美高清 | 亚洲成av人片在线观看 | 91久久精品一区 | 在线www色 | 国产福利91精品一区 | 成人a免费 | 伊人日日干 | 欧美国产精品久久久久久免费 | 日韩欧美一区二区三区免费观看 | 99久久精品国产一区二区成人 | 人人干干人人 | 91成年视频 | 亚洲人成人天堂h久久 | 色99色 | 日本黄色大片儿 | 丁香婷婷综合色啪 | 国产中文字幕一区 | 91最新在线视频 | 麻豆综合网 | 九九久久免费 | 天天操天天干天天摸 | 五月天堂网 | 天天艹| 欧美激情xxxx | 又黄又刺激又爽的视频 | 久久草视频 | 久久免费视屏 | 欧美日韩国产一区二区在线观看 | 国产精品高 | 国产精品久久久久四虎 | 黄色免费网站大全 | 日韩黄色中文字幕 | 色91在线| 91丨九色丨勾搭 | 91精品推荐 | 久久三级视频 | 欧洲不卡av| 午夜在线资源 | 日本黄色免费网站 | 5月丁香婷婷综合 | 免费网站在线 | 九月婷婷色 | 亚洲欧洲精品在线 | 成片人卡1卡2卡3手机免费看 | 97麻豆视频| 成人在线你懂得 | 中文字幕高清免费日韩视频在线 | 天天色图 | 国产成人三级一区二区在线观看一 | 99视频99 | 蜜臀久久99精品久久久无需会员 | 久久这里只有精品视频首页 | 久久久 精品 | 97精品视频在线 | 五月婷婷久久综合 | 欧美污在线观看 | 99久久日韩精品免费热麻豆美女 | 天天天天天天干 | 欧美激情xxxx| 91精品国产91久久久久 | av电影免费在线看 | 午夜色大片在线观看 | 18久久久 | 久久伊人精品一区二区三区 | 丁香 久久 综合 | 精品久久久免费 | 国产裸体视频网站 | 亚洲激情 在线 | 狠狠色狠狠色 | 久久久福利 | 香蕉视频久久久 | 99这里精品 | 黄色软件在线看 | 国产麻豆视频在线观看 | 国产精品一区久久久久 | 伊人成人激情 | 国产精品va在线 | 婷婷网址 | 国产免费成人 | 99re国产视频 | 天堂黄色片 | 激情婷婷在线 | 久久爱www.| 一区精品在线 | 成年人视频在线免费 | 国产一区自拍视频 | www.亚洲精品 | 黄色网免费 | 欧美激情精品久久久久久免费 | 天天射夜夜爽 | 亚洲欧美日韩中文在线 | 中文视频一区二区 | 97超碰人人澡人人爱 | 成人a v视频 | 最近日韩中文字幕中文 | 不卡视频国产 | 国产色婷婷 | 九九爱免费视频 | 国产精品va在线播放 | 啪啪免费视频网站 | 91在线你懂的 | 天天插天天射 | 国产一区在线精品 | 免费在线看v | 国产一区欧美一区 | 中文av日韩 | 亚洲综合视频在线 | 播五月婷婷 | 欧美天堂影院 | 亚洲 中文 欧美 日韩vr 在线 | 色妞久久福利网 | 黄色大片视频网站 | 69av在线视频 | 黄色福利网 | 国内免费久久久久久久久久久 | 国产成人精品午夜在线播放 | 91激情| 久久99亚洲网美利坚合众国 | 欧美一区二区精美视频 | 精品久操| 亚洲欧洲视频 | 最新高清无码专区 | 婷婷丁香自拍 | 免费在线观看黄 | 亚洲精品成人免费 | 成年人在线观看免费视频 | 在线看片成人 | 亚洲国产无 | 依人成人综合网 | 亚洲免费精品视频 | 一区在线电影 | 免费观看的黄色 | 精品美女在线视频 | 麻豆免费视频观看 | 在线日韩一区 | 久久都是精品 | 久久高清免费视频 | 国产日韩欧美在线免费观看 | 久久艹国产视频 | 99精品国产免费久久久久久下载 | 欧美一级视频免费看 | 青春草国产视频 | 国产黄色视 | 国产三级午夜理伦三级 | 久草免费色站 | 亚洲在线视频网站 | 国产日韩高清在线 | 国产群p | 色多多污污 | 精品福利片 | 精品久久久久久一区二区里番 | 91亚洲精品在线观看 | 欧美视频日韩视频 | 97色婷婷人人爽人人 | 国产精品ⅴa有声小说 | www黄在线| 日本精品视频在线播放 | 黄色片网站大全 | 狠狠狠狠狠狠操 | 日韩欧美一区二区三区黑寡妇 | 韩日精品在线 | 国产精品视频免费看 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 精品欧美在线视频 | 天天干天天射天天爽 | 在线韩国电影免费观影完整版 | 福利一区二区在线 | 成人在线一区二区 | 在线免费视 | 日本精品久久久久 | 黄av免费在线观看 | 久 久久影院 | 天天添夜夜操 | av综合网址| 91免费视频网站在线观看 | 亚洲精欧美一区二区精品 | 在线观看日本韩国电影 | 欧美性色综合 | av不卡在线看 | 最新av观看 | 国产香蕉视频在线播放 | 成人动漫视频在线 | 欧美精品一区二区在线观看 | 中文字幕在线视频一区 | 热久久最新地址 | 国产精品专区h在线观看 | 国产第一福利 | 一级片视频在线 | 一级片视频在线 | 91av福利视频| 国产精品一区久久久久 | 综合黄色网 | 麻豆视频入口 | 欧美一级免费片 | 久久久久福利视频 | 91av视频播放 | 91成人短视频在线观看 | 91九色视频在线播放 | 91人人人| 国产精品一区在线 | 天天综合91 | 91自拍视频在线观看 | 亚洲日本在线视频观看 | 亚洲mv大片欧洲mv大片免费 | 92av视频| 日韩av免费大片 | 超碰免费在线公开 | 成人黄色短片 | 亚洲午夜精品久久久 | 日韩欧美一区二区三区在线 | 久久99影院| 亚洲国产人午在线一二区 | 亚洲国产精品一区二区久久,亚洲午夜 | 少妇bbw搡bbbb搡bbbb | www久久精品 | 久久高清 | 麻豆精品视频在线 | 国产a免费| 国产精品久免费的黄网站 | www.xxxx欧美 | 日韩一二三区不卡 | 在线观看免费黄视频 | 超碰av免费| 久久热首页 | 三级性生活视频 | 久久草网| 久久久久久久久久久久99 | 九九精品在线观看 | 精品国产一区二区三区久久久蜜臀 | 久久久久久99精品 | av再线观看 | 亚洲精品小视频 | 亚洲aⅴ在线 | 99精品国产一区二区 | 婷婷综合av| 在线免费国产 | 四虎影视成人精品 | 久久午夜网 | 黄色性av | 国产高清无线码2021 | 91福利专区 | 国产成人精品久久久久 | 不卡日韩av | 国产色网站 | 91丨九色丨蝌蚪丰满 | 国产91免费观看 | 国产精品va在线 | 久久国产香蕉视频 | 国内久久视频 | 欧美精品第一 | 中文字幕在 | 国产又粗又猛又黄又爽的视频 | 亚洲黄色在线观看 | 欧美性黑人 | 西西444www大胆高清视频 | 色中射 | 操高跟美女 | 婷婷综合电影 | 天天综合网在线观看 | 日韩在线视 | 欧美激情视频在线观看免费 | 日本aaaa级毛片在线看 | 国产视频一区二区三区在线 | 精品视频亚洲 | 色网站中文字幕 | 欧美一区免费在线观看 | 中文字幕二区在线观看 | 五月婷社区| 欧美a级在线免费观看 | 国产免费久久 | 欧美激情综合色综合啪啪五月 | 亚洲视频aaa| 综合久久2023| 欧美激情另类文学 | 国产精品va在线观看入 | 久久国产日韩 | 99免费在线观看 | 国内免费久久久久久久久久久 | 在线天堂中文在线资源网 | 丁香婷婷网| 天天操天天操天天爽 | 国产美女搞久久 | 91少妇精拍在线播放 | 色网站在线免费观看 | 欧美视频不卡 | 成人黄色片免费 | 亚洲精品成人网 | 亚洲精品国偷自产在线91正片 | 成人免费xxx在线观看 | 日日麻批40分钟视频免费观看 | 成人av网页 | 日韩av在线不卡 | 久草精品免费 | 97人人看 | 一本色道久久精品 | 中文字幕一二三区 | 婷婷在线色 | 国内外激情视频 | zzijzzij日本成熟少妇 | 色偷偷av男人天堂 | 精品99免费 | 亚洲综合在线观看视频 | 521色香蕉网站在线观看 | 精品爱爱 | 最新影院 | 久久优| 国产精品自在线 | 最新的av网站 | 一区二区 不卡 | 日韩免费av网址 | 国产精品久久久久久久久久尿 | 亚洲va欧美va人人爽 | 国产免费人成xvideos视频 | 日日夜夜精品免费观看 | 日韩天天综合 | 午夜国产一区二区 | 久草91视频 | 中文字幕三区 | 在线观看日本高清mv视频 | 国产成人精品久久二区二区 | 日韩欧美视频在线观看免费 | 五月天激情综合 | 日本黄色黄网站 | 99热99 | 综合网伊人 | 国产最新视频在线观看 | 激情久久小说 | 亚洲毛片一区二区三区 | 久久免费视频网站 | 日本性生活免费看 | 黄网站色 | 在线观看免费福利 | 欧美日韩在线视频一区二区 | av中文字幕亚洲 | 婷婷久久综合网 | 99精品视频中文字幕 | 日韩乱色精品一区二区 | 91爱看片 | 狠狠躁18三区二区一区ai明星 | 97爱 | 99精品免费久久久久久久久日本 | 免费看片网址 | 日韩影视在线观看 | 中文字幕 成人 | 天天天操天天天干 | 福利在线看片 | 国产小视频91| www.狠狠操| 国产高清免费在线播放 | 免费观看高清 | 日韩理论在线播放 | av成人免费 | 亚洲天堂网站视频 | 天堂视频中文在线 | 国产麻豆电影 | 久草在线免费新视频 | 久久久久久综合网天天 | 精品国产1区2区3区 国产欧美精品在线观看 | 日韩系列在线观看 | 国内精品二区 | 免费在线观看一级片 | 精品视频亚洲 | 国产精品美女999 | 日日夜夜网 | 五月天天色 | 国产精品一区二区在线 | 久久激情精品 | 欧美激情精品 | 精品国产电影一区二区 | 插综合网 | 99久久婷婷国产综合精品 | 久久久三级视频 | 免费看毛片网站 | 色婷婷久久久 | 国语对白少妇爽91 | 亚洲精品美女视频 | 欧美日韩亚洲第一 | 91粉色视频 | 亚洲欧美日韩一二三区 | 国产精品第一页在线观看 | 精品国产乱码一区二 | 日韩理论片在线观看 | 精品一区二区在线免费观看 | www.久久色 | 五月天丁香 | 久久精品亚洲一区二区三区观看模式 | 成人av免费在线 | 日韩av中文在线观看 | 五月天com | 色综合天天狠天天透天天伊人 | 久久免费国产精品 | 国产一级淫片免费看 | 国产成人一区二区三区在线观看 | 亚洲精品综合一二三区在线观看 | 亚洲国产成人久久综合 | 欧美激情精品久久久久久变态 | 99riav1国产精品视频 | 欧美日韩国产页 | a黄在线观看 | 三级在线国产 | 黄色毛片在线观看 | 久久久久女人精品毛片九一 | 国产久草在线 | 超碰97av在线 | 国产福利一区二区三区在线观看 | 国产九色视频在线观看 | 久久视频这里有精品 | 91色蜜桃 | 天天爱天天草 | 在线观看久久 | 日韩成人在线一区二区 | 精品国产伦一区二区三区观看说明 | 久久午夜精品影院一区 | 国产亲近乱来精品 | 欧美日韩免费一区二区三区 | 久久久久国产成人精品亚洲午夜 | 久操97 | 天天插天天干 | 在线观看视频免费大全 | 久久久久久久久久久久久9999 | 欧美视频日韩视频 | 国产成人精品国内自产拍免费看 | 免费a级观看 | 中文字幕中文 | 黄色网在线免费观看 | 日本精品久久 | 久久久精品 一区二区三区 国产99视频在线观看 | 有码一区二区三区 | 精品国产一区二区在线 | 最近av在线| 欧美激情精品 | 免费观看国产视频 | 欧美精品三级在线观看 | 亚洲国产精品500在线观看 | 久久精品视频免费播放 | 国产成人三级在线 | 中国一级片在线播放 | 奇米网777| 欧美精品黑人性xxxx | 久久久免费精品视频 | 成人免费观看完整版电影 | 超碰97在线看| 国产成人一区二区精品非洲 | www.久久91 | 五月婷婷丁香在线观看 | 日韩av视屏 | 国产色 在线 | 日本九九视频 | 久久成人综合 | 日韩mv欧美mv国产精品 | 日韩精品一区不卡 | 亚洲精品一区二区18漫画 | 97涩涩视频| 天天射天天搞 | 久久免费视频在线观看6 | 天天插综合网 | 日韩理论视频 | 99爱国产精品 | 欧美午夜a | 久操视频在线观看 | 日本精品视频一区 | 永久免费的啪啪网站免费观看浪潮 | 字幕网av| 不卡的av在线 | 在线观看国产一区 | 91麻豆高清视频 | 久草在线精品观看 | 亚洲高清免费在线 | 久久久久久久久久久久影院 | 久久久久久久久久久成人 | 超碰在线91| 亚洲国内精品 | a级片网站 | 国产精品视频久久久 | 日日天天av | 精品女同一区二区三区在线观看 | 色国产精品一区在线观看 | 精品国产一区二区在线 | 日韩免费视频一区二区 | 精品国产1区 | 精品亚洲网 | 狠狠色狠狠色综合系列 | 99久久精品午夜一区二区小说 | 三级av片| 最近中文字幕免费观看 | 久久精彩免费视频 | 国产原创在线观看 | 久久久久久久国产精品视频 | 一区二区三区免费在线播放 | 天天激情综合网 | 欧洲精品码一区二区三区免费看 | 日韩69视频 | 91成人免费看片 | 最近更新好看的中文字幕 | 亚洲 欧美变态 另类 综合 | 日韩免费在线观看 | 成人av电影在线 | 丁香电影小说免费视频观看 | 久久久久久蜜桃一区二区 | 91av免费观看 | 国产中文字幕视频 | 在线观看日韩av | 欧美色图一区 | 丝袜美腿亚洲综合 | 久久人人插 | 日韩高清一二区 | 亚洲综合国产精品 | 国内精品视频在线 | 日日夜夜综合网 | 成年人黄色av| 免费男女羞羞的视频网站中文字幕 | 欧美日韩国产精品爽爽 | 欧美ⅹxxxxxx | 99视频精品全部免费 在线 | 久久久久激情 | 又爽又黄又刺激的视频 | 亚洲va在线va天堂va偷拍 | 国产精品久久久久一区二区三区共 | 91精品国产乱码久久 | 成人av在线网 | 久久精品视频免费播放 | 欧美精品在线免费 | 国产99黄 | 激情影音 | 国产日韩视频在线 | 美女视频免费一区二区 | 黄色av一级 | 亚洲一级电影在线观看 | av解说在线 | 国产亚洲精品免费 | 欧美日本一区 | 成年人在线免费看视频 | 天天插伊人 | 国产精品福利一区 | 国产91精品久久久久久 | 久久久www| 成年人黄色免费视频 | 国产91综合一区在线观看 | 国产无遮挡又黄又爽馒头漫画 | 激情综合色播五月 | 超碰九九 | 色搞搞 | 欧美一级片在线观看视频 | 日本午夜在线亚洲.国产 | 日本最大色倩网站www | 久久精品视频3 | 亚洲高清免费在线 | 国产中文字幕视频在线观看 | 成人福利在线 | av成人亚洲 | 午夜视频一区二区 | 亚洲精品美女久久久久网站 | 蜜桃av综合网 | 国产在线国偷精品产拍 | 精品国产一区二区三区免费 | 日本精品一区二区三区在线播放视频 | 六月丁香久久 | 成人午夜精品福利免费 | 国产精品第一页在线 | 91久久人澡人人添人人爽欧美 | 国产精品久久久久久超碰 | 婷婷日日 | 91九色国产在线 | 黄色软件在线观看视频 | 久久免视频| 五月天视频网站 | 久久久久日本精品一区二区三区 | 99色视频在线 | 欧美日韩不卡一区二区三区 | 成人久久网| 香蕉在线播放 | 久久免费视频观看 | 激情导航 | 狠狠色狠狠色综合系列 | 国精产品一二三线999 | av中文字幕电影 | 成人免费观看视频网站 | 一级片免费观看 | 1024久久| 日韩精品久久久久久 | 综合久久久久久久 | 亚洲一区二区精品3399 | 人人爽久久涩噜噜噜网站 | 中文字幕免费看 | 四虎4hu永久免费 | 中文永久免费观看 | 成人午夜在线电影 | 99精品视频在线观看视频 | 久久撸在线视频 | 国产丝袜制服在线 | 久草在线久 | 日韩欧美视频免费观看 | 91黄在线看 | 九色琪琪久久综合网天天 | 婷婷福利影院 | 亚洲区另类春色综合小说 | 亚洲日本中文字幕在线观看 | 午夜久久成人 | 成人一级电影在线观看 | 久久激情视频 久久 | 黄污网站在线 | 午夜av大片 | 国产精品久久久久久久久久妇女 | 99精品久久精品一区二区 | 香蕉在线视频播放网站 | 亚洲在线精品视频 | www.五月婷婷.com | 久久久久女教师免费一区 | 久久涩视频 | 国产精品九九九 | 日韩免费成人 | 久久久久久久久久久久亚洲 | 国产精品久久久久久久久久妇女 | 国内精品视频在线 | 久久久久久久久免费视频 | 日韩精品一区二区免费视频 | 91视频免费播放 | 国产亚洲久一区二区 | 免费的黄色av | 亚洲精品综合欧美二区变态 | 亚洲国产高清在线 | av一区二区在线观看中文字幕 | 久久综合九色综合欧美就去吻 | 五月婷婷在线观看 | 日本三级大片 | 久久天堂亚洲 | 一区二区三区四区在线免费观看 | 久久在线免费观看 | 久久国产色 | 国产在线欧美日韩 | 天天伊人狠狠 | 色综合 久久精品 | 午夜国产一区二区三区四区 | 亚洲人成影院在线 | 日韩高清在线观看 | 色综合天天综合在线视频 | 亚洲精品一区二区久 | 日韩av区| 国产精品字幕 | 伊人日日干 | 午夜精品一二区 | 国产精品一区二区在线播放 | 99久久精品无免国产免费 | 性色av一区二区三区在线观看 | 亚洲人片在线观看 | 日韩理论在线播放 | 久久久久在线 | 亚洲日本一区二区在线 | 中国一级片免费看 | 国产精品乱码高清在线看 | 91麻豆免费视频 | 久久综合久久伊人 | 欧美精品视 | 免费看毛片在线 | 国产亚洲精品久久久久久大师 | 91九色国产视频 | 日韩高清久久 | 免费成人av网站 | 正在播放 久久 | 国产精品久久久久久妇 | 97超碰.com | 国产成人精品午夜在线播放 | 免费av影视 | 日韩精品久久久久久久电影竹菊 | 成人一级在线观看 | 亚洲精品男人天堂 | h视频在线看 | 亚洲欧美日韩一区二区三区在线观看 | 亚洲国产日韩一区 | 久久免费在线观看 | 亚州精品天堂中文字幕 | 99久高清在线观看视频99精品热在线观看视频 | 超碰精品在线观看 | 国产精品久久99综合免费观看尤物 | 国产电影一区二区三区四区 | 玖操| 97超碰免费 | 亚洲国产97在线精品一区 | 91视频久久久 | 国产精品1000 | 高清国产在线一区 | av爱干| 2019中文字幕第一页 | 在线观看国产永久免费视频 | 成人91在线 | 久久黄色影院 | 精品久久久久久国产 | 午夜久久视频 | 欧美日韩在线视频一区 | 国产在线91精品 | 成人一区影院 | www.亚洲精品| 日韩精品资源 | 色婷婷综合久久久久 | 婷婷色在线 | 免费视频久久久久久久 | 久久久九色精品国产一区二区三区 | 97超碰福利久久精品 | 深夜激情影院 | 精品女同一区二区三区在线观看 | 国产理论一区二区三区 | 亚洲色影爱久久精品 | 最近日韩中文字幕中文 | 亚洲日本一区二区在线 | 国产在线观看高清视频 | 欧美不卡视频在线 | 91av视频在线观看 | 国产区精品 | 色综合综合| 欧美在线视频一区二区三区 | 久久综合久久鬼 | 国产精品久久99 | www操操| 欧美色道 | 亚洲国产人午在线一二区 | 成人一级电影在线观看 | 久久久久国 | 在线观看视频在线观看 | 久草在线免费播放 | 成人免费色 | 在线观看一区 | 久久婷综合 | 亚洲开心色 | 久久五月天色综合 | 久久精品视频在线 | 日日碰狠狠添天天爽超碰97久久 | 色.www | 日韩中文字幕免费在线观看 | 国产成人精品网站 | 激情五月婷婷激情 | 夜夜爽天天爽 | 久久免费a | 免费在线播放 | 亚洲精品字幕在线观看 | 久久大视频 | 特级西西人体444是什么意思 | 精品欧美一区二区在线观看 | 日韩欧美在线视频一区二区 | 亚洲久草在线 | 91在线91| 久久婷婷一区二区三区 | 欧美久久久久久久久久久 | 五月婷婷伊人网 | 色av资源网 | 久久国产视频网 | 国产乱对白刺激视频在线观看女王 | 久久久亚洲国产精品麻豆综合天堂 | 婷婷色在线播放 | 亚洲欧美日韩精品久久久 | 久久精品3 | 91看片淫黄大片在线播放 | 久久久穴 | 日韩一级黄色片 | 亚洲伊人色 | 婷婷丁香在线视频 | 亚洲精品伦理在线 | 99自拍视频在线观看 | 中文字幕乱码日本亚洲一区二区 | 亚洲jizzjizz日本少妇 | 国产91大片 | 日韩免费久久 | 91九色精品国产 | 国产成人一区二区三区影院在线 | 日日干夜夜操视频 | 91九色成人蝌蚪首页 | 亚洲一区二区三区毛片 | 免费福利在线观看 | 一区二区精品在线 | 免费日韩av片| 国产视频 亚洲精品 | 深爱激情站 | 亚洲黄在线观看 | 色噜噜噜 | 有码一区二区三区 | 天天干天天做天天操 | 中文字幕免费高清在线观看 | 免费看色网站 | 91亚洲狠狠婷婷综合久久久 | 国产精品密入口果冻 | 97天堂| 亚洲成人午夜在线 | 91黄色在线观看 | 国产第一页精品 | 久草爱 | 久久精品成人欧美大片古装 | 国产日韩亚洲 | 国产精久久久久久妇女av | 国产精品大尺度 | 四虎影视成人精品 | 亚洲永久字幕 | 久久精品视频在线观看免费 | 久久不射电影院 | 国内成人精品视频 | 国产香蕉久久精品综合网 | 视频一区二区视频 | 久久久片 | 久久久久成人免费 | 超碰免费公开 | 国产一区二区三区高清播放 | 久久在线精品视频 | 国产不卡毛片 | 亚洲精品免费在线视频 | 麻豆视频在线免费观看 | 在线天堂亚洲 | 国产一区在线视频播放 | 天天射综合网站 | 久久精品一二区 | 色婷婷六月 | 久久久亚洲影院 | 97人人模人人爽人人喊网 | 精品在线观看国产 | 在线看片中文字幕 | 96精品视频 | 亚洲一级久久 | 国产精品免费在线视频 | 在线观看日韩一区 |