月度归档:2014年09月

Hadoop2 HA方案之QJM

在Hadoop的分布式文件系统HDFS中,NameNode用来保存文件系统的元数据(包含目录结构/数据块位置等),如果NameNode上的数据丢 失,HDFS上对应的文件数据就无法找回来了。Hadoop在2.0.0之前的版本,使用SecondaryNameNode备份NameNode的数 据,但SecondaryNameNode无法转成NameNode,如果NameNode挂了,整个HDFS就会挂掉,无法实现真正的 failover。 这篇博文 总结了5种Hadoop HA(High Available,高可用)方案,Hadoop2之后官方引入了QJM(Quorum Journal Manager)和NFS用于NameNode的备份和切换。本方将介绍的是QJM方案,它使用第二个NameNode实时同步当前NameNode的数 据,相比于SecondaryNameNode,他可以随时切换成为真正的NameNode(一个可转正的高级备胎)。

先看看没有HA的HDFS的系统架构(用 draw.io 画的,尼马这么好的网站也被墙了):

hadoop-ha-001

然后有HA方案的系统架构:

hadoop-ha-003

以下的实验基于4个节点的Hadoop集群。其中每个节点的运行的进程列表如下:

Role\Hosthd1hd2hd3hd4
NN
DN
JN
ZK

实验环境中,所有节点的运行环境基本相同:

  • Ubuntu14.04 X64
  • 4G内存
  • OpenJDK-1.7.0
  • 100Mbps以太网

下面是实现这个系统的流程(官方文档+个人注解+辅助Shell命令)。

1. 安装Hadoop系统。

严格按照 单节点搭建 和 集群搭建 两个步骤,系统建起来完全没压力。我遇到的问题是刚开始在配置文件(salves和core-site.xml等文件)中使用的是ip地址而非主机名,然后在log文件里看到各种无法连接。解决方案是修改主机名并在hosts文件里建立映射关系。

hostname {new_hostname} # 修改主机名,只有当前Session有效
sudo vi /etc/hostname   # 永久修改主机名的方法

另外,对于64位的系统,最好重新编译源码。

2. 修改配置文件。

hdfs-site.xml文件:

<configuration>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/data/hadoop/namenode</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/data/hadoop/datanode</value>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>2</value>
  </property>
  <property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>
  </property>
  <property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>hd1:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>hd3:8020</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>hd1:50070</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>hd3:50070</value>
  </property>
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hd1:8485;hd2:8485;hd4:8485/mycluster</value>
  </property>
  <property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>
  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hduser/.ssh/id_rsa</value>
  </property>
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/data/hadoop/journalnode</value>
  </property>
</configuration>
  • 其中 nameservices 是集群的命名空间,即使有多个集群,可以共用配置文件,但是要注意某些配置项的顺序。
  • dfs.ha.namenodes.mycluster 中的mycluster是可以任取的,但是要和 dfs.nameservices 对应。
  • dfs.namenode.rpc-address.mycluster.nn1 参考上一条。
  • dfs.namenode.shared.edits.dir 值的格式是"qjournal://host1:port1;host2:port2;host3:port3/journalId",用来指定对应的JN节点, journalId 建议使用和 nameservices 相同的名称。
  • dfs.client.failover.proxy.provider.mycluster 指定激活NameNode的Java类,目前Hadoop内置的只有上面那个。
  • dfs.ha.fencing.methods 是来用来隔离失效的NameNode的方法,有 sshfence 和Shell两种方式。 sshfence 需要配置 dfs.ha.fencing.ssh.private-key-files 私钥文件,以便交互的过程不需要输入密码。
  • dfs.journalnode.edits.dir 是JN保存数据的文件。

core-site.xml文件:

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>
</configuration>
  • 注意 mycluster 要和dhfs-site.xml中的 dfs.nameservices 对应。 fs.defaultFS 不用端口号。

3. 部署

改好配置文件好,就要将配置文件同步到所有的机器上了。可以用rsync将文件同步到多台机器上。rsync是一个增量同步工具,需要先安装。下面的rsync.sh的功能是将当前目录的所有文件发送到文件或参数对应的机器上。

$ cat rsync.sh 
#! /bin/bash

dir=`pwd`
pdir=`dirname $dir`

