[HADOOP] Python을 사용하여 HDFS에서 파일 이름 목록보기
HADOOPPython을 사용하여 HDFS에서 파일 이름 목록보기
하둡 멍청한 놈.
hadoop과 python을 시작하는 데 많은 도움이되는 튜토리얼을 많이 찾았습니다. 매퍼 (mappers)와 리듀서 (reducers)를 사용하여 작업 할 필요가 없지만 액세스 문제가 더 많습니다.
Hadoop 클러스터의 일부로, HDFS에는 .dat 파일이 많이 있습니다.
파이썬을 사용하여 내 클라이언트 (로컬 컴퓨터)의 파일에 액세스하려면,
어떤 링크도 도움이 될 것입니다.
해결법
-
==============================
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.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.지금까지 내가 말할 수 있었던 것은 이것에 대한 즉시 사용 가능한 해결책이 없다는 것을 알았고, 대부분의 해답은 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)를 제거합니다.
from https://stackoverflow.com/questions/32381942/get-a-list-of-file-names-from-hdfs-using-python by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] hadoop 데이터 노드를 정상적으로 시작할 수 없습니다. (0) | 2019.07.29 |
---|---|
[HADOOP] 태스크 제한 시간 때문에 Sqoop 가져 오기 작업이 실패합니다. (0) | 2019.07.29 |
[HADOOP] Spark 클러스터의 S3에서 읽기 작업을 수행하면 IllegalAccessError가 발생합니다 : MutableCounterLong [duplicate] 메소드에 액세스하려고했습니다. (0) | 2019.07.29 |
[HADOOP] Pyhive를 사용하여 원격 하이브에 액세스하는 방법 (0) | 2019.07.29 |
[HADOOP] hdfs에서 파일을 읽는 방법 [duplicate] (0) | 2019.07.29 |