0

Cloudera QuickStart VM で CentOS を使用しています。他の質問How to save DataFrame directly to Hive?に従って、sbt マネージド Spark アプリケーションを作成しました。.

build.sbt

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.5.2"
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.5.2"
libraryDependencies += "org.apache.spark" % "spark-mllib_2.10" % "1.5.2"
libraryDependencies += "org.apache.spark" % "spark-streaming_2.10" % "1.5.2"
libraryDependencies += "org.apache.spark" %% "spark-hive" % "1.5.2"

次のように DataFrame を Hive テーブルとして使用したいと思います。

 recordDF.registerTempTable("mytempTable")
 hiveContext.sql("create table productstore as select * from mytempTable"); 

エラーが発生していることに気付きました:

ルート スクラッチ ディレクトリ: /tmp/hive は書き込み可能である必要があります。現在のパーミッションは: rwx------

他の質問に従い、HDFS に設定chmod 777しました。/tmp/hive

Spark がローカル ファイルシステム /tmp/hive を使用していることを知りました。

ローカルファイルシステムに対して chmod を実行しました。

今、私はエラーが発生しています

org.apache.hadoop.hive.ql.metadata.HiveException: MetaException (message:file:/user/hive/warehouse/productstore はディレクトリではないか、ディレクトリを作成できません)

HDFS ハイブ ウェアハウスに DataFrame を保存したいと思います。

4

1 に答える 1

1

ここには 2 つの問題があります。

問題 1 - アクセス許可

Linux や macOS などの CentOS (またはその他の Unix フレーバー) では、次のようにします。

chmod -R 777 /tmp/hive

(これは一時ディレクトリであるため、OS上の誰でも書き込み可能にする必要があります)。

問題 2 - Hive メタストア ディレクトリ

Cloudera QuickStart VM を使用しているため、Spark 2.0 より前 (おそらく 1.6.3?) を使用します。

この問題はpath、DataFrame を Hive テーブルに永続化するときに指定されていないことが原因です。

ディレクトリ/user/hive/warehouseはデフォルトで使用され、ディレクトリへの書き込みを回避するには、メソッドまたはパス オプションpathを使用して Hive テーブルに保存するときにオプションを定義します。optionsave

df.write.option("path", "[path-here]").saveAsTable("tableName")

Spark 2.0 では、上記の行は、 Spark プロパティspark-warehouseで指定された現在のディレクトリにあるローカルの Hive メタストア (Derby を使用) に書き込みます。spark.sql.warehouse.dir

2.0.2アップグレードするには、 (not 1.5.2)を使用して Spark の依存関係を定義してください。

libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.0.2"

(Spark SQL で Hive をサポートするために本当に必要なのは、たった 1 行だけです)。

hive.metastore.warehouse.dir次に、またはを使用spark.sql.warehouse.dirして Spark ウェアハウスを設定し、他の Hive テーブルが存在する HDFS を指すことができます。

于 2016-12-25T19:37:36.597 に答える