send(){
  echo "Sending to $2:$1"
  rsync -avez -e ssh $1 $2:$3
}

mul_send(){
  while read host
  do
    send $dir $host $pdir
  done < $1
}

[ -f $1 ] && mul_send $1 || send $dir $1 $pdirdefool@hd5:/usr/local/hadoop/etc/hadoop

将rsync.sh放在etc/hadoop目录下,进入目录运行

chmod +x rsync.sh
./rsync.sh slaves
# or ./rsync.sh hostname

发送完文件之后,就是启动系统。步骤如下:

启动JNs.

在所有JournalNode上运行

sbin/hadoop-daemon.sh --script hdfs start journalnode

启动NameNode.

在原NameNode上运行

bin/hadoop --script hdfs start namenode # NameNode需要已经format。

(使用上面的rsync.sh文件)将原NameNode(nn1)上的数据复制到第二个NameNode(nn2)。然后在nn2上运行:

bin/hdfs namenode -bootstrapStandby

启动其他节点

在NameNode上运行

bin/start-dfs.sh

4. 切换NameNode

手动方式

上面的NameNode默认以standby的状态启动,这时因为没有active的NameNode,所以是不能在HDFS读写文件,需要将其中的一个转成active状态。比如将nn1(对应前面的配置)转成Active:

bin/hdfs haadmin -transitionToActive nn1

然后在NameNode的web页面上部的括号里的standby变成active。 转成standby的命令是:

bin/hdfs haadmin -transitionToStandby nn1

自动切换

在当前NameNode不能使用时自动切换到第二个NameNode上,需要借助于 ZooKeeper (ZK)。

ZK的安装过程和Hadoop差不多,就是下载文件、修改配置、复制到所有机器、启动。具体步骤 在这里 。

配置文件conf/zoo.conf:

tickTime=2000
dataDir=/data/hadoop/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=hd2:2888:3888
server.2=hd3:2888:3888
server.3=hd4:2888:3888

hd2,hd3,hd4是主机名,至少需要三台,这个在一台机挂了整个系统还能用,ZK的数量一般是奇数。

然后要在hdfs-site.xml上添加配置:

<property>
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>
<property>
  <name>ha.zookeeper.quorum</name>
  <value>hd2:2181,hd3:2181,hd4:2181</value>
</property>

然后就是在NameNode的机器上初始化NameNode在ZK的状态了:

bin/hdfs zkfc -formatZK

重启HDFS或手动启动DFSZKFailoverController(ZKFC):

sbin/stop-dfs.sh # 重启hdfs
sbin/start-dfs.sh
sbin/hadoop-daemon.sh start zkfc # 启动ZKFC

在该HA方案中,每一个NameNode都有一个对应的ZKFC。ZKFC会随NameNode启动。

测试

