在一个典型的 HDFS HA 场景中,通常由两个NameNode 组成,一个处于Active状态,另一个处于Standby状态。Active NameNode 对外提供服务,比如处理来自客户端的 RPC 请求,而 Standby NameNode 则不对外提供服务,仅同步 Active NameNode的状态,以便能够在它失败时快速进行切换。为了能够实时同步 Active 和 Standby 两个 NameNode 的元数据信息(实际上editlog),需提供一个共享存储系统,可以是 NFSQJ(Quorum Journal Manager)或者 Bookeeper,Active NameNode 将数据写入共享存储系统,我们可以在Active NameNode的50070端口上看到相应的NameNode Journal Status信息:
同时Standby NameNode监听该系统(QJM管理下的Journalnode进程对应的存储路径),一旦发现有新数据写入,则读取这些数据,并加载到自己内存中,以保证自己内存状态与 Active NameNode 保持基本一致,那么在紧急情况下 standby NameNode便可快速切为Active NameNode。另外,在Hadoop1.X中的Secondary NameNode或者自己通过nfs热备的NameNode信息在Hadoop2.X中已经不再需要了,他们被Standby NameNode取代了。 在Yarn的官网中,我还看到一段关于JournalNode错误兼容性信息:
大概意思是主备NameNode 之间通过一组JournalNode 同步元数据信息(我的通俗理解就是QJM类似一个数据池,池里边装着多个JournalNode进程存储editlog,Active NameNode往池里边的JournalNode进程写editlog,StandBy NameNode向池里边的JournalNode取数据同步),一条数据只要成功写入多数 JournalNode 即认为写入成功。启动的JournalNode的个数必须为奇数个。如果你的HA策略中启动了N个JournalNode进程那么整个QJM最多允许(N-1)/2个进程死掉,这样才能保证editLog成功完整地被写入。比如 3个 JournalNode 时,最多允许 1 个 JournalNode挂掉,5 个 JournalNode 时,最多允许 2 个 JournalNode 挂掉。3、 HDFS HA部署 3.1、部署和测试环境HDFS HA的部署和验证是在公司的测试集群中完成,其中测试集群中数据节点一共有4个主机名分别为hadoop-slave1、hadoop-slave02、hadoop-slave03、hadoop-slave04,master节点的主机名为hadoop-master。因为JournalNode和Zookeeper进程是非常轻量级的,可以其他服务共用节点。现在的部署情况是:hadoop-master:作为Active NameNodehaoop-slave01: 作为StandBy NameNodehadoop-slave02: 作为DataNode,并且启动一个JournalNode、启动一个Zookeeperhadoop-slave03: 作为DataNode,并且启动一个JournalNode、启动一个Zookeeperhadoop-slave04: 作为DataNode,并且启动一个JournalNode、启动一个Zookeeper其他软件:Apache Hadoop 2.2.0、JDK1.6<property>
<name>dfs.ha.namenodes.testCluster</name>
<value>nn1,nn2</value>
<description>Unique identifiers for each NameNode in the nameservice </description>
</property>(3) dfs.namenode.rpc-address.[$nameserviceID].[$name node ID] 这个参数很容易理解,主要是为每个NameNode设置RPC地址,我的配置如下:<property>
在这里说说一个遇到的“错误”问题,我在分别启动nn1和nn2之后,还没有将其中一个切换为Acive NameNode时,在nn1和nn2的日志上都报了以下这个“错误”:
其实这个错误信息完全可以不用管,出现这个问题原因上面信息已经很明显了,只要接下来将其中一个切换成Acive NameNode就ok了。
在来看看之前还没有切换Acive NameNode的“错误”信息已经消失了,下面分别是nn1和nn2的日志信息,非常正常:
另外,如果你现在想将nn2转化为Acive NameNode,则在进入nn2所在节点,输入命令:$HADOOP_HOME/bin/hdfs haadmin-failover --forcefence --forceactive nn1 nn2看看nn2上的日志:

其实这个是我意料之中的“错误”信息,其实是没有任何问题的。因为,当你的Acive NameNode从nn1切换至nn2时,nn1就会被kill(即hadoop-msater中的NameNode进程会被kill掉),在上面切换日志我标注红方框的地方已经很清楚了。此时,各个DataNode还是会同时向Active NameNode和StandBy NameNode同时发送心跳信息的,因为nn1已经被kill掉了,所有会报这个信息,对系统没有任何影响,切换后正常使用,如果你重启nn1则不会再报信息了,新启动的nn1是处于StandBy模式的。 我们知道,StandByNameNode是不处理DataNode的RPC请求的,那么各个DataNode为什么还会同时向Active NameNode和StandBy NameNode同时发送心跳呢?这是因为这2个心跳的用途是不同的,各个DataNode向Active NameNode发送心跳主要是汇报数据块的状态信息,而向StandBy NameNode发心跳的主要目的是通知StandBy NameNode告诉它Active NameNode元数据发生了改变,要求StandBy NameNode去QJM区下载更改过的Edit Log信息。
具体配置步骤:步骤1:关闭集群修改hdfs-site.xml配置文件,增加自动切换选项:<property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value></property>步骤2:编辑core-site.xml文件,添加Zookeeper实例:<property> <name>ha.zookeeper.quorum</name> <value>hadoop-slave02:2181,hadoop-slave03:2181,hadoop-slave04:2181</value></property>步骤3:启动节点上的zookeeper实例:分别进入hadoop-slave02、hadoop-slave03、hadoop-slave04节点执行:$ZOOKEEPER_HOME/bin/zkServer.sh startZookeeper实例对应的进程名为:
步骤4:初始化zookeeper。注意:这个步骤是针对第一次启动zookeeper实例用的,如果你的zookeeper实例不是第一次启动则不需要执行此命令。$HADOOP_HOME/bin/hdfs zkfc -formatZK步骤5:启动 JournalNode、NameNode 和 DataNode。步骤6:启动ZKFC。分别进入hadoop-master和hadoop-slave1即在各个 NameNode 节点上执行:$HADOOP_HOME/sbin/hadoop-daemon.sh startzkfcZKFC对应的进程名为:
要注意的一点是:我们最先启动的NameNode为Active NameNode。现在为止配置完毕,验证请看下面一小节。4、 HDFS HA机制的可用性验证4.1手动切换模式验证这里我使用的验证方法主要是模拟ActiveNameNode进程死掉的情况,另外Active NameNode所在节点发生宕机的情况也是一样的。现在集群中nn1为Active NameNode,nn2为StandBy NameNode,具体步骤:步骤1:进入nn1所在节点即hadoop-master,运行kill -9 $NameNodePID将nn1杀死(此时集群中只有一个StandByNameNode)。步骤2:往集群上传文件,或者执行hadoop fs相关命令提示连接不到(此时,集群中没有Active NameNode来处理客户端的RPC请求)。看错误信息:
步骤4:再次执行hadoop fs相关命令或者上传文件,一切正常。步骤5:另外,不要忘记集群虽然是恢复了,但是此时已经没有了StandBy NameNode了,这是直接进入nn1所在节点启动NameNode进程,此时nn1为Standby NameNode。
当目前为止,一起验证以及恢复已经完成。各个服务的日志也恢复了正常。我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa
使用Ruby1.9.2运行IDE提示说需要gemruby-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall