web-dev-qa-db-ja.com

Hadoopへのデータの書き込み

Windowsボックスなどの外部ソースからHadoop(HDFS)にデータを書き込む必要があります。現在、私はデータをnamenodeにコピーし、HDFSのputコマンドを使用してそれをクラスターに取り込みました。コードを閲覧したところ、これを行うためのAPIが見つかりませんでした。私は誰かが私が間違っていることを示すことができ、HDFSに対して外部クライアントをコーディングする簡単な方法があることを望んでいます。

18
Steve Severance

Cygwinをインストールし、Hadoopをローカルにインストールします(NNを指すバイナリーと構成のみが必要です。実際にサービスを実行する必要はありません)。hadoop fs -copyFromLocal /path/to/localfile /hdfs/path/を実行します。

新しいClouderaデスクトップを使用してWeb UI経由でファイルをアップロードすることもできますが、巨大なファイルには適さない場合があります。

HDFS用のWebDAVオーバーレイもありますが、それがどれほど安定/信頼できるかはわかりません。

11
SquareCog

JavaにはAPIがあります。プロジェクトにHadoopコードを含めることで使用できます。 JavaDocは一般的に非常に役立ちますが、もちろん、何を探しているのかを知る必要があります* g * http://hadoop.Apache.org/common/docs/

特定の問題については、次を参照してください。 http://hadoop.Apache.org/common/docs/current/api/org/Apache/hadoop/fs/FileSystem.html (これは最新のリリース、別のバージョンについては他のJavaDocsを参照してください!)

典型的な呼び出しは次のようになります:Filesystem.get(new JobConf()).create(new Path("however.file"));これは、通常のJavaIOで処理できるストリームを返します。

17

HDFSに配置する必要があるデータのロードの問題については、問題を解決することにしました。

ファイルが存在するサーバーからHDFSにファイルをアップロードする代わりに、Java Map/Reduceジョブを作成し、マッパーがファイルサーバーからファイルを(この場合はhttps経由で)読み取る)、次に Java API を介してHDFSに直接書き込みます。

ファイルのリストは入力から読み取られます。次に、フェッチするファイルのリストをファイルに入力し、(hadoop dfs -putを使用して)HDFSにファイルをアップロードする外部スクリプトを作成します。適切な数のマッパーを使用して、map/reduceジョブを開始します。

これにより、複数のファイルが同時に読み書きされるため、優れた転送パフォーマンスが得られます。

たぶんあなたが探していた答えではないかもしれませんが、とにかく役立つでしょう:-)。

13
Erik Forsberg

私の最後の回答から約2年後、Hoop/HttpFSとWebHDFSの2つの新しい選択肢があります。

Hoopについては、最初に Clouderaのブログ で発表され、 githubリポジトリ からダウンロードできます。私はこのバージョンを取得して、少なくともHadoop 0.20.1と正常に通信できるようにしました。おそらく、少し古いバージョンとも通信できます。

執筆時点ではまだリリースされていないHadoop 0.23.1を実行している場合、Hoopは独自のコンポーネントであるHttpFSとしてHadoopの一部です。この作業は HDFS-2178 の一部として行われました。 Hoop/HttpFSは、HDFSだけでなく、Amazon S3などの他のHadoop互換ファイルシステムのプロキシにもなります。

Hoop/HttpFSは、独自のスタンドアロンサービスとして実行されます。

NameNodeおよびDataNodeサービスの一部として実行される WebHDFS もあります。また、REST APIを提供します。これは、私が正しく理解していれば、HttpFS APIと互換性があります。WebHDFSはHadoop 1.0の一部であり、その主要な機能の1つはデータの局所性を提供することです。読み取りリクエストを行うと、データが存在するデータノードのWebHDFSコンポーネントにリダイレクトされます。

どのコンポーネントを選択するかは、現在のセットアップと必要なものによって多少異なります。 HTTP REST HDFSへのインターフェイスが必要で、WebHDFSを含まないバージョンを実行している場合、githubリポジトリからHoopを使用するのが最も簡単なオプションのようです。 WebHDFSが含まれているバージョンでは、WebHDFSにはないHoopの機能(他のファイルシステムへのアクセス、帯域幅の制限など)が必要な場合を除いて、そのために使用します。

12
Erik Forsberg

http://wiki.Apache.org/hadoop/MountableHDFS に、これ専用のページがあるようです。

これらのプロジェクト(以下に列挙)では、mountコマンドを使用して、標準のファイルシステムとしてHDFSをマウントできます(ほとんどの種類のUnix)。マウントすると、ユーザーは「ls」、「cd」、「cp」、「mkdir」、「find」、「grep」などの標準的なUnixユーティリティを使用してhdfsのインスタンスを操作したり、openなどの標準のPosixライブラリを使用したりできます。 C、C++、Python、Ruby、Perl、Java、bashなどから書き込み、読み取り、閉じる.

後でこれらのプロジェクトについて説明します

  • contrib/Fuse-dfsは、Fuse、一部のC接着剤、libhdfs、およびhadoop-dev.jarに基づいて構築されています
  • Fuse-j-hdfsは、Fuse、Fuse for Java、およびhadoop-dev.jarに基づいて構築されています
  • hdfs-Fuse-Googleコードプロジェクトはcontrib/Fuse-dfsに非常に似ています
  • webdav-webdavリソースマップとして公開されたhdfsR-読み取り/書き込みNFSアクセスをサポートするクローズドソースのhdfs互換ファイルシステムが含まれます
  • HDFS NFS Proxy-Fuseを使用せずにHDFSをNFSとしてエクスポートします。 Kerberosをサポートし、書き込みを並べ替えて、hdfsに順次書き込まれるようにします。

私はこれらのいずれも試していませんが、OPと同じニーズがあり次第、回答を更新します

3
Eran Medan

あなたがコードを実行しているマシンにHDFSをマウントすることを試みることができます(machine_Xと呼びます)そしてmachine_XはHDFSとのインフィニバンド接続を持っているはずですこれをチェックしてください https://wiki.Apache.org/hadoop/MountableHDFS

0
Anay T

Hadoop統合用のコンポーネントを含むTalendを使用することもできます。

0
Guillaume

HadoopDrive( http://hadoopdrive.effisoft.e )を使用することもできます。これはWindowsシェル拡張です。

0
zuko