Hiveチュートリアル–HiveアーキテクチャとNASAのケーススタディ



このHiveチュートリアルブログでは、HiveアーキテクチャとHiveデータモデルに関する深い知識が得られます。また、ApacheHiveに関するNASAのケーススタディについても説明します。

Apache Hiveチュートリアル:はじめに

Hiveは、ビッグデータ分析のために業界全体で厳密に使用されているツールであり、 と。このHiveチュートリアルブログでは、ApacheHiveについて詳しく説明します。 Apache Hiveは、のデータウェアハウジングツールです。 、ビッグデータをクエリおよび分析するためのSQLのような言語を提供します。 Hiveの開発の背後にある動機は、SQL開発者とアナリストにとって摩擦のない学習パスです。 Hiveは、プログラミング以外のバックグラウンドを持つ人々の救世主であるだけでなく、MapReduceプログラムの作成に長い時間を費やすプログラマーの作業を軽減します。このApacheHiveチュートリアルのブログでは、次のことについて説明します。





Apache Hiveチュートリアル:Hiveとは何ですか?

Apache Hiveは、Hadoop上に構築されたデータウェアハウスシステムであり、構造化データと半構造化データの分析に使用されます。Hiveは、HadoopMapReduceの複雑さを抽象化します。基本的に、構造をデータに投影し、SQLステートメントと同様のHQL(Hiveクエリ言語)で記述されたクエリを実行するメカニズムを提供します。内部的には、これらのクエリまたはHQLは、Hiveコンパイラによってマップリデュースジョブに変換されます。 したがって、Hadoopを使用してデータを処理するための複雑なMapReduceプログラムの作成について心配する必要はありません。これは、SQLに慣れているユーザーを対象としています。 Apache Hiveは、データ定義言語(DDL)、データ操作言語(DML)、およびユーザー定義関数(UDF)をサポートしています。

初心者のためのHiveチュートリアル|ハイブを深く理解する|エドゥレカ



SQL + Hadoop MapReduce = HiveQL

Apache Hiveチュートリアル:Hiveのストーリー–FacebookからApacheまで

Facebookのユースケース-Hiveチュートリアル-Edureka :Hiveチュートリアル–Facebookのユースケース

Facebookでの課題:データの指数関数的成長

2008年以前は、Facebookのすべてのデータ処理インフラストラクチャは、商用RDBMSに基づくデータウェアハウスを中心に構築されていました。これらのインフラストラクチャは、当時のFacebookのニーズを満たすのに十分な能力を備えていました。しかし、データが非常に急速に増加し始めたため、この巨大なデータセットを管理および処理することは大きな課題になりました。 Facebookの記事によると、データは2007年の15TBのデータセットから2009年の2PBのデータにスケーリングされました。また、多くのFacebook製品には、Audience Insights、Facebook Lexicon、FacebookAdsなどのデータの分析が含まれます。この問題に対処するためにスケーラブルで経済的なソリューションが必要だったため、Hadoopフレームワークの使用を開始しました。



民主化 Hadoop – MapReduce

しかし、データが大きくなるにつれて、Map-Reduceコードの複雑さも比例して大きくなりました。そのため、プログラミング以外のバックグラウンドを持つ人々にMapReduceプログラムを作成するためのトレーニングを行うことは困難になりました。また、簡単な分析を実行するには、100行のMapReduceコードを記述する必要があります。 SQLはFacebookを含むエンジニアやアナリストによって広く使用されていたため、SQLをHadoopの上に置くことは、SQLのバックグラウンドを持つユーザーがHadoopにアクセスできるようにする論理的な方法のように思われました。

したがって、ほとんどの分析要件を十分に満たすSQLの機能と、Hadoopのスケーラビリティが誕生しました。 Apache Hive これにより、HDFSに存在するデータに対してSQLのようなクエリを実行できます。その後、Hiveプロジェクトは2008年8月にFacebookによってオープンソース化され、今日はApacheHiveとして無料で利用できます。

それでは、Hiveの人気を高めている機能や利点を見てみましょう。

