복붙노트

[HADOOP] hadoop에서 객체를 직렬화하는 법 (HDFS에서)

HADOOP

hadoop에서 객체를 직렬화하는 법 (HDFS에서)

나는 HashMap 를 가지고있다. 내 HashMap 객체 (hmap)를 HDFS 위치로 직렬화하고 나중에 Mapper 및 Reducers에서 deserialize하여 사용하고 싶습니다.

HDFS에서 내 HashMap 객체를 직렬화하려면 다음과 같이 일반적인 Java 객체 직렬화 코드를 사용했지만 오류 (사용 권한이 거부 됨)

try
        {
            FileOutputStream fileOut =new FileOutputStream("hashmap.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(hm);
            out.close();

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

다음과 같은 예외가 있습니다.

java.io.FileNotFoundException: hashmap.ser (Permission denied)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:110)
    at KMerIndex.createIndex(KMerIndex.java:121)
    at MyDriverClass.formRefIndex(MyDriverClass.java:717)
    at MyDriverClass.main(MyDriverClass.java:768)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

누군가 제안하거나 hdfs에 hadoop에서 객체를 직렬화하는 방법에 대한 샘플 코드를 공유 할 수 있습니까?

해결법

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

    1.Apache Commons Lang의 SerializationUtils를 사용해보십시오.

    Apache Commons Lang의 SerializationUtils를 사용해보십시오.

    아래는 방법들이다.

    static Object   clone(Serializable object)  //Deep clone an Object using serialization.
    static Object   deserialize(byte[] objectData) //Deserializes a single Object from an array of bytes.
    static Object   deserialize(InputStream inputStream)  //Deserializes an Object from the specified stream.
    static byte[]   serialize(Serializable obj) //Serializes an Object to a byte array for storage/serialization.
    static void serialize(Serializable obj, OutputStream outputStream) //Serializes an Object to the specified stream.
    

    HDFS에 저장하는 동안 serialize에서 반환 된 byte []를 저장할 수 있습니다. Object를 가져 오는 동안 ex : File 객체에 해당하는 객체에 캐스트를 입력하면 다시 가져올 수 있습니다.

    내 경우에는 Hbase 칼럼에 하나의 hashmap을 저장하고 있었는데, 나는 그것을 다시 검색했다. 나의 맵퍼 메소드에서 Hashmap과 같다. 그리고 성공했다.

    물론, 같은 방법으로도 할 수 있습니다.

    또 다른 것은 아파치 코 몬즈 (Apache Commons IO)를 사용할 수도있다. IO this (org.apache.commons.io.FileUtils); 나중에이 파일을 HDFS에 복사해야합니다. HDFS를 데이터 저장소로 사용하고자했기 때문입니다.

    FileUtils.writeByteArrayToFile(new File("pathname"), myByteArray);
    

    참고 : jar apache commons io와 apache commons lang은 항상 hadoop 클러스터에서 사용할 수 있습니다.

  2. from https://stackoverflow.com/questions/37545602/how-to-serialize-object-in-hadoop-in-hdfs by cc-by-sa and MIT license