在我们的手机应用商店项目中,随着第三方应用的增长,传统的文件系统已经无法满足下载包的存储,经过初步考虑,我们打算使用hdfs来存储我们的下载包。
hdfs作为一种分布式存储方案,在可扩展性,稳定性方面有很大的优势,当磁盘不够时,只需要添加datanode,不影响下载服务,当一台datanode机器网络或硬件出现问题,也不会影响下载服务,hdfs会自动把出问题的datanode上的数据转移到其他机器上,缺点是当namenode出现故障时,会导致所有文件无法下载,也就是namenode的单点问题。
一 hdfs文件下载流程
[img]http://dl.iteye.com/upload/attachment/0084/0113/4c40c334-b836-3fb0-a676-6542d2d9ab71.jpg[/img]
1 客户端向datanode请求下载文件
2 datanode 检查文件是否存在,是,返回文件对应的datanode
3 客户端根据返回的datanode依次请求数据块
4 datanode返回数据块
根据以上流程 一次下载客户端需要多次网络连接 客户端首先需要连接hdfs的namenode, 然后再连接datanode
二 环境搭建
本次是在单台服务器上搭建hdfs环境,首先下载hadoop-0.20.2包,解压到目录下
1 在hadoop-env.sh中配置jdk路径,具体配置如下
export JAVA_HOME=/usr/local/jdk1.7.0_02
2 在hdfs-site.xml中配置namenode和datanode文件的存储路径
,具体配置如下
<name>dfs.name.dir</name>
<value>/data/work/hadoop-0.20.2/datalog1,/data/work/hadoop-0.20.2/datalog2</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/data/work/hadoop-0.20.2/data1,/data/work/hadoop-0.20.2/data2</value>
</property>
3 在core-site.xml中配置hdfs访问ip和端口,具体配置如下
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/work/hadoop-0.20.2/temp</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.0.1:9000</value>
</property>
</configuration>
4 在mapred-site.xml中配置map计算的ip和端口,具体配置如下
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>192.168.0.1:9001</value>
</property>
</configuration>
5 配置masters,具体配置如下
192.168.0.1
6 配置slaves,具体配置如下
192.168.0.1
hdfs端口为9000,datanode的默认端口为50010,在iptables中需要开放这两个端口
三 下载测试
测试代码如下
经过多次测试 5,5M的下载包,普通文件下载时间为21秒,通过HDFS下载速度为24秒 相差不是很大
hdfs作为一种分布式存储方案,在可扩展性,稳定性方面有很大的优势,当磁盘不够时,只需要添加datanode,不影响下载服务,当一台datanode机器网络或硬件出现问题,也不会影响下载服务,hdfs会自动把出问题的datanode上的数据转移到其他机器上,缺点是当namenode出现故障时,会导致所有文件无法下载,也就是namenode的单点问题。
一 hdfs文件下载流程
[img]http://dl.iteye.com/upload/attachment/0084/0113/4c40c334-b836-3fb0-a676-6542d2d9ab71.jpg[/img]
1 客户端向datanode请求下载文件
2 datanode 检查文件是否存在,是,返回文件对应的datanode
3 客户端根据返回的datanode依次请求数据块
4 datanode返回数据块
根据以上流程 一次下载客户端需要多次网络连接 客户端首先需要连接hdfs的namenode, 然后再连接datanode
二 环境搭建
本次是在单台服务器上搭建hdfs环境,首先下载hadoop-0.20.2包,解压到目录下
1 在hadoop-env.sh中配置jdk路径,具体配置如下
export JAVA_HOME=/usr/local/jdk1.7.0_02
2 在hdfs-site.xml中配置namenode和datanode文件的存储路径
,具体配置如下
<name>dfs.name.dir</name>
<value>/data/work/hadoop-0.20.2/datalog1,/data/work/hadoop-0.20.2/datalog2</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/data/work/hadoop-0.20.2/data1,/data/work/hadoop-0.20.2/data2</value>
</property>
3 在core-site.xml中配置hdfs访问ip和端口,具体配置如下
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/work/hadoop-0.20.2/temp</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.0.1:9000</value>
</property>
</configuration>
4 在mapred-site.xml中配置map计算的ip和端口,具体配置如下
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>192.168.0.1:9001</value>
</property>
</configuration>
5 配置masters,具体配置如下
192.168.0.1
6 配置slaves,具体配置如下
192.168.0.1
hdfs端口为9000,datanode的默认端口为50010,在iptables中需要开放这两个端口
三 下载测试
测试代码如下
public static void main(String[] args) throws Exception {
try {
readFromHdfs();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
System.out.println("SUCCESS");
}
}
/**从HDFS上读取文件*/
private static void readFromHdfs() throws FileNotFoundException,IOException {
long starttime=System.currentTimeMillis();
String dst = "hdfs://192.168.0.1:9000/user/data/qq.apk";
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(dst), conf);
FSDataInputStream hdfsInStream = fs.open(new Path(dst));
OutputStream out = new FileOutputStream("d:/qq-hdfs.apk");
byte[] ioBuffer = new byte[1024];
int readLen = hdfsInStream.read(ioBuffer);
while(-1 != readLen){
out.write(ioBuffer, 0, readLen);
readLen = hdfsInStream.read(ioBuffer);
}
out.close();
hdfsInStream.close();
fs.close();
long endtime=System.currentTimeMillis();
endtime=endtime-starttime;
System.out.println("时间为"+endtime);
}
经过多次测试 5,5M的下载包,普通文件下载时间为21秒,通过HDFS下载速度为24秒 相差不是很大