Apache Hiveチュートリアル:Hiveの利点

  • 複雑なMapReduceプログラムを作成する必要がないため、プログラミングのバックグラウンドを持たない人に役立ちます。
  • 拡張可能 そして スケーラブル システムのパフォーマンスに影響を与えることなく、増大するデータの量と多様性に対処するため。
  • これは、効率的なETL(抽出、変換、読み込み)ツールです。
  • Hiveは、Java、PHP、Python、C ++、またはRubyで記述されたクライアントアプリケーションを公開することでサポートします。 Thriftサーバー 。 (これらのクライアント– DB2などのデータベースにアクセスするためにSQLが組み込まれたサイド言語を使用できます)。
  • Hiveのメタデータ情報はRDBMSに保存されるため、クエリ実行中にセマンティックチェックを実行する時間が大幅に短縮されます。

Apache Hiveチュートリアル:Apache Hiveをどこで使用するか?

Apache Hiveは、SQLデータベースシステムとSQLデータベースシステムの両方の世界を利用しています。 フレームワーク。そのため、非常に多くの企業で使用されています。これは主に、リアルタイム処理を必要としない分析とデータマイニングを実行できるデータウェアハウジングに使用されます。 ApacheHiveを使用できるフィールドのいくつかは次のとおりです。

  • データウェアハウジング
  • アドホック分析

言われているように、片手だけで拍手することはできません。つまり、1つのツールですべての問題を解決することはできません。したがって、Hiveを他のツールと組み合わせて、他の多くのドメインで使用できます。たとえば、TableauとApache Hiveはデータの視覚化に使用でき、Apache TezとHiveの統合により、リアルタイムの処理機能が提供されます。
このApacheHiveチュートリアルブログで先に進むと、NASAのケーススタディを見てみましょう。ここでは、NASAの科学者が気候モデルの評価を行っているときに直面していた問題をHiveがどのように解決したかを知ることができます。

Hiveチュートリアル:NASAのケーススタディ

気候モデルは、地球の気候に影響を与えるさまざまな要因に基づく気候システムの数学的表現です。基本的に、それは海、太陽、大気などのような気候の様々なドライバーの相互作用を説明します気候システムのダイナミクスへの洞察を提供します。気候に影響を与える要因に基づいて気候変動をシミュレートすることにより、気候条件を予測するために使用されます。 NASAのジェット推進研究所は、さまざまな外部リポジトリに存在するリモートセンシングデータに対して気候出力モデルを分析および評価するための地域気候モデル評価システム(RCMES)を開発しました。

RCMES(地域気候モデル評価システム)には2つのコンポーネントがあります。

  • RCMED(地域気候モデル評価データベース):

これは、Apache OODTエクストラクタ、Apache Tikaなどのエクストラクタを使用して、気候に関連するリモートセンシングデータと再分析データをロードするスケーラブルなクラウドデータベースです。最後に、データを次の形式のデータポイントモデルとして変換します(緯度、経度、時間、値、高さ)、それをMySQLデータベースに保存します。クライアントは、Space / Timeクエリを実行することにより、RCMEDに存在するデータを取得できます。そのようなクエリの説明は、現在私たちには関係ありません。

  • RCMET(地域気候モデル評価ツールキット):

これにより、RCMEDに存在する参照データを、他のいくつかのソースからフェッチされた気候モデルの出力データと比較して、さまざまな種類の分析と評価を実行することができます。以下の画像を参照して、RCMESのアーキテクチャを理解できます。

RCMEDの参照データは、気候モデルの評価に必要なさまざまなパラメーターに従って、衛星ベースのリモートセンシングから取得されます。たとえば、AIRS(大気赤外サウンダ)は地表気温、気温、ジオポテンシャルなどのパラメータを提供し、TRMM(熱帯降雨観測衛星)は月間降水量などを提供します。

MySQLデータベースシステムを使用してNASAが直面する問題:

  • 上の画像に示すように、MySQLデータベースに60億の形式のタプル(緯度、経度、時間、データポイント値、高さ)をロードした後、システムがクラッシュしました。
  • テーブル全体を小さなサブセットに分割した後でも、システムはデータの処理中に大きなオーバーヘッドを生成しました。

そのため、クエリ機能のようなSQLを使用して、この膨大な量のデータを保存および処理できるスケーラブルなソリューションが必要でした。最後に、彼らは上記の問題を克服するためにApacheHiveを使用することを決定しました。

Apache Hiveはどのように問題を解決できますか?

