복붙노트

[HADOOP] Python을 사용하여 HDFS에서 파일 이름 목록보기

HADOOP

Python을 사용하여 HDFS에서 파일 이름 목록보기

하둡 멍청한 놈.

hadoop과 python을 시작하는 데 많은 도움이되는 튜토리얼을 많이 찾았습니다. 매퍼 (mappers)와 리듀서 (reducers)를 사용하여 작업 할 필요가 없지만 액세스 문제가 더 많습니다.

Hadoop 클러스터의 일부로, HDFS에는 .dat 파일이 많이 있습니다.

파이썬을 사용하여 내 클라이언트 (로컬 컴퓨터)의 파일에 액세스하려면,

어떤 링크도 도움이 될 것입니다.

해결법

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

    1.클러스터의 노드에 로그인 액세스 권한이 있어야합니다. 클러스터 관리자가 노드를 선택하고 계정을 설정하고 노드에 안전하게 액세스하는 방법을 알려줍니다. 관리자 인 경우 클러스터가 로컬 또는 원격인지 여부를 원격지에 알려주고 컴퓨터 또는 회사 또는 타사 클라우드에 호스트되어 있는지 여부를 알려주십시오. 해당되는 경우 관련 정보를 제공 할 수 있습니다.

    클러스터의 노드에 로그인 액세스 권한이 있어야합니다. 클러스터 관리자가 노드를 선택하고 계정을 설정하고 노드에 안전하게 액세스하는 방법을 알려줍니다. 관리자 인 경우 클러스터가 로컬 또는 원격인지 여부를 원격지에 알려주고 컴퓨터 또는 회사 또는 타사 클라우드에 호스트되어 있는지 여부를 알려주십시오. 해당되는 경우 관련 정보를 제공 할 수 있습니다.

    HDFS에서 파일 이름을 조회하려면 클러스터 노드에 로그인하고 hadoop fs -ls [경로]를 실행하십시오. 경로는 선택 사항이며 제공되지 않으면 홈 디렉토리에있는 파일이 나열됩니다. -R이 옵션으로 제공되면 경로의 모든 파일을 재귀 적으로 나열합니다. 이 명령에 대한 추가 옵션이 있습니다. 이 파일과 다른 Hadoop 파일 시스템 쉘 명령에 대한 자세한 내용은 http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/FileSystemShell.html을 참조하십시오.

    파이썬에서 HDFS 파일 이름을 쿼리하는 쉬운 방법은 하위 프로세스에서 hadoop fs -ls hdfs_url을 실행하는 esutil.hdfs.ls (hdfs_url = '', recurse = False, full = False)를 사용하는 것입니다. 다른 Hadoop 파일 시스템 쉘 명령의 수 (http://code.google.com/p/esutil/source/browse/trunk/esutil/hdfs.py에있는 소스 참조). esutil은 pip install esutil과 함께 설치할 수 있습니다. PyPI는 https://pypi.python.org/pypi/esutil에 있으며 문서는 http://code.google.com/p/esutil/에 있으며 GitHub 사이트는 https://github.com입니다. / esutldon / esutil.

  2. ==============================

    2.Hadoop이 설치되어 실행되고 있어야하며, 당연히 Python이 필요하다.

    Hadoop이 설치되어 실행되고 있어야하며, 당연히 Python이 필요하다.

    이런 식으로 시도해보십시오. 코드를 테스트하지 않았으므로이 코드에만 의존하지 마십시오.

    from subprocess import Popen, PIPE
    
    process = Popen('hdfs dfs -cat filename.dat',shell=True,stdout=PIPE, stderr=PIPE)
    std_out, std_err = process.communicate()
    
    check for returncode, std_err
    if:
        everything is OK, do whatever with stdout
    else:
        do something in else condition
    

    Hadoop 용 Python API 인 Pydoop을 살펴볼 수도 있습니다.

    필자의 예제에는 shell = true가 포함되어 있지만 보안 위험이 있으므로 실행하지 않아도됩니다. shell = True를 사용하지 않는 이유는 무엇입니까?

  3. ==============================

    3.지금까지 내가 말할 수 있었던 것은 이것에 대한 즉시 사용 가능한 해결책이 없다는 것을 알았고, 대부분의 해답은 hdfs 명령에 대한 호출 사용에 의지했습니다. 저는 리눅스에서 돌아가고 있으며 같은 도전을합니다. sh 패키지가 유용하다는 것을 알았습니다. 이 명령은 o / s 명령을 실행하고 stdin / out / err을 관리합니다.

    지금까지 내가 말할 수 있었던 것은 이것에 대한 즉시 사용 가능한 해결책이 없다는 것을 알았고, 대부분의 해답은 hdfs 명령에 대한 호출 사용에 의지했습니다. 저는 리눅스에서 돌아가고 있으며 같은 도전을합니다. sh 패키지가 유용하다는 것을 알았습니다. 이 명령은 o / s 명령을 실행하고 stdin / out / err을 관리합니다.

    여기에 대한 자세한 정보는 https://amoffat.github.io/sh/를 참조하십시오.

    가장 깨끗한 솔루션은 아니지만 한 줄 (ish)이며 표준 패키지를 사용합니다.

    다음은 HDFS 디렉토리 목록을 가져 오는 제 작성 코드입니다. 그것은 파일과 폴더를 모두 나열 할 것이므로이를 구별해야 할 필요가있을 수도 있습니다.

    import sh
    hdfsdir = '/somedirectory'
    filelist = [ line.rsplit(None,1)[-1] for line in sh.hdfs('dfs','-ls',hdfsdir).split('\n') if len(line.rsplit(None,1))][1:]
    

    내 결과 -이 경우 모두 디렉토리입니다.

    [u'/somedirectory/transaction_basket_fct/date_id=2015-01-01',
     u'/somedirectory/transaction_basket_fct/date_id=2015-01-02',
     u'/somedirectory/transaction_basket_fct/date_id=2015-01-03',
     u'/somedirectory/transaction_basket_fct/date_id=2015-01-04',
     u'/somedirectory/transaction_basket_fct/date_id=2015-01-05',
     u'/somedirectory/transaction_basket_fct/date_id=2015-01-06',
     u'/somedirectory/transaction_basket_fct/date_id=2015-01-07',
     u'/somedirectory/transaction_basket_fct/date_id=2015-01-08']
    

    그것을 분해하자 :

    hdfs dfs -ls / somedirectory 명령을 실행하려면 다음과 같이 sh 패키지를 사용할 수 있습니다.

    import sh
    sh.hdfs('dfs','-ls',hdfsdir)
    

    sh는 모듈에서 함수 인 것처럼 o / s 명령을 원활하게 호출 할 수있게합니다. 명령 매개 변수를 함수 매개 변수로 전달합니다. 정말 깔끔한.

    나에게 이것은 다음과 같은 것을 반환한다.

    Found 366 items
    drwxrwx---+  - impala hive          0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-01
    drwxrwx---+  - impala hive          0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-02
    drwxrwx---+  - impala hive          0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-03
    drwxrwx---+  - impala hive          0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-04
    drwxrwx---+  - impala hive          0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-05
    

    .split ( '\ n')을 사용하여 줄 바꿈 문자를 기준으로 줄로 분할합니다.

    line.rsplit (None, 1) [- 1]을 사용하여 문자열에서 마지막 '단어'를 얻습니다.

    목록에서 빈 요소와 관련된 문제를 방지하려면 len (line.rsplit (None, 1))

    마지막으로 [1 :]을 사용하여 목록의 첫 번째 요소 (Found 366 items)를 제거합니다.

  4. from https://stackoverflow.com/questions/32381942/get-a-list-of-file-names-from-hdfs-using-python by cc-by-sa and MIT license