web-dev-qa-db-ja.com

Hadoopでファイルとファイルコンテンツを検索/検索する

現在、Hadoop DFSを使用したプロジェクトに取り組んでいます。

  1. Hadoopシェルに検索または検索コマンドがないことに気づきました。 Hadoop DFSでファイル(testfile.docなど)を検索する方法はありますか?

  2. Hadoopはファイルコンテンツ検索をサポートしていますか?もしそうなら、それを行う方法は?たとえば、多くのWord DocファイルがHDFSに保存されているので、「コンピューターサイエンス」という単語が含まれているファイルを一覧表示したいと思います。

他の分散ファイルシステムではどうですか?ファイルコンテンツ検索は分散ファイルシステムのソフトスポットですか?

16
leon
  1. あなたはこれを行うことができます: hdfs dfs -ls -R / | grep [search_term]
  2. ここではMapReduceジョブが適しているようです。 こちら 似たようなものですが、テキストファイル用です。ただし、これらのドキュメントが小さい場合は、非効率になる可能性があります。基本的に、各ファイルは1つのマップタスクに割り当てられます。ファイルが小さい場合、マップタスクを設定するためのオーバーヘッドは、ファイルの処理に必要な時間と比較してかなり大きくなる可能性があります。
42
ajduff574

データがHDFSに格納されている方法によっては、-textオプションを使用して文字列検索のdfsを実行する必要がある場合があります。私の場合、AVRO形式の一連のHDFSシーケンスファイルに毎日何千ものメッセージが保存されていました。 Edgeノードのコマンドラインから、次のスクリプトを実行します。

  1. / data/lake/rawディレクトリを最初のレベルで検索して、ファイルのリストを探します。
  2. 結果をawkに渡し、列6および8(日付とファイル名)を出力します。
  3. Grepは問題のファイル日付の行を出力します(2018-05-03)
  4. 2列の行をawkに渡します。awkは、ファイルのリストである列2のみを出力します。
  5. これは、各ファイル名を取得し、HDFSからテキストとして抽出するwhileループで読み取られます。
  6. ファイルの各行は、文字列 "7375675"に対してgrepさ​​れます。
  7. その基準を満たす行が画面に出力されます(stdout)

私が試したことがないと思われるより高速なsolr jarファイルの実装があります。

hadoop fs -ls /data/lake/raw | awk {'print $6"   "$8'} | grep 2018-05-03 | awk {'print $2'} | while read f; do hadoop fs -text $f | grep 7375675 && echo $f ; done
2
Mike Woodcock

hadoop.HdfsFindTool をsolrで使用できます。これは「hdfs dfs ls -R」よりも速く、より便利です。

hadoop jar search-mr-job.jar org.Apache.solr.hadoop.HdfsFindTool -find /user/Hive/tmp -mtime 7

Usage: hadoop fs [generic options]
    [-find <path> ... <expression> ...]
    [-help [cmd ...]]
    [-usage [cmd ...]]
2
Mark

1の場合、次のように検索できます。

hadoop -find . -name "<name_of_file>"
0
Gadzair

1.- HDFSには-findというfindコマンドがあり、最初の例ではこれが機能します。

hdfs dfs -find /some/path/ -name "testfile.doc"

2.-コンテンツ検索の場合、ファイルを一覧表示し、結果をファイルに保存することをお勧めします

  hdfs dfs -ls -R /some/path/ >> someFile

そして、次のようにそのファイルにいくつかのフィルタを配置します:

  cat someFile | grep "computer science"

そして、あなたはあなたの結果を得るでしょう。

0
EEsparaquia

通常、ajduff574で述べられているように、hadoopでファイルを検索するときは、

hdfs dfs -ls -R $ path | grep "$ file_pattern" | awk '{print $ 8}'

このコードは、各パターンのパスを出力するだけで、ファイルのコンテンツ内を検索する場合に備えてさらに操作できます。例:

hdfs dfs -cat $(hdfs dfs -ls -R $ path | grep "$ file_pattern" | awk '{print $ 8}')| grep "$ search_pattern"

search_pattern:ファイル内で探しているコンテンツ

file_pattern:探しているファイル。

パス:再帰的に検索する検索のパス。これにはサブフォルダーも含まれます。

0
Lars Gustafsson