では、NASAのJPLチームがソリューション戦略の不可欠な部分としてApacheHiveを含めるように説得した機能は何でしょうか。

  • Apache HiveはHadoop上で実行されるため、スケーラブルであり、分散された並列方式でデータを処理できます。
  • SQLに似ているため、簡単に習得できるHiveクエリ言語を提供します。

ハイブの展開:

次の画像は、ApacheHiveと統合されたRCMESアーキテクトを説明しています。

:Hiveチュートリアル– ApacheHiveを使用したRCMESアーキテクチャ

上の画像は、RCMESでのApacheハイブのデプロイを示しています。 Apache Hiveのデプロイ中に、NASAチームは次の手順を実行しました。

  • 上の画像に示すように、ClouderaとApacheHadoopを使用してHiveをインストールしました。
  • 彼らはApacheSqoopを使用して、MySQLデータベースからHiveにデータを取り込みました。
  • Apache OODTラッパーは、Hiveでクエリを実行し、データをRCMETに取得するために実装されました。

Hiveを使用した最初のベンチマーク観察:

  • 最初に、25億のデータポイントを1つのテーブルにロードし、カウントクエリを実行しました。例えば、 ハイブ> dataPointからcount(datapoint_id)を選択します。すべてのレコードをカウントするのに5〜6分かかりました(68億レコード全体で15〜17分)。
  • 削減フェーズは高速でしたが、マップフェーズは合計処理時間の95%を要しました。彼らは6つを使用していました( 4xクアッドコア )システム 24 GB RAM (約)各システムで。
  • マシンを追加した後でも、HDFSブロックサイズ(64 MB、128 MB、256 MB)を変更し、他の多くの構成変数(ioソートファクター、iソートmb)、カウントを完了するまでの時間を短縮することにあまり成功しませんでした。

Hiveコミュニティのメンバーからの意見:

