web-dev-qa-db-ja.com

pysparkからhdfsのファイルを読み取る

Hdfsでファイルを読み取ろうとしています。これが私のhadoopファイル構造の表示です。

hduser@GVM:/usr/local/spark/bin$ hadoop fs -ls -R /
drwxr-xr-x   - hduser supergroup          0 2016-03-06 17:28 /inputFiles
drwxr-xr-x   - hduser supergroup          0 2016-03-06 17:31 /inputFiles/CountOfMonteCristo
-rw-r--r--   1 hduser supergroup    2685300 2016-03-06 17:31 /inputFiles/CountOfMonteCristo/BookText.txt

これが私のpysparkコードです。

from pyspark import SparkContext, SparkConf

conf = SparkConf().setAppName("myFirstApp").setMaster("local")
sc = SparkContext(conf=conf)

textFile = sc.textFile("hdfs://inputFiles/CountOfMonteCristo/BookText.txt")
textFile.first()

私が得るエラーは:

Py4JJavaError: An error occurred while calling o64.partitions.
: Java.lang.IllegalArgumentException: Java.net.UnknownHostException: inputFiles

これは、sparkContextを誤って設定しているためですか?これを、仮想ボックスを介してubuntu 14.04仮想マシンで実行しています。

ここで何が間違っているのかわかりません。

9
user1357015

設定が提供されていない場合は、フルパス経由でHDFSファイルにアクセスできます(hdfsがローカル環境にある場合、namenodehostはlocalhostです)。

hdfs://namenodehost/inputFiles/CountOfMonteCristo/BookText.txt
11
Shawn Guo

権限を提供しないため、URIは次のようになります。

hdfs:///inputFiles/CountOfMonteCristo/BookText.txt

それ以外の場合、inputFilesはホスト名として解釈されます。正しい構成を使用すると、スキームを使用する必要はまったくありません。

/inputFiles/CountOfMonteCristo/BookText.txt

代わりに。

7
zero323

Sparkでファイルを読み取る一般的な方法は2つあります。1つは巨大に分散したファイルを並行して処理する方法、1つはルックアップテーブルやHDFSの設定などの小さなファイルを読み取る方法です。後者の場合、ドライバーノードまたはワーカーのファイルを単一の読み取り(分散読み取りではなく)として読み取りたい場合があります。その場合、以下のようなSparkFilesモジュールを使用する必要があります。

# spark is a SparkSession instance
from pyspark import SparkFiles

spark.sparkContext.addFile('hdfs:///user/bekce/myfile.json')
with open(SparkFiles.get('myfile.json'), 'rb') as handle:
    j = json.load(handle)
    or_do_whatever_with(handle)
2
bekce

まず、実行する必要があります

export PYSPARK_PYTHON=python3.4 #what so ever is your python version

コード

from pyspark.sql import SparkSession
from pyspark import SparkConf, SparkContext

spark = SparkSession.builder.appName("HDFS").getOrCreate()
sparkcont = SparkContext.getOrCreate(SparkConf().setAppName("HDFS"))
logs = sparkcont.setLogLevel("ERROR")

data = [('First', 1), ('Second', 2), ('Third', 3), ('Fourth', 4), ('Fifth', 5)]
df = spark.createDataFrame(data)

df.write.csv("hdfs:///mnt/data/")
print("Data Written")

コードを実行するには

spark-submit --master yarn --deploy-mode client <py file>
0
Sahil Nagpal