복붙노트

[HADOOP] 스칼라를 사용하여 HDFS에 쓰는 방법

HADOOP

스칼라를 사용하여 HDFS에 쓰는 방법

스칼라를 배우고 있는데 HDFS에 사용자 정의 파일을 작성해야합니다. 랩탑에서 vmware fusion을 사용하여 Cloudera 이미지에서 실행되는 자체 HDFS가 있습니다.

이것은 내 실제 코드입니다.

package org.glassfish.samples

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.PrintWriter;

/**
* @author ${user.name}
*/
object App {

def main(args : Array[String]) {
println( "Trying to write to HDFS..." )
val conf = new Configuration()
val fs= FileSystem.get(conf)
val output = fs.create(new Path("hdfs://quickstart.cloudera:8020/tmp/mySample.txt"))
val writer = new PrintWriter(output)
try {
    writer.write("this is a test") 
    writer.write("\n")
}
finally {
    writer.close()
}
print("Done!")
}

}

그리고 나는이 예외를 얻고있다 :

Caused by: java.lang.IllegalArgumentException: Wrong FS: hdfs://quickstart.cloudera:8020/tmp, expected: file:///
at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:645)
at org.apache.hadoop.fs.RawLocalFileSystem.pathToFile(RawLocalFileSystem.java:80)
at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:414)
at org.apache.hadoop.fs.ChecksumFileSystem.mkdirs(ChecksumFileSystem.java:588)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:439)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:426)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:908)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:889)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:786)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:775)
at org.glassfish.samples.App$.main(App.scala:19)
at org.glassfish.samples.App.main(App.scala)
... 6 more

터미널과 색조를 사용하여 hdfs에 액세스 할 수 있습니다.

[cloudera@quickstart ~]$ hdfs dfs -ls /tmp
Found 3 items
drwxr-xr-x   - hdfs     supergroup          0 2015-06-09 17:54 /tmp/hadoop-yarn
drwx-wx-wx   - hive     supergroup          0 2015-08-17 15:24 /tmp/hive
drwxr-xr-x   - cloudera supergroup          0 2015-08-17 16:50 /tmp/labdata

이것은 내 pom.xml입니다.

명령을 사용하여 프로젝트를 실행했습니다.

mvn 클린 패키지 스칼라 : run

내가 뭘 잘못하고 있니? 미리 감사드립니다!

@jeroenr 조언 후 편집

이것은 실제 코드입니다.

package org.glassfish.samples

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.PrintWriter;

/**
* @author ${user.name}
*/
object App {

//def foo(x : Array[String]) = x.foldLeft("")((a,b) => a + b)

def main(args : Array[String]) {
println( "Trying to write to HDFS..." )
val conf = new Configuration()
//conf.set("fs.defaultFS", "hdfs://quickstart.cloudera:8020")
conf.set("fs.defaultFS", "hdfs://192.168.30.147:8020")
val fs= FileSystem.get(conf)
val output = fs.create(new Path("/tmp/mySample.txt"))
val writer = new PrintWriter(output)
try {
    writer.write("this is a test") 
    writer.write("\n")
}
finally {
    writer.close()
    println("Closed!")
}
println("Done!")
}

}

해결법

  1. ==============================

    1.이 예제를 여기에서보십시오. 나는 문제가 당신이 기본 파일 시스템을 사용하지 않는 구성이라고 생각합니다.

    이 예제를 여기에서보십시오. 나는 문제가 당신이 기본 파일 시스템을 사용하지 않는 구성이라고 생각합니다.

    conf.set("fs.defaultFS", "hdfs://quickstart.cloudera:8020")
    

    다음과 같이 상대 경로를 전달하십시오.

    fs.create(new Path("/tmp/mySample.txt"))
    

    파일에 쓰려면 fs.create가 반환하는 출력 스트림에서 직접 'write'를 호출하십시오.

    val os = fs.create(new Path("/tmp/mySample.txt"))
    os.write("This is a test".getBytes)
    
  2. from https://stackoverflow.com/questions/32380272/how-to-write-to-hdfs-using-scala by cc-by-sa and MIT license