2016-09-27 10 views
0

ハイブテーブルの場所がhttp JSON REST APIになるハイブテーブルを作成する方法はありますか? HDFSで毎回データをインポートする必要はありません。HIVEのREST APIのデータにアクセスする

+0

Hive(またはHadoop)がHiveデータベース用のJSON REST APIを公開するかどうか尋ねていますか?私はその答えはノーだと思う。データの上にいくつかのJSON SerDeがなければ、JSONとして出てこないのです。 Hiveに接続するRESTful Webサービスを作成できない原因は何ですか? –

+0

@ cricket_007以前はHIVEテーブルからデータにアクセスしていたHIVEジョブがたくさんあります。これらのハイブテーブルを置き換えるHTTP REST APIからデータを読み込むようにこれらのすべてのジョブをポイントする必要があります。あなたはそれを行う最も簡単な方法をお勧めしますか? – chanchal1987

+0

申し訳ありませんが、私はあなたが何を求めているのか分かりません。私の意見では、REST APIはHiveの代替物​​ではありません。主に、Hiveは、格納しようとするデータの量が多少遅いためです。それほど多くのデータがない場合、基本的にMySQLデータベースの周りでRESTについて同じ質問をすることができます。 –

答えて

1

私は数年前のプロジェクトで同様の状況に遭遇しました。これは、RestfulからHDFSへデータを取り込み、そしてHive分析を使用してビジネスロジックを実装するための低コストの方法です。コアJava、Map Reduceに慣れていることを望みます(Hortonworks Data Flow、 Hortonworksの製品であるHDF)。

手順1:データ処理ワークフローを、ビジネスロジックを含むHiveワークフローに関連付けるべきではありません。これは、お客様の要件(データフローのボリューム&のボリューム)に基づいて適時に独立して実行し、定期的に監視する必要があります。私はテキストエディタでこのコードを書いています。警告:コンパイルやテストはしていません!!

以下のコードは、URLを受け入れるか、調整してFSからのURLのリストを受け入れるMapperを使用しています。ペイロードまたは要求されたデータは、指定されたジョブ出力ディレクトリにテキストファイルとして保存されます(今回はデータの構造を忘れてしまいます)。

マッパークラス:

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.URL; 
import java.net.URLConnection; 

import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IOUtils; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 


public class HadoopHttpClientMap extends Mapper<LongWritable, Text, Text, Text> { 
    private int file = 0; 
    private String jobOutDir; 
    private String taskId; 

    @Override 
    protected void setup(Context context) throws IOException,InterruptedException { 
     super.setup(context); 

     jobOutDir = context.getOutputValueClass().getName(); 
     taskId = context.getJobID().toString(); 

    } 

    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{ 

     Path httpDest = new Path(jobOutDir, taskId + "_http_" + (file++)); 

     InputStream is = null; 
     OutputStream os = null; 
     URLConnection connection; 
     try { 
      connection = new URL(value.toString()).openConnection(); 
      //implement connection timeout logics 
      //authenticate.. etc 
      is = connection.getInputStream(); 

      os = FileSystem.getLocal(context.getConfiguration()).create(httpDest,true); 

      IOUtils.copyBytes(is, os, context.getConfiguration(), true); 

     } catch(Throwable t){ 
      t.printStackTrace(); 
     }finally { 
      IOUtils.closeStream(is); 
      IOUtils.closeStream(os); 
     } 

     context.write(value, null); 
     //context.write(new Text (httpDest.getName()), new Text (os.toString())); 
    } 

} 

マッパー唯一の仕事:

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; 


public class HadoopHttpClientJob { 
    private static final String data_input_directory = “YOUR_INPUT_DIR”; 
    private static final String data_output_directory = “YOUR_OUTPUT_DIR”; 

    public HadoopHttpClientJob() { 
    } 

    public static void main(String... args) { 
     try { 
      Configuration conf = new Configuration(); 

      Path test_data_in = new Path(data_input_directory, "urls.txt"); 
      Path test_data_out = new Path(data_output_directory); 

      @SuppressWarnings("deprecation") 
      Job job = new Job(conf, "HadoopHttpClientMap" + System.currentTimeMillis()); 
      job.setJarByClass(HadoopHttpClientJob.class); 

      FileSystem fs = FileSystem.get(conf); 

      fs.delete(test_data_out, true); 
      job.setMapperClass(HadoopHttpClientMap.class); 
      job.setMapOutputKeyClass(Text.class); 
      job.setMapOutputValueClass(Text.class); 
      job.setInputFormatClass(TextInputFormat.class); 
      job.setOutputFormatClass(TextOutputFormat.class); 
      job.setNumReduceTasks(0); 

      FileInputFormat.addInputPath(job, test_data_in); 
      FileOutputFormat.setOutputPath(job, test_data_out); 

      job.waitForCompletion(true); 

     }catch (Throwable t){ 
      t.printStackTrace(); 
     } 
    } 
} 

ステップ2:HDFSディレクトリに基づいてハイブに外部表を作成します。 JSONデータ(あなたの場合)にHive SerDeを使用し、外部テーブルのデータを管理マスターテーブルにコピーすることを忘れないでください。

ステップ3:ビジネスニーズを実現するために、作成した可能性のあるハイブクエリをマスターテーブルにポイントします。

注:リアルタイム解析またはストリーミングAPIを参照している場合は、アプリケーションのアーキテクチャを変更する必要があります。あなたは建築上の質問をしてきたので、私はあなたをサポートするために私の最高の教育を受けた推測を使用しています。これを一度行ってください。アプリケーションでこれを実装できると思ったら、特定の質問をすることができます。私はそれらに対処するために最善を尽くします。

関連する問題