最近几天又重新把cdh的安全模块与高可靠性模块重新搭建了一遍,这次用是的目前最新的5.1.0的tar包安装,以前把MRv1搭建了好,这次主要是熟悉安装过程,并且把YARN的安全模块与HA模块成功搭建起来。遇到的错误还是不少,安装过程也是废了我好几天,现在想想很
最近几天又重新把cdh的安全模块与高可靠性模块重新搭建了一遍,这次用是的目前最新的5.1.0的tar包安装,以前把MRv1搭建了好,这次主要是熟悉安装过程,并且把YARN的安全模块与HA模块成功搭建起来。遇到的错误还是不少,安装过程也是废了我好几天,现在想想很多错误都比较典型,现在此记录下我搭建过程中遇到的错误与心得,一方面为自己以后查阅,另一方面希望也能对遇到同样问题的人有所启发。
先说下我的环境,centos6.5, cdh用的目前最新的5.1.0的tar包。
下面在先说说YARN的安全模块与HA安装时的遇到的错误,之后在说说我在安装整个CDH的HDFS、MRv1、YARN时一些不容易注意但很难地位的错误。
(一) YARN的安全模块与HA安装时遇到的错误
安全模块
- 对于container-executor文件,tar包中没有,需要自己编译
- 按照官方教程做配置后,执行 mapreduce 任务时,在 shuffle 阶段,会报下面的错误:
2014-08-03 00:34:19,619 WARN [main] org.apache.hadoop.mapred.YarnChild: Exception running child : org.apache.hadoop.mapreduce.task.reduce.Shuffle$ShuffleError: error in shuffle in fetcher#4 at org.apache.hadoop.mapreduce.task.reduce.Shuffle.run(Shuffle.java:134) at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:376) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1554) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)Caused by: java.io.IOException: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out. at org.apache.hadoop.mapreduce.task.reduce.ShuffleSchedulerImpl.checkReducerHealth(ShuffleSchedulerImpl.java:323) at org.apache.hadoop.mapreduce.task.reduce.ShuffleSchedulerImpl.copyFailed(ShuffleSchedulerImpl.java:245) at org.apache.hadoop.mapreduce.task.reduce.Fetcher.copyFromHost(Fetcher.java:347) at org.apache.hadoop.mapreduce.task.reduce.Fetcher.run(Fetcher.java:165)
在nodemanger服务器上,在执行该job的container的syslog日志中还可以找到下面的错误
2014-08-03 00:34:19,614 WARN [fetcher#3] org.apache.hadoop.mapreduce.task.reduce.Fetcher: Invalid map idjava.lang.IllegalArgumentException: TaskAttemptId string : TTP/1.1 500 Internal Server ErrorContent-Type: text/plain; charset=UTF is not properly formed at org.apache.hadoop.mapreduce.TaskAttemptID.forName(TaskAttemptID.java:201) at org.apache.hadoop.mapreduce.task.reduce.Fetcher.copyMapOutput(Fetcher.java:386) at org.apache.hadoop.mapreduce.task.reduce.Fetcher.copyFromHost(Fetcher.java:341) at org.apache.hadoop.mapreduce.task.reduce.Fetcher.run(Fetcher.java:165)2014-08-03 00:34:19,614 WARN [fetcher#4] org.apache.hadoop.mapreduce.task.reduce.Fetcher: Invalid map idjava.lang.IllegalArgumentException: TaskAttemptId string : TTP/1.1 500 Internal Server Error
网上很多说Shuffle$ShuffleError: error in shuffle in fetcher#4这个错误与内存,很明显,我这里不是这种情况,因为从 TTP/1.1 500 Internal Server Error就应该知道是resourcemanager内部的错误。
经过我验证,这时由于tar包默认并不包含native的lib,位置在<hadoop>/lib/native</hadoop>
文件夹,需要我们自己编译,把编译好的native文件拷贝到这里即可。
HA
按照官方教程,先直接安装YARN时有点小错误,就是historyserver进程开启(由maprd用户开启)后无法aggregate log,我发现是有两个问题导致:
- 我服务器上的mapred用户只属于mapred用户组(useradd mapred这条命令执行后,就会创建mapred用户,并且属于mapred组),而由mapred启动的historyserver需要访问${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate/${username}文件夹下不同用户的文件,而这个文件夹的权限是770,own为${username}:hadoop,所以historyserver没有权限读取,我这里把mapred添加到hadoop用户组去即可:s
这里mapred用户也需要属于mapred组,是因为也需要向${yarn.nodemanager.remote-app-log-dir}/${username}目录下写一些日志(因为开启了log-aggregation),而这个目录权限也是770,own为${username}:mapred。
usermod -a G hadoop mapred #这里需要-a选项,这样mapred用户即属于mapred组又属于hadoop组
- 教程上说的开启log-aggregation的配置不对,教程上写的是
<property> <name>yarn.log.aggregation.enable</name> <value>true</value> </property>
应改为
<property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property>
———————-下面正式说HA—————————
YARN的HA想对于hdfs与MRv1的简单了许多,自动Failover也不需要另起个进程,ResourceManager中一个ActiveStandbyElector,它负责Automatic failover。这里只需要修改yarn-site.xml文件即可。官方教程的给出的默认配置改一项就能运行成功。
把
<property> <name>yarn.resourcemanager.zk.state-store.address</name> <value>localhost:2181</value></property>
改成
<property> <name>yarn.resourcemanager.zk-address</name> <value>localhost:2181</value></property>
其实上面的表格说的很详细了,不知道为什么给出的示例没写,不过这个错也比较好找,因为按照上面配置的开启RM时会报yarn.resourcemanager.zk-address没定义。
其次需要注意的是yarn.resourcemanager.ha.id在active与standby的服务器上的值是不一样的,按照官方给的配置,那就一个是rm1,一个是rm2。
如果我们在开启了安全模式还需要修改一处property即yarn.resourcemanager.hostname,ha中的两个RM这个property值是不一样的,分别为其hostname。这是因为我们在配置yarn的principal时用了yarn/_HOST这种方式,而_HOST对于NN与RM来说,不是按照hostname来替换的,而是分别按照fs.defaultFS与yarn.resourcemanager.hostname这两个property的值来替换的。DN与NM是按照每个服务器的hostname来替换的。替换规则也在HDFS的安全模式文档中有说明。
下面是我rm1服务器上这两个property的配置:
<property> <name>yarn.resourcemanager.ha.id</name> <value>rm1</value></property><property> <name>yarn.resourcemanager.hostname</name> <value>master</value></property>
下面是我rm2服务器上这两个property的配置:
<property> <name>yarn.resourcemanager.ha.id</name> <value>rm2</value></property><property> <name>yarn.resourcemanager.hostname</name> <value>master2</value></property>
(二) CDH各个模块安装总结
还是先说些我在安装过程中遇到的一些不起眼但遇到后就很难定位的错误。
- 如果把hadoop放到/root下,像hdfs、yarn这些用户是没法执行bin、sbin下面的脚本的,因为/root的默认权限是550,我安装时直接放到/opt下。
- 在安装HDFS的安全模块时,开启某个进程,比如namenode时,经常会出现某个文件找不到,这是因为我在前后开启、关闭、格式化namenode过程中,先后用了root与hdfs,用root用户开启的namenode在本地写文件hdfs用户是没法读取的。这里一定要谨记,除了开启datanode时需要用root用户,与namenode相关的都是用hdfs用户,包括namenode的format、start与stop。
- 还有个比较tricky的问题,本来的journalnode是开启在slaves节点上的,我现在想把它们分开,我集群内的hosts文件是这样的
127.0.0.1 localhost10.4.13.85 master10.4.15.239 master2 zk1 jn1 #hostname为master210.4.9.14 zk2 jn2 #hostname为zk210.4.14.123 zk3 jn3 #hostname为zk310.4.13.63 node110.4.13.2 node210.4.11.89 node3
我这里为一台服务器配置多个domain.name是方便我在后面的配置时做到见名知意,比如,我在配置journalnode时我可以这么配置
<property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://jn1:8485;jn2:8485;jn3:8485/ljc</value></property><property><name>dfs.journalnode.kerberos.principal</name><value>hdfs/_HOST@MY-REALM</value></property>…………
但这里问题来了,因为journalnode从active的NameNode那里取数据时需要验证身份,而我这里的principal用了_HOST,按理说CDH在运行时会自动把 _HOST替换为hostname,而且我在生产keytab时也是根据hostname来生成的,比如对于master2,我会生产下面的principal:
hdfs/master2@MY-REALMHTTP/master2@MY-REALMmapred/master2@MY-REALMyarn/master2@MY-REALM
但是我这样配置后,开启第一个时namenode就会报错,
2014-08-06 18:27:05,929 WARN org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:hdfs/master@MY-REALM (auth:KERBEROS) cause:java.io.IOException: org.apache.hadoop.security.authentication.client.AuthenticationException: GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - UNKNOWN_SERVER)2014-08-06 18:27:05,929 ERROR org.apache.hadoop.hdfs.server.namenode.EditLogInputStream: caught exception initializing http://jn3:8480/getJournal?jid=ljc&segmentTxId=1&storageInfo=-55%3A845458164%3A0%3ACID-b6f3e623-e3c0-45d0-a44c-ec3f01d57ea3java.io.IOException: org.apache.hadoop.security.authentication.client.AuthenticationException: GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - UNKNOWN_SERVER) at org.apache.hadoop.hdfs.server.namenode.EditLogFileInputStream$URLLog$1.run(EditLogFileInputStream.java:406) at org.apache.hadoop.hdfs.server.namenode.EditLogFileInputStream$URLLog$1.run(EditLogFileInputStream.java:398) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1554) at org.apache.hadoop.security.SecurityUtil.doAsUser(SecurityUtil.java:448) at org.apache.hadoop.security.SecurityUtil.doAsCurrentUser(SecurityUtil.java:442) at org.apache.hadoop.hdfs.server.namenode.EditLogFileInputStream$URLLog.getInputStream(EditLogFileInputStream.java:397) at org.apache.hadoop.hdfs.server.namenode.EditLogFileInputStream.init(EditLogFileInputStream.java:139) at org.apache.hadoop.hdfs.server.namenode.EditLogFileInputStream.nextOpImpl(EditLogFileInputStream.java:188) at org.apache.hadoop.hdfs.server.namenode.EditLogFileInputStream.nextOp(EditLogFileInputStream.java:239) at org.apache.hadoop.hdfs.server.namenode.EditLogInputStream.readOp(EditLogInputStream.java:83) at org.apache.hadoop.hdfs.server.namenode.EditLogInputStream.skipUntil(EditLogInputStream.java:140) at org.apache.hadoop.hdfs.server.namenode.RedundantEditLogInputStream.nextOp(RedundantEditLogInputStream.java:178) at org.apache.hadoop.hdfs.server.namenode.EditLogInputStream.readOp(EditLogInputStream.java:83)Caused by: org.apache.hadoop.security.authentication.client.AuthenticationException: GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - UNKNOWN_SERVER) at org.apache.hadoop.security.authentication.client.KerberosAuthenticator.doSpnegoSequence(KerberosAuthenticator.java:306) at org.apache.hadoop.security.authentication.client.KerberosAuthenticator.authenticate(KerberosAuthenticator.java:196) at org.apache.hadoop.security.authentication.client.AuthenticatedURL.openConnection(AuthenticatedURL.java:232) at org.apache.hadoop.hdfs.web.URLConnectionFactory.openConnection(URLConnectionFactory.java:164) at org.apache.hadoop.hdfs.server.namenode.EditLogFileInputStream$URLLog$1.run(EditLogFileInputStream.java:403) ... 30 moreCaused by: GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - UNKNOWN_SERVER) at sun.security.jgss.krb5.Krb5Context.initSecContext(Krb5Context.java:710) at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:248) at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179) at org.apache.hadoop.security.authentication.client.KerberosAuthenticator$1.run(KerberosAuthenticator.java:285) at org.apache.hadoop.security.authentication.client.KerberosAuthenticator$1.run(KerberosAuthenticator.java:261) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415)
大致意思是说无法读取journalnode那里的edits,认证失败了,没有权限。我还以为是我生产的keytab有错,我去jn1所在服务器(hostname为master2)上用kinit加上tabkey也能的到TGT,后来我把配置改成这样:
<property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://master2:8485;zk2:8485;zk3:8485/ljc</value></property>
这样就能吧Namenode起来了,证明这里_HOST被直接替换成了我这里的domain.name了,而不是每个服务器上的hostname,我这里不用domain.name,直接换为ip,也没问题。要是想了解这个细节,需要看源代码了,以后在看吧。
- 如果遇到
Exception in thread "main" org.apache.hadoop.HadoopIllegalArgumentException: HA is not enabled for this namenode. at org.apache.hadoop.hdfs.tools.DFSZKFailoverController.create(DFSZKFailoverController.java:121) at org.apache.hadoop.hdfs.tools.DFSZKFailoverController.main(DFSZKFailoverController.java:172)
说明 dfs.nameservices 配置有误,我当时把值配置成 hdfs://ljc 了,其实应该配成 ljc 就可以了。
总结
从熟悉hadoop各个模块开始,到现在把最基本的环境搭建起来,前前后后也是有一个月的时间了,我发现我耗时比较多的是遇到问题后,没有看源码的意识,去网上搜,虽然有可能有人也遇到这个问题,但是明显和我的不相符,这时我就仔细检查我的配置文件,看看是否遗漏官方教程上的某一项,有些盲目,最近开始把cdh的src导入了eclipse,遇到一些错误后开始慢慢看源代码,我发现这样能很快定位到问题出错的范围,以后一定多尝试。
其次就是服务器比较多,hadoop也需要配置不少东西,这就需要自动化来帮助了,我最近把shell脚本又熟悉起来,写了一些用于管理hadoop的脚本,加上使用了salt这个自动化工具,这样方便多了。但是shell我还不是很熟悉,像数组的使用,很恶心有木有,交互式shell加载环境变量与非交互式(ssh -t -t hostname cmd这种方式就是非交互式)的不一样,等回来还要慢慢总结。
最近几天又重新把cdh的安全模块与高可靠性模块重新搭建了一遍,这次用是的目前最新的5.1.0的tar包安装,以前把MRv1搭建了好,这次主要是熟悉安装过程,并且把YARN的安全模块与HA模块成功搭建起来。遇到的错误还是不少,安装过程也是废了我好几天,现在想想很多错误都比较典型,现在此记录下我搭建过程中遇到的错误与心得,一方面为自己以后查阅,另一方面希望也能对遇到同样问题的人有所启发。
原文地址:Yarn的安全模式与高可靠性安装总结, 感谢原作者分享。

MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템으로, 주로 데이터를 신속하고 안정적으로 저장하고 검색하는 데 사용됩니다. 작업 원칙에는 클라이언트 요청, 쿼리 해상도, 쿼리 실행 및 반환 결과가 포함됩니다. 사용의 예로는 테이블 작성, 데이터 삽입 및 쿼리 및 조인 작업과 같은 고급 기능이 포함됩니다. 일반적인 오류에는 SQL 구문, 데이터 유형 및 권한이 포함되며 최적화 제안에는 인덱스 사용, 최적화 된 쿼리 및 테이블 분할이 포함됩니다.

MySQL은 데이터 저장, 관리, 쿼리 및 보안에 적합한 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1. 다양한 운영 체제를 지원하며 웹 응용 프로그램 및 기타 필드에서 널리 사용됩니다. 2. 클라이언트-서버 아키텍처 및 다양한 스토리지 엔진을 통해 MySQL은 데이터를 효율적으로 처리합니다. 3. 기본 사용에는 데이터베이스 및 테이블 작성, 데이터 삽입, 쿼리 및 업데이트가 포함됩니다. 4. 고급 사용에는 복잡한 쿼리 및 저장 프로 시저가 포함됩니다. 5. 설명 진술을 통해 일반적인 오류를 디버깅 할 수 있습니다. 6. 성능 최적화에는 인덱스의 합리적인 사용 및 최적화 된 쿼리 문이 포함됩니다.

MySQL은 성능, 신뢰성, 사용 편의성 및 커뮤니티 지원을 위해 선택됩니다. 1.MYSQL은 효율적인 데이터 저장 및 검색 기능을 제공하여 여러 데이터 유형 및 고급 쿼리 작업을 지원합니다. 2. 고객-서버 아키텍처 및 다중 스토리지 엔진을 채택하여 트랜잭션 및 쿼리 최적화를 지원합니다. 3. 사용하기 쉽고 다양한 운영 체제 및 프로그래밍 언어를 지원합니다. 4. 강력한 지역 사회 지원을 받고 풍부한 자원과 솔루션을 제공합니다.

InnoDB의 잠금 장치에는 공유 잠금 장치, 독점 잠금, 의도 잠금 장치, 레코드 잠금, 갭 잠금 및 다음 키 잠금 장치가 포함됩니다. 1. 공유 잠금을 사용하면 다른 트랜잭션을 읽지 않고 트랜잭션이 데이터를 읽을 수 있습니다. 2. 독점 잠금은 다른 트랜잭션이 데이터를 읽고 수정하는 것을 방지합니다. 3. 의도 잠금은 잠금 효율을 최적화합니다. 4. 레코드 잠금 잠금 인덱스 레코드. 5. 갭 잠금 잠금 장치 색인 기록 간격. 6. 다음 키 잠금은 데이터 일관성을 보장하기 위해 레코드 잠금과 갭 잠금의 조합입니다.

MySQL 쿼리 성능이 좋지 않은 주된 이유는 인덱스 사용, 쿼리 최적화에 의한 잘못된 실행 계획 선택, 불합리한 테이블 디자인, 과도한 데이터 볼륨 및 잠금 경쟁이 포함됩니다. 1. 색인이 느리게 쿼리를 일으키지 않으며 인덱스를 추가하면 성능이 크게 향상 될 수 있습니다. 2. 설명 명령을 사용하여 쿼리 계획을 분석하고 Optimizer 오류를 찾으십시오. 3. 테이블 구조를 재구성하고 결합 조건을 최적화하면 테이블 설계 문제가 향상 될 수 있습니다. 4. 데이터 볼륨이 크면 분할 및 테이블 디비전 전략이 채택됩니다. 5. 높은 동시성 환경에서 거래 및 잠금 전략을 최적화하면 잠금 경쟁이 줄어들 수 있습니다.

데이터베이스 최적화에서 쿼리 요구 사항에 따라 인덱싱 전략을 선택해야합니다. 1. 쿼리에 여러 열이 포함되고 조건 순서가 수정되면 복합 인덱스를 사용하십시오. 2. 쿼리에 여러 열이 포함되어 있지만 조건 순서가 고정되지 않은 경우 여러 단일 열 인덱스를 사용하십시오. 복합 인덱스는 다중 열 쿼리를 최적화하는 데 적합한 반면 단일 열 인덱스는 단일 열 쿼리에 적합합니다.

MySQL 느린 쿼리를 최적화하려면 SlowQueryLog 및 Performance_Schema를 사용해야합니다. 1. SlowQueryLog 및 Set Stresholds를 사용하여 느린 쿼리를 기록합니다. 2. Performance_schema를 사용하여 쿼리 실행 세부 정보를 분석하고 성능 병목 현상을 찾고 최적화하십시오.

MySQL 및 SQL은 개발자에게 필수적인 기술입니다. 1.MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템이며 SQL은 데이터베이스를 관리하고 작동하는 데 사용되는 표준 언어입니다. 2.MYSQL은 효율적인 데이터 저장 및 검색 기능을 통해 여러 스토리지 엔진을 지원하며 SQL은 간단한 문을 통해 복잡한 데이터 작업을 완료합니다. 3. 사용의 예에는 기본 쿼리 및 조건 별 필터링 및 정렬과 같은 고급 쿼리가 포함됩니다. 4. 일반적인 오류에는 구문 오류 및 성능 문제가 포함되며 SQL 문을 확인하고 설명 명령을 사용하여 최적화 할 수 있습니다. 5. 성능 최적화 기술에는 인덱스 사용, 전체 테이블 스캔 피하기, 조인 작업 최적화 및 코드 가독성 향상이 포함됩니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.
