1. 程式人生 > >Java API讀取CDH-Hadoop Parquet檔案

Java API讀取CDH-Hadoop Parquet檔案

由於工作需要,基於目前公司叢集存在較多的伺服器且存在大量的記憶體,因此考慮直接將資料Load進記憶體進行資料處理,測試是否能夠加快處理速度;鑑於以上目的,版主嘗試使用Parquet的Java API讀入Parquet檔案。
目前關於使用Java API訪問HDFS的文章較多,但是沒有相關的配置比較容易出錯;同時Java API讀寫Parquet雖然文章較多,但多數為基於本地檔案的讀寫例項。因此,有必要研究一下Java API讀寫HDFS上的Parquet檔案。

開發環境

相關程式的執行,需要一個執行環境。本文的執行環境為:

  • Eclipse+Maven
  • CDH5.8.0
  • JDK1.8.0

需要的相關JAR:

  • Hadoop-Common、Hadoop-Client(Maven)
  • parquet-avro-1.5.0-cdh5.8.0
  • parquet-format-2.1.0-cdh5.8.0.
  • parquet-hadoop-1.5.0-cdh5.8.0
  • parquet-column-1.5.0-cdh5.8.0
  • htrace-core4-4.0.1-incubating

相關程式碼(單節點)

public static Configuration conf;
static {
        conf = new Configuration();
        conf.set("fs.hdfs.impl"
, "org.apache.hadoop.hdfs.DistributedFileSystem"); } public static void main(String[] args) throws IllegalArgumentException, IOException { long begin = System.currentTimeMillis(); if (args.length < 1) {// Input arguments System.out.println("Less params"
); return; } String date = args[0];// Input Date Arguments String hdfsPath = "hdfs://NameNodeURL:port/user/hive/default/ip24data_parquet_all/pt=" + date; HashMap<String, DATA> map = new HashMap<String, DATA>(); for (int i = 0; i < 5; i++) { @SuppressWarnings("deprecation") AvroParquetReader<GenericRecord> reader = new AvroParquetReader<GenericRecord>( conf, new Path(hdfsPath + "//00000" + i + "_0")); GenericRecord record = null; while ((record = reader.read()) != null) { String key = record.get("vin").toString() + record.get("data_date").toString(); DATA cnt = new DATA(record.get("vin"), record.get("data_date"), record.get("latitude"), record.get("longitude"), record.get("work_model")); map.put(key, cnt); } reader.close(); } System.out.println("Left APP: "+new Date().toString()); System.out.println("Total TIme used : ms: "+(System.currentTimeMillis()-begin)); System.out.println("Only Load Data: size: "+map.size()); }

需要注意的地方:

  1. htrace-core4-4.0.1-incubating.jar,可以在相應的環境中找到,或到Maven/Htrace的官網上去找到;Htrace管網上的一般為原始碼,需要自行編譯。
  2. 關於HDFS識別問題:第一次測試,沒有新增任何配置,結果報錯:
    NO FileSystem for scheme: hdfs,因此添加了fs.hdfs.impl的配置資訊。關於HDFS其他的配置資訊,可以根據hdfs的配置資訊設定。

參考連結