读取文件的最快方法并放入hbase

时间:2016-04-16 10:15:30

标签: java file hbase

我正在尝试从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 {

    }       

  }

1 个答案:

答案 0 :(得分:0)

使用批量提交和多线程

很多把对象放到列表中(List) 并使用table.put(list) 把数据推荐单推,建议使用批量提交。

如果文件是单个文件,则将其拆分为多个文件。并使用多线程 你可以关闭autoflush的HTable对象并设置writebuffcache

使用带有hbase表的预设分区(这对于proformance很重要)

喜欢: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