我有一個問題可以通過Hadoop Streaming以「typedbytes」或「rawbytes」模式解決,它允許用Java以外的語言分析二進制數據。 (如果沒有這些,Streaming會將某些字符(通常是\ t和\ n)解釋爲分隔符並抱怨非utf-8字符。將所有二進制數據轉換爲Base64會減慢工作流程,從而影響工作流程。這些二進制模式由HADOOP-1722添加。在調用Hadoop Streaming作業的命令行中,「-io rawbytes」可讓您將數據定義爲32位整數大小,然後是該大小的原始數據,「-io typedbytes」可讓您將數據定義爲1位零(意思是原始字節),接着是32位整數大小,接着是該大小的原始數據。我已經創建了這些格式的文件(帶有一個或多個記錄),並通過檢查typedbytes.py的輸出來驗證它們是否處於正確的格式。我也嘗試了所有可能的變化(大端,小端,不同的字節偏移等)。我正在使用Hadoop 0.20 from CDH4,它具有實現typedbytes處理的類,並且在設置「-io」開關時它正在輸入這些類。如何在Hadoop Streaming中使用「typedbytes」或「rawbytes」?
我使用「hadoop fs -copyFromLocal」將二進制文件複製到HDFS。當我嘗試將它用作map-reduce作業的輸入時,它會嘗試創建我指定長度的字節數組(例如3個字節)的行上發生OutOfMemoryError失敗。它必須錯誤地讀取數字並試圖分配一個巨大的塊。儘管如此,它確實設法向映射器(前一個記錄?不確定)獲取記錄,將其寫入標準錯誤以便我可以看到它。在記錄的起始處總是有太多字節:例如,如果文件是「\ x00 \ x00 \ x00 \ x00 \ x03hey」,則映射器將看到「\ x04 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x08 \ x00 \ x00 \ x00 \ x00 \ x03hey「(可重現的位,儘管沒有我能看到的模式)。
從this talk的第5頁,我瞭解到有流式傳輸的「loadtb」和「dumptb」子命令,這些子命令在HDF中進行復制和在一個SequenceFile中打包/解開打包的字節。當與「-inputformat org.apache.hadoop.mapred.SequenceFileAsBinaryInputFormat」一起使用時,Hadoop會正確解包SequenceFile,但隨後會以完全相同的方式錯誤解釋包含在其中的typedbytes。
此外,我找不到這個功能的文檔。在2月7日(我通過電子郵件發送給自己)中,在streaming.html page on Apache中簡要提及,但是此r0.21.0網頁已被取消,the equivalent page for r1.1.1未提及rawbytes或typedbytes。
所以我的問題是:在Hadoop Streaming中使用rawbytes或typedbytes的正確方法是什麼?有沒有人得到它的工作?如果是這樣,有人可以發佈食譜嗎?對於希望在Hadoop Streaming中使用二進制數據的人來說,這似乎是個問題,而這應該是一個相當廣泛的羣體。
P.S.我注意到Dumbo,Hadoopy和rmr都使用這個特性,但是應該有一種直接使用它的方法,不需要通過基於Python或基於R的框架來實現。
「\ X04 \ X00 \ X00 \ X00 \ X00 \ X00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x08 \ x00 \ x00 \ x00 \ x00 \ x03hey「是一個長度爲(類型4),值爲0,後跟一個長度爲8 「\ X00 \ X00 \ X00 \ X00 \ x03hey」)。 這是一些typedbytes(0(類型),8(長度),字節)的編碼值。 – 2013-12-24 23:04:24