2016-04-27 92 views
0

我试图将HBase(版本1.1.X)放入本地存储的一些XML文件。将XML放入HBase的正确方法

我的目标是使用MapReduce(无减少阶段)将这些XML的内容作为字符串存储在我的HBase表中,而无需将它们加载到HDFS。

这里是我的伪代码:

fetchXMLs(path); 
XML2OneLineFile(); 
configureHBase(); // + establishing connection 
Map(input, output); //input: one XML file in one line; output : is the Put() of HBase; 
closeConnection(); 

是解决这一问题的正确这样,还是有更好的方法来做到这一点?

ps:我不想从我的XML中解析或提取数据,只是存储它们。提前

感谢

回答

1

HBase的是不是真的为大对象存储制造。根据你的xml的大小,HBase可能不是你正在寻找的解决方案。

此刻,我正在研究一个包含多种文件类型(包括xml)的数据库。我认为最好的做法是将1Mo以下的文件存储到HBase,其余的文件存放在Hadoop中,将元数据保存在SQL或HBase中。

这取决于你想用这些数据实现的很多东西。

+0

事实上,我的XML并不大,只有很多;换句话说,我将不得不在很短的时间内存储很多小尺寸的XML(大约90,000个文件,从80KB到500KB)。 – mttb12

+1

然后Hbase应该没问题,如果你不需要扫描这些文件的内容,只需要将内容转储到列属性中即可。但是,它会减慢扫描速度(因为它必须扫描每个文件的所有内容)。您如何访问数据? – Whitefret

+0

数据将被有针对性地访问我的Hbase表中的特定(很少全部)记录。那么不将文件加载到HDFS的想法仍然正确? – mttb12

2

除了将XML字符串存储到Hbase,您可以将它们存储为byte [] ,并且您可以使用反序列化将其作为一个对象(序列化类型)进行检索。

你可以用下面的方式使用Apache公共API。

对于前:

byte[] xmlInBytes = org.apache.commons.lang.SerializationUtils.serialize(Serializable obj) 

为反序列化,你可以做到这一点

static Object deserialize(byte[] objectData) 

如果对象可能是w3c文件,物品应类型强制转换为W3C文档。

我已经测试过很多类型的对象,不仅有XML。 它应该以相同的方式工作。希望这可以帮助。