最後に、Hiveコミュニティのメンバーが救助に来て、現在のHive実装の問題を解決するためのさまざまな洞察を提供しました。

  • 彼らは、HDFSの読み取り速度はおよそ 60 MB/s と比較して 1GB /秒 ローカルディスクの場合、NameNodeのネットワーク容量とワークロードによって異なります。
  • メンバーは 16マッパー 現在のシステムでは、ローカルの非HadoopタスクのI / Oパフォーマンスと一致する必要があります。
  • 彼らはまた、 スプリットサイズ マッパーごとに数を増やすマッパー、したがって、より多くの並列処理を提供します。
  • 最後に、コミュニティのメンバーは彼らに 使用カウント(1) 言及する代わりに カウント (( datapoint_id) 。これは、カウント(1)の場合、参照列がないため、カウントの実行中に解凍と逆シリアル化が行われないためです。

最後に、NASAは、Hiveコミュニティのメンバーからのすべての提案を考慮に入れて、Hiveクラスターを期待に合わせて調整することができました。したがって、上記のシステム構成を使用して、わずか15秒で数十億の行をクエリすることができました。

Apache Hiveチュートリアル:Hiveアーキテクチャとそのコンポーネント

次の画像は、Hiveアーキテクチャとクエリが送信されるフローを示していますハイブそして最後に、MapReduceフレームワークを使用して処理されます。

Javaでの日付までの文字列

:Hiveチュートリアル–Hiveアーキテクチャ

上の画像に示されているように、Hiveアーキテクチャは次のコンポーネントに分類できます。

  • ハイブクライアント: Hiveは、JDBC、Thrift、およびODBCドライバーを使用して、Java、C ++、Pythonなどの多くの言語で記述されたアプリケーションをサポートします。したがって、選択した言語で記述されたハイブクライアントアプリケーションをいつでも作成できます。
  • Hiveサービス: Apache Hiveは、クエリを実行するためのCLI、Webインターフェイスなどのさまざまなサービスを提供します。このHiveチュートリアルブログで、それぞれについて簡単に説明します。
  • 処理フレームワークとリソース管理: 内部的には、Hiveは、HadoopMapReduceフレームワークを事実上のエンジンとして使用してクエリを実行します。 はそれ自体が別のトピックであるため、ここでは説明しません。
  • 分散ストレージ: HiveはHadoopの上にインストールされるため、分散ストレージに基盤となるHDFSを使用します。あなたは参照することができます HDFSブログ それについてもっと学ぶために。

それでは、Hiveアーキテクチャの最初の2つの主要コンポーネントについて見ていきましょう。

1.ハイブクライアント:

Apache Hiveは、Hiveでクエリを実行するためのさまざまなタイプのクライアントアプリケーションをサポートしています。これらのクライアントは、次の3つのタイプに分類できます。

  • リサイクルクライアント: HiveサーバーはApacheThriftに基づいているため、Thriftをサポートするすべてのプログラミング言語からの要求を処理できます。
  • JDBCクライアント: Hiveを使用すると、Javaアプリケーションは、クラスorgで定義されているJDBCドライバーを使用してHiveに接続できます。apachehadoophive.jdbcHiveDriver。
  • ODBCクライアント: Hive ODBCドライバーを使用すると、ODBCプロトコルをサポートするアプリケーションがHiveに接続できます。 (JDBCドライバーと同様に、ODBCドライバーはThriftを使用してHiveサーバーと通信します。)

2.ハイブサービス:

上の画像に示すように、Hiveは多くのサービスを提供します。それらのそれぞれを見てみましょう:

  • Hive CLI(コマンドラインインターフェイス): これは、Hiveが提供するデフォルトのシェルであり、Hiveのクエリとコマンドを直接実行できます。
  • Apache Hive Webインターフェース: コマンドラインインターフェイスとは別に、HiveはHiveクエリとコマンドを実行するためのWebベースのGUIも提供します。
  • ハイブサーバー: HiveサーバーはApacheThrift上に構築されているため、Thriftサーバーとも呼ばれ、さまざまなクライアントがHiveにリクエストを送信して最終結果を取得できるようにします。
  • Apache Hiveドライバー: クライアントがCLI、Web UI、Thrift、ODBC、またはJDBCインターフェイスを介して送信されたクエリを受信する責任があります。次に、ドライバーはクエリをコンパイラーに渡します。コンパイラーでは、メタストアに存在するスキーマを使用して、解析、型チェック、およびセマンティック分析が行われます。。次のステップでは、最適化された論理計画が、map-reduceタスクとHDFSタスクのDAG(有向非巡回グラフ)の形式で生成されます。最後に、実行エンジンは、Hadoopを使用して、依存関係の順にこれらのタスクを実行します。
  • メタストア: あなたはメタストアを考えることができますすべてのHiveメタデータ情報を格納するための中央リポジトリとして。 Hiveメタデータには、テーブルの構造やパーティションなど、さまざまなタイプの情報が含まれていますHDFSに存在するデータの読み取り/書き込み操作に必要な列、列タイプ、シリアライザー、およびデシリアライザーとともに。メタストア2つの基本単位で構成されています。
    • メタストアを提供するサービス他へのアクセスrHiveサービス。
    • HDFSストレージとは別のメタデータ用のディスクストレージ。

それでは、Hiveメタストアを実装するさまざまな方法を理解しましょうこのHiveチュートリアルの次のセクションで。

Apache Hiveチュートリアル:メタストア構成

Metastoreは、RDBMSと、オブジェクト表現をリレーショナルスキーマに、またはその逆に変換するData Nucleusと呼ばれるオープンソースORM(Object Relational Model)レイヤーを使用してメタデータ情報を格納します。 HDFSの代わりにRDBMSを選択する理由は、低遅延を実現するためです。次の3つの構成でメタストアを実装できます。

1.埋め込みメタストア:

メタストアサービスとHiveサービスはどちらも、メタデータがローカルディスクに保存されている組み込みのDerbyデータベースインスタンスを使用して、デフォルトで同じJVMで実行されます。これは、組み込みメタストア構成と呼ばれます。この場合、一度に1人のユーザーのみがメタストアデータベースに接続できます。 Hiveドライバーの2番目のインスタンスを起動すると、エラーが発生します。これは単体テストには適していますが、実際のソリューションには適していません。

2.ローカルメタストア:

この構成により、複数のHiveセッションを作成できます。つまり、複数のユーザーが同時にメタストアデータベースを使用できます。これは、上記のように同じJVMで実行されているHiveサービスおよびメタストアサービスとは別のJVMまたは異なるマシンで実行されるMySQLなどのJDBC準拠のデータベースを使用することで実現されます。一般に、最も一般的な選択は、MySQLサーバーをメタストアデータベースとして実装することです。

3.リモートメタストア:

リモートメタストア構成では、メタストアサービスは、HiveサービスJVMではなく、独自の個別のJVMで実行されます。他のプロセスは、Thrift NetworkAPIを使用してメタストアサーバーと通信します。この場合、1つ以上のメタストアサーバーを使用して、より多くの可用性を提供できます。リモートメタストアを使用する主な利点は、メタストアデータベースにアクセスするために各HiveユーザーとJDBCログイン資格情報を共有する必要がないことです。

Apache Hiveチュートリアル:データモデル

Hiveのデータは、詳細レベルで3つのタイプに分類できます。

  • テーブル
  • パーティション
  • バケツ

テーブル:

Hiveのテーブルは、リレーショナルデータベースにあるテーブルと同じです。それらに対してフィルター、プロジェクト、結合、および和集合の操作を実行できます。 Hiveには2つのタイプのテーブルがあります。

1.管理対象テーブル:

コマンド:

CREATE TABLE(column1 data_type、column2 data_type)

LOAD DATA INPATHINTOテーブルmanaged_table

名前が示すように(管理対象テーブル)、Hiveは管理対象テーブルのデータを管理する責任があります。つまり、「Hiveがデータを管理する」とは、HDFSに存在するファイルからHiveにデータをロードする場合です。 管理対象テーブル その上でDROPコマンドを発行すると、テーブルとそのメタデータが削除されます。したがって、ドロップされたデータに属するデータ managed_table HDFSのどこにも存在しなくなり、決して取得することはできません。基本的に、LOADコマンドを発行するときにデータをHDFSファイルの場所からHiveウェアハウスディレクトリに移動します。

注意: ウェアハウスディレクトリのデフォルトパスは/ user / hive / warehouseに設定されています。 Hiveテーブルのデータはwarehouse_directoryにあります / table_name(HDFS)。 hive-site.xmlにあるhive.metastore.warehouse.dir構成パラメーターでウェアハウス・ディレクトリーのパスを指定することもできます。

2.外部テーブル:

コマンド:

CREATE EXTERNAL TABLE(column1 data_type、column2 data_type)LOCATION ‘’

データインパス ‘’をテーブルにロード

ために 外部テーブル 、Hiveはデータの管理について責任を負いません。この場合、LOADコマンドを発行すると、Hiveはデータをウェアハウスディレクトリに移動します。次に、Hiveは外部テーブルのメタデータ情報を作成します。ここで、DROPコマンドを発行すると 外部テーブル 、外部テーブルに関するメタデータ情報のみが削除されます。したがって、HDFSコマンドを使用して、ウェアハウスディレクトリからその非常に外部のテーブルのデータを取得できます。

パーティション:

コマンド:

CREATE TABLE table_name(column1 data_type、column2 data_type)PARTITIONED BY(partition1 data_type、partition2 data_type、&hellip。)

Hiveは、列またはパーティションキーに基づいて類似したタイプのデータをグループ化するために、テーブルをパーティションに編成します。各テーブルには、特定のパーティションを識別するための1つ以上のパーティションキーを含めることができます。これにより、データのスライスに対してより高速なクエリを実行できます。

注意: パーティションの作成中に最もよくある間違いは、既存の列名をパーティション列として指定することです。その際、「セマンティック分析のエラー:列のパーティション分割で列が繰り返されました」というエラーが表示されます。

パーティションを理解するために、student_id、name、department、yearなどの工学部の学生情報を含むテーブルstudent_detailsがあります。ここで、department列に基づいてパーティション化を実行すると、すべての学生の情報が表示されます。特定の部門に属するものは、まさにそのパーティションに一緒に格納されます。物理的には、パーティションはテーブルディレクトリ内のサブディレクトリに他なりません。

Student_detailsテーブルにCSE、ECE、Civilの3つの部門のデータがあるとします。したがって、下の画像に示すように、部門ごとに合計3つのパーティションがあります。また、部門ごとに、その部門に関するすべてのデータが、Hiveテーブルディレクトリの下の個別のサブディレクトリにあります。たとえば、CSE部門に関するすべての学生データは、user / hive / Warehouse / student_details/dept。=CSEに保存されます。したがって、CSEの学生に関するクエリは、CSEパーティションに存在するデータを調べるだけで済みます。これにより、スキャンのみでクエリの待ち時間が短縮されるため、パーティショニングが非常に便利になります。 関連する データセット全体ではなく、パーティション化されたデータ。実際、実際の実装では、数百TBのデータを処理することになります。したがって、この膨大な量のデータをスキャンして、クエリを実行することを想像してみてください。 95% あなたがスキャンしたデータはあなたのクエリとは無関係でした。

上のブログを読むことをお勧めします Hiveコマンド ここでは、例を使用してパーティションを実装するさまざまな方法を見つけることができます。

バケット:

コマンド:

CREATE TABLE table_name PARTITIONED BY(partition1 data_type、partition2 data_type、&hellip。)CLUSTERED BY(column_name1、column_name2、…)SORTED BY(column_name [ASC | DESC]、…)] INTO num_buckets BUCKETS

これで、テーブル内の列のハッシュ関数に基づいて、各パーティションまたはパーティション化されていないテーブルをバケットに分割できます。実際には、各バケットはパーティションディレクトリまたはテーブルディレクトリ(パーティション化されていないテーブル)内の単なるファイルです。したがって、パーティションをn個のバケットに分割することを選択した場合、各パーティションディレクトリにn個のファイルがあります。たとえば、上の画像では、各パーティションを2つのバケットにバケット化しています。したがって、CSEなどの各パーティションには2つのファイルがあり、それぞれにCSEの学生のデータが保存されます。

Hiveは行をバケットにどのように分散しますか?

Hiveは、次の式を使用して行のバケット番号を決定します。 hash_function(bucketing_column)モジュロ(num_of_buckets) 。ここで、hash_functionは、列のデータ型によって異なります。たとえば、INTデータ型のuser_idなどの列に基づいてテーブルをバケット化する場合、hash_functionは次のようになります– hash_function(user_id= user_idの整数値 。また、2つのバケットを作成したとすると、Hiveは次の計算によって各パーティションのバケット1に向かう行を決定します。user_idの値)モジュロ(2)。したがって、この場合、user_idが偶数の整数で終わる行は、各パーティションに対応する同じバケットに存在します。他のデータ型のhash_functionは計算が少し複雑で、実際、文字列の場合は人間が認識できません。

注意: Apache Hive 0.xまたは1.xを使用している場合は、コマンドを発行する必要があります–バケット化を実行する前に、Hiveターミナルからhive.enforce.bucketing = trueを設定します。これにより、列をバケット化するためにcluster by句を使用しているときに、正しい数のレデューサーを使用できます。まだ行っていない場合は、テーブルディレクトリに生成されたファイルの数がバケットの数と等しくないことがあります。別の方法として、set mapred.reduce.task = num_bucketを使用して、レデューサーの数をバケットの数と等しく設定することもできます。

なぜバケットが必要なのですか?

パーティションへのバケット化を実行する主な理由は2つあります。

  • マップ側結合 一意の結合キーに属するデータが同じパーティションに存在する必要があります。しかし、パーティションキーが結合と異なる場合はどうでしょうか?したがって、これらの場合、結合キーを使用してテーブルをバケット化することにより、マップ側の結合を実行できます。
  • バケット化により、サンプリングプロセスがより効率的になるため、クエリ時間を短縮できます。

このHiveチュートリアルブログをここで締めくくりたいと思います。このHiveチュートリアルブログを読んだ後、ApacheHiveのシンプルさに気づいたことでしょう。それ以来、皆さんはすべてのHiveの基礎を学びました、ApacheHiveを実際に体験する時が来ました。したがって、Hiveのインストールに関するこのHiveチュートリアルブログシリーズの次のブログをチェックして、ApacheHiveでの作業を開始してください。

Apache Hiveとその機能を理解したので、 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。 EdurekaビッグデータHadoop認定トレーニングコースは、小売、ソーシャルメディア、航空、観光、金融の各ドメインでリアルタイムのユースケースを使用して、学習者がHDFS、Yarn、MapReduce、Pig、Hive、HBase、Oozie、Flume、Sqoopのエキスパートになるのに役立ちます。

質問がありますか?コメント欄にご記入ください。折り返しご連絡いたします。