Hiveでファイルからデータをロードする
前記事はこれ。 begirama.hatenablog.com
読み込むファイルを作成します
今回はタブ区切りの次のようなファイルを作成します。
1 aaa 2 bbb 3 ccc
読み込む先のテーブルを作成します
項目の区切りをタブ、行末を改行として、数値型のidと、文字列型のnameを持つテーブルを作成します。項目の区切りとかを、ロード時じゃなくて、テーブル作成時に指定できるのが、RDBMSとは違う感じ。
hive> create table hoge(id int, name string) row format > delimited fields terminated by '\t' > lines terminated by '\n'; create table hoge(id int, name string) row format delimited fields terminated by '\t' lines terminated by '\n' OK Time taken: 0.138 seconds
load dataでさっき作ったファイルを読み込みます
hive> load data local inpath '/Users/rsogo/work/hive/sample.txt' into table hoge; load data local inpath '/Users/rsogo/work/hive/sample.txt' into table hoge Loading data to table testdb.hoge Table testdb.hoge stats: [numFiles=1, totalSize=19] OK Time taken: 1.659 seconds
ロードしたデータをselectしてみます。項目名が出るように設定して・・・
hive> set hive.cli.print.header=true; set hive.cli.print.header=true
selectします。
hive> select * from hoge; select * from hoge OK hoge.id hoge.name 1 aaa 2 bbb 3 ccc NULL NULL Time taken: 0.118 seconds, Fetched: 4 row(s)
あれ、最後の空行が1レコードとして登録されてる。
Mule HDFSコネクタ5.0.0の検証(Mule EEが必要でした。途中で止めています)
MuleにはHDFSコネクタというのがあって、HDFSに接続できるみたいです。試してみたいと思います。 この検証の結果としては、Mule EEがHDFSコネクタの検証に必要だと分かったため、途中で止めています。
HDFSコネクタの情報源
- リリースノート
HDFS Connector Release Notes // MuleSoft Documentation
このコネクタは「Select」というカテゴリに分類されています。 コネクタのサポートポリシーはこちらに記載があります。
Anypoint Connectors // MuleSoft Documentation
Product Versioning and Back Support Policy
コネクタの入手 GitHub - mulesoft/hdfs-connector: Connects Mule to Hadoop Distributed File System.
サンプル Mule HDFS Connector
このAPIリファレンスにRequires Mule Enterprise License
と記載があるのですが、最初は見落としていました。
- マニュアル HDFS Connector
Anypoint Studioの準備
HDFSコネクタを使用するためにAnypoint Studioをインストールします。 Anypoint StudioはこちらのDownload Anypoint Studioからダウンロードして、インストーラを実行して下さい。 Mule Runtime Engine | MuleSoft Developers
Mule Runtimeのインストール
Anypoint Studioでは埋め込みのMule Runtimeを使うことができます。 インストールもAnypoint Studioから実行できます。
Anypoint Studioの「Help」、「Install New Software」からWork withで「Mule Runtimes for Anypoint Studio」を選択します。
「Anypoint Studio Community Runtimes」を選択してインストールします。
HDFSコネクタのインストール
リリースノートからインストールマニュアルへのリンクが404になるんだけど、多分Githubで公開されてる、このサイトを見ればOKそう。
hdfs-connector/USAGE.md at master · mulesoft/hdfs-connector · GitHub
HDFSコネクタもAnypoint Studioからインストールできます。
Anypoint Studioの「Help」、「Install New Software」からWork withで「Anypoint Connectors Update Site」を選択します。
HDFSコネクタのサンプルを試す
「File」、「Import」からダウンロードしたサンプルのmule-project.xmlを含むディレクトリを開きます。
mule-app.propertiesのconfig.nameNodeUriにHadoopがリッスンしているホスト名とポート番号を設定します。
config.nameNodeUri=hdfs://localhost:9000 config.sysUser=
Anypont Studioで「Run」を実行します。
自分の場合は、dw:transform-message周りでエラーがでたので、List_Status_Flowと、Glob_Status_Flowを丸っと削除することで実行することができました。
エラーが出ずに実行できればhttp://localhost:8090/にアクセスします。
Webベースでいろいろな操作ができるようになっているので、適当に実行してみると・・・
Mule EEが必要だったみたいです。 今回はCEで検証する必要があったので、一旦ここまで。
WebHDFSの検証
ファイルの作成
ファイルのアクセスは2回に分けて行う必要があります。
作成するファイルの中身はこんな感じです。
$ cat sample.txt 1 aaa 2 bbb 3 ccc
まず、1回目。
- PUTメソッドを利用します
- 操作名は
op=create
。 - 上書きする
overwrite=true
。 - ユーザーはここではhadoopを起動させているユーザーを指定しました。
user.name=rsogo
$ curl -i -X PUT "http://localhost:50070/webhdfs/v1/hoge?op=create&overwrite=true&user.name=rsogo" HTTP/1.1 307 TEMPORARY_REDIRECT Cache-Control: no-cache Expires: Tue, 20 Sep 2016 09:59:29 GMT Date: Tue, 20 Sep 2016 09:59:29 GMT Pragma: no-cache Expires: Tue, 20 Sep 2016 09:59:29 GMT Date: Tue, 20 Sep 2016 09:59:29 GMT Pragma: no-cache Content-Type: application/octet-stream Set-Cookie: hadoop.auth="u=rsogo&p=rsogo&t=simple&e=1474401569719&s=BASKS30rCxMmFD2EbnvPj3Km04A="; Path=/; Expires=?, 20-9-2016 19:59:29 GMT; HttpOnly Location: http://192.168.10.2:50075/webhdfs/v1/hoge?op=CREATE&user.name=rsogo&namenoderpcaddress=localhost:9000&overwrite=true Content-Length: 0 Server: Jetty(6.1.26)
ここでLocationにリダイレクト先のURIが返ってきます。 Hadoopはデータが分散して配置されるのでデータが配置されている場所が返ってきます。
2回目。
リダイレクトされたURL宛に-T
で送るファイルを指定して、リクエストを送ります。
$ curl -i -X PUT "http://192.168.10.2:50075/webhdfs/v1/hoge?op=CREATE&user.name=rsogo&namenoderpcaddress=localhost:9000&overwrite=true" -T sample.txt HTTP/1.1 100 Continue HTTP/1.1 201 Created Location: hdfs://localhost:9000/hoge Content-Length: 0 Connection: close
201 Createdが返ってくればOK。
ファイルの状態確認
$ curl -i "http://localhost:50070/webhdfs/v1/hoge?op=LISTSTATUS" HTTP/1.1 200 OK Cache-Control: no-cache Expires: Tue, 20 Sep 2016 10:08:06 GMT Date: Tue, 20 Sep 2016 10:08:06 GMT Pragma: no-cache Expires: Tue, 20 Sep 2016 10:08:06 GMT Date: Tue, 20 Sep 2016 10:08:06 GMT Pragma: no-cache Content-Type: application/json Transfer-Encoding: chunked Server: Jetty(6.1.26) {"FileStatuses":{"FileStatus":[ {"accessTime":1474365590688,"blockSize":134217728,"childrenNum":0,"fileId":16409,"group":"supergroup","length":19,"modificationTime":1474365591427,"owner":"rsogo","pathSuffix":"","permission":"755","replication":1,"storagePolicy":0,"type":"FILE"} ]}}
ownerはファイル生成の時に指定したユーザーになってますね。 "owner":"rsogo"
ファイルの読み込み
これもCreate同様、2回に別けて行う必要があります。
1回目。Namenodeに向かって下記のコマンドを投げると、リダイレクトを指示されます。
- GETメソッドを利用します
- 操作名は
op=OPEN
。
$ curl -i "http://localhost:50070/webhdfs/v1/hoge?op=OPEN" HTTP/1.1 307 TEMPORARY_REDIRECT Cache-Control: no-cache Expires: Tue, 20 Sep 2016 10:09:39 GMT Date: Tue, 20 Sep 2016 10:09:39 GMT Pragma: no-cache Expires: Tue, 20 Sep 2016 10:09:39 GMT Date: Tue, 20 Sep 2016 10:09:39 GMT Pragma: no-cache Content-Type: application/octet-stream Location: http://192.168.10.2:50075/webhdfs/v1/hoge?op=OPEN&namenoderpcaddress=localhost:9000&offset=0 Content-Length: 0 Server: Jetty(6.1.26)
2回目、支持されたURIにアクセスすることで、Body部に先程作成したファイルの内容が返ってきます。
- GETメソッドを利用します
$ curl -i "http://192.168.10.2:50075/webhdfs/v1/hoge?op=OPEN&namenoderpcaddress=localhost:9000&offset=0" HTTP/1.1 200 OK Access-Control-Allow-Methods: GET Access-Control-Allow-Origin: * Content-Type: application/octet-stream Connection: close Content-Length: 19 1 aaa 2 bbb 3 ccc
検証中、自宅のルーターが不安定でIPアドレスが途中で変わってしまうという事象が発生した。 この時、
参考にさせていただいたサイト
WebHDFS APIメモ(Hishidama's Hadoop WebHDFS REST API Memo)