在当前NameNode运行 jps 看NameNode的进程ID,然后kill掉。通过Web页面( http://hdx:50070 ),可以看到standby的NameNode几乎在kill的同时转成active了。

 

原文  http://blog.segmentfault.com/defool/1190000000624579

Scala构建工具(SBT)

译者: dilettante 原作者:Martin Odersky

我们使用 sbt 创建、测试、运行和提交作业。该教程会解释你在我们的课程中将会用到的所有 sbt 命令。工具安装页说明了如何安装 sbt。

相关信息参见: http://www.scala-sbt.org/release/tutorial/zh-cn/index.html  里面有详细的介绍, 本文是从网络搜集的一些介绍供参考。

http://www.scala-sbt.org/0.13/tutorial/zh-cn/Basic-Def.html  介绍sbt的使用方法等

启动 sbt

要启动 sbt,打开一个终端(Windows 中的”命令提示符“)并切换到你正在解决的作业所在目录。输入sbt 将会打开 sbt 命令提示符。

shell$ cd /path/to/progfun-project-directory #这是操作系统的壳
shell$ sbt
> _

运行 Scala 解释器

你可以使用 console 任务在 sbt 内启动 Scala 解释器。解释器(也叫做 REPL,代表”读算印复 (Read Eval Print Loop“)对于试验 Scala 代码小片段很有用。注意,只有当你的代码没有编译错误时,解释器才能启动。要退出解释器并返回 sbt,输入 ctrl-d。

> console
[info] 正在启动 Scala 解释器...
欢迎来带 Scala 版本 2.10.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_04-ea).
输入表达式得到运算值。
输入 :help 获取更多信息。

scala> println("Oh, hai!") # 这是Scala解释器,输入一些代码
Oh, hai!

scala> val l = List(1, 2, 3)
l: List[Int] = List(1, 2, 3)

scala> val squares = l.map(x => x * x)
squares: List[Int] = List(1, 4, 9)

scala>                      # 输入Ctrl + D退出Scala解释器
[success] Total time: 20 s, completed Mar 21, 2013 11:02:31 AM
>                           # 我们回到 sbt 壳           #这是 sbt 的壳

编译你的代码

compile 任务会编译作业的源代码,作业位于src/main/scala 目录。

> compile
[info] 正在编译4个Scala源文件到
/Users/aleksandar/example/target/scala-2.10.1/classes...
[success] 总用时: 1秒,完成时刻 2013年5月21日 下午 11:04:46
>

如果源代码中包含错误,来自编译器的错误信息会显示出来。

测试你的代码

src/test/scala 目录包含项目的单元测试。要在 sbt 中运行这些测试,你可以使用test命令。

> test
[info] ListsSuite:
[info] - one plus one is two
[info] - sum of a few numbers *** FAILED ***
[info]   3 did not equal 2 (ListsSuite.scala:23)
[info] - max of a few numbers
[error] 失败: 总计 3, 失败 1, 错误 0, 通过 2, 忽略 0
[error] 失败的测试:
[error]   example.ListsSuite
[error] {文件:/Users/luc/example/}assignment/test:test: 测试不成功
[error] 总用时: 5 秒, 完成时刻 2012年8月10日 晚上 10:19:53
>

运行你的代码

如果你的项目有个对象带有方法(或者对象继承了 App 品质(trait)),那么你就可以通过输入 run 在 sbt 中运行代码。在 sbt 发现有多个 main 方法时,它会询问你想执行哪一个。

> run
多个 main classes 给检测到,选择一个执行:

[1] example.Lists
[2] example.M2

输入号码: 1

[info] 运行 example.Lists 中
main method!
[success] 总用时: 33 秒, 完成时刻 2012年8月10日 晚上 10:25:06
>

运行样式检查器

在作业评分过程中,我们在你提交的源代码上运行样式检查器以发现常见的编码样式问题。要确保你的代码符合我们的全部样式规则,你可以在提交前运行样式检查器自己检查。sbt 的styleCheck任务执行如下。

> styleCheck
[info] 正在检查文件 /Users/luc/Documents/epfl/
teaching/progfun/assignments/
src/main/scala/example/Lists.scala... 没问题!
[info] 处理 1 文件(s)
[info] 发现 0 错误(s)
[info] 发现 0 警告(s)
[info] 样式得分: (百分之)100
[success] 总用时: 1 秒, 完成时刻 2012年8月10日 晚上 11:34:02
>

提交你的解答到 Coursera

sbt 的submit任务用于你提交作业的解答。它会将你的源代码打包到一个.jar文件,然后上传到Coursera的服务器。注意,只有代码中没有编译错误时,代码才会被提交。

submit任务接收两个参数:你的电子邮件地址和提交密码。注意:提交密码不是你的登录密码。相反,它是由Coursera生成的特殊密码。你可以在Assignments页中找到。

> submit e-mail@university.org suBmISsioNPasSwoRd
[info] 正在打包 /Users/luc/example/
target/scala-2.10.1/
progfun-example_2.10.1-1.0.0-sources.jar ...
[info] 打包完成。
[info] 编译 1 个 Scala 源文件 到 /Users/luc/example/
target/scala-2.10.1/classes...
[info] 正在连接到 coursera。获取 challenge中...
[info] 计算 challenge 响应中...
[info] 提交作业中...
[success] 你的代码被成功提交:你的提交已被接收,之后将会批改。
[success] 总用时: 6 秒, 完成时刻 2012年8月10日 下午 10:35:53
>

来源:http://article.yeeyan.org/view/433044/378612


前端开发资源大全

来源:http://www.open-open.com/lib/view/open1371950605400.html

一个外国人收集的前端开发资源大全。

前端开发