成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Hbase應(yīng)用的一次錯(cuò)誤處理

miya / 773人閱讀

摘要:于是開(kāi)始了長(zhǎng)時(shí)間的排錯(cuò)之旅。但是讀取的時(shí)候,出現(xiàn)問(wèn)題一直報(bào)異常,而路徑并未出錯(cuò)而且文件存在。由于錯(cuò)誤定位在的構(gòu)造函數(shù)中上,便重新寫(xiě)了一個(gè)類測(cè)試類的類,發(fā)現(xiàn)完全沒(méi)有問(wèn)題,不是這出的錯(cuò)誤。查看類構(gòu)造函數(shù),其功能就是接受參數(shù),調(diào)用的構(gòu)造函數(shù)。

在實(shí)現(xiàn)《Hadoop高級(jí)編程》一書(shū)中第9章的一個(gè)例子:將HBase用于圖片管理系統(tǒng)中,遇到了一個(gè)很讓人頭疼的問(wèn)題:FileNotFoundException。雖然異常很簡(jiǎn)單,但是文件確實(shí)存在那了。于是開(kāi)始了長(zhǎng)時(shí)間的排錯(cuò)之旅。

該例子是將一堆小圖片文件合成一個(gè)大文件,并將各個(gè)小文件的位置索引存入HBase中。有一個(gè)DatedPhoto類,用于存放時(shí)間(long)以及圖片(byte[]);還有一個(gè)PhotoLocation類,用于存放位置(long)、時(shí)間(long)和文件名(String)。位置是小文件在大文件中的字節(jié)位置,文件名是合成的大文件名,按序號(hào)命名。PhotoLocation類還提供了toBytesfromBytes函數(shù),用于將三種信息字節(jié)化后寫(xiě)入HBase以及從HBase中讀出索引信息后還原成位置, 時(shí)間文件名 信息。其余為寫(xiě)入類,讀出類。整體非常簡(jiǎn)單。

寫(xiě)的時(shí)候完全沒(méi)有問(wèn)題,文件成功生成,HBase中保存了索引。但是讀取的時(shí)候,出現(xiàn)問(wèn)題:一直報(bào)FileNotFoundException異常,而路徑并未出錯(cuò)而且文件存在。

這到底是怎么一回事呢?因?yàn)橛玫氖?b>SequenceFile中的內(nèi)部類ReaderWriter,而Hadoop 2.2.0的API中并沒(méi)有找到這兩個(gè)東西,便從源碼入手看看是不是這個(gè)類的問(wèn)題。按照?qǐng)?zhí)行流程過(guò)了一遍,任何問(wèn)題都沒(méi)發(fā)現(xiàn)。由于錯(cuò)誤定位在SequenceFile.Reader的構(gòu)造函數(shù)中getFileStatus上,便重新寫(xiě)了一個(gè)類測(cè)試FileSystem類的getFileStatus類,發(fā)現(xiàn)完全沒(méi)有問(wèn)題,不是這出的錯(cuò)誤。

PhotoDataReader類是輔助讀出數(shù)據(jù)的類,被PhotoReader類調(diào)用。錯(cuò)誤就定位在了該類的構(gòu)造上。查看PhotoDataReader類構(gòu)造函數(shù),其功能就是接受參數(shù),調(diào)用SequenceFile.Reader的構(gòu)造函數(shù)。輸出PhotoDataReader接收到的參數(shù):fileString)、userUUID)、confConfiguration),三者都沒(méi)問(wèn)題,但是出現(xiàn)了一個(gè)很奇怪的現(xiàn)象:

執(zhí)行

    System.out.println("file:"+ _file + "sadasdsasdssssss");

時(shí),后面的那一串字符串居然不顯示!

看來(lái)問(wèn)題就出現(xiàn)在_file參數(shù)上面。但是不管怎么輸出_file的值,的確就是我要的那個(gè)文件名的字符串。似乎這是個(gè)根本就不應(yīng)該出現(xiàn)的問(wèn)題。然后輸出_file的字符串長(zhǎng)度,明明只有1個(gè)字符的文件名,顯示的長(zhǎng)度為112!看來(lái)問(wèn)題就在這!

問(wèn)題究竟出現(xiàn)在哪呢?繼續(xù)向上找,發(fā)現(xiàn)參數(shù)是PhotoReader傳給它的;PhotoReader又通過(guò)讀取HBase中的索引記錄得到后用PhotoLocationfromBytes函數(shù)得到…… fromBytes函數(shù)?其實(shí)現(xiàn)的是將一個(gè)包含索引位置時(shí)間文件名的128位字符數(shù)組分開(kāi)然后生成三個(gè)值。索引位置與時(shí)間均為long型,字符數(shù)組均為8位,沒(méi)有問(wèn)題。但是文件名為字符串,合成字符數(shù)組時(shí)用的length函數(shù),但是還原時(shí)就把除索引位置與時(shí)間的16位排除后剩下的112位全部用來(lái)生成字符串了!生成字符串用Bytes.bytes()new String均無(wú)法生成原長(zhǎng)度的字符串。

既然知道了原因,解決也好辦了。要么設(shè)個(gè)長(zhǎng)度位,要么用定長(zhǎng)字符串,要么干脆在HBase分開(kāi)存儲(chǔ)??磥?lái),有時(shí)候報(bào)錯(cuò),問(wèn)題往往出現(xiàn)在細(xì)節(jié)上,仔細(xì)思考每一處細(xì)節(jié),可以減少很多的排錯(cuò)時(shí)間。至少這次我花了不少時(shí)間。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64160.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

miya

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<