我正在尝试从txt文件中读取数据并放入hbase表中。我在这些文件中有大约100亿条记录,期望我需要在一两天内完成它。问题是它到第3天还没有完成。以下代码应用于大约10个不同的进程中,文件相应地分开。在每个进程中有多个单独的线程是一个更好的方法,如果是这样,如何设置代码?
for (File file : fList){
System.out.println(file.getName());
fileCount +=1;
try {
FileInputStream inputStream = null;
Scanner sc = null;
BufferedReader reader = null;
inputStream = new FileInputStream(file);
sc = new Scanner(inputStream, "UTF-8");
while (sc.hasNextLine()) {
String line = sc.nextLine();
lineCount+=1;
String[] pmeters = line.split("\\ ");
String clientID=pmeters[0];
String famID = pmeters[1];
byte[] currRecord;
put(famID,clientID,"");
htable.flushCommits();
}
} finally {
}
}
答案 0 :(得分:0)
很多把对象放到列表中(List)
并使用table.put(list)
把数据推荐单推,建议使用批量提交。
如果文件是单个文件,则将其拆分为多个文件。并使用多线程 你可以关闭autoflush的HTable对象并设置writebuffcache
喜欢:create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
或create 'testSplit','Cf',{SPLITS=>['0','1','2','3','4','5','6','7','8','9' ]}
预设分区必须与rowkey匹配。 英语不好,不能说预设分区要清楚。你可以谷歌吧。
如有必要,在服务器上在hbase-site.xml中
hbase.regionserver.global.memstore.upperLimit set to 0.6 default 0.4
hbase.regionserver.global.memstore.lowerLimit set to 0.55 default 0.38
hfile.block.cache.size set to 0.2 default 0.4
此设置可以增加写入memstore大小并减少查询的块缓存大小。如果需要,可以通过u self设置值。
记住upperLimit + cache.size must <=0.8
hbase.hregion.memstore.flush.size default 32M
你可以计算得到结果来设置flush.size:
如果regionserver有16G堆。 lowerLimit是0.55,如果单个regionserver有100个区域的计数。
(16*1024MB * 0.55) / 100 = 90MB
您可以将刷新设置为80MB
这个设定的目的是让冲洗的memstore分散,不专心做冲洗工作。
如果可以,请将hbase.regionserver.optionalcacheflushinterval值设置为0