hadoop使用(五)

2023-11-19

hadoop使用(五)

第1章 引言

1.1 编写目的

对关于hadoop的文档及资料进行进一步的整理。

1.2 相关网站

   毋庸置疑 http://hadoop.apache.org/

   国内  http://www.hadoopor.com/   专门研究hadoop的,《hadoop开发者》由该站创办,已发4期

   中国云计算论坛hadoop专区; http://bbs.chinacloud.cn/showforum-16.aspx

   中科院计算所办的hadoop:http://www.hadooper.cn/

1.3 资料及研究成果

  http://code.google.com/p/mycloub/

  我会搜集更多更好的资料,方便交流。

第2章 hadoop基本命令

2.1 hadoop基本命令

直接输入hadoop得到的语法文档如下:

namenode -format     format the DFS filesystem 格式化DFS文件系统

namenode -format     format the DFS filesystem 运行第2个namenode

datanode             run a DFS datanode 运行DFS的namenode

dfsadmin             run a DFS admin client 运行一个DFS的admin客户端

mradmin              run a Map-Reduce admin client 运行一个map-reduce文件系统的检查工具

fsck                 run a DFS filesystem checking utility 运行一个DFS文件系统的检查工具

fs                   run a generic filesystem user client  运行一个普通的文件系统用户客户端

balancer             run a cluster balancing utility 运行MapReduce的jobTracker节点

fetchdt              fetch a delegation token from the NameNode 运行一个代理的namenode

jobtracker           run the MapReduce job Tracker node 运行一个MapReduce的taskTracker节点

pipes                run a Pipes job 运行一个pipes作业

tasktracker          run a MapReduce task Tracker node 运行一个MapReduce的taskTracker节点

historyserver        run job history servers as a standalone daemon 运行历史服务作为一个单独的线程

job                  manipulate MapReduce jobs 处理mapReduce作业

queue                get information regarding JobQueues

version              print the version 版本

jar <jar>            run a jar file 运行一个jar

distcp <srcurl> <desturl> copy file or directories recursively 递归地复制文件或者目录

archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive

 生成一个hadoop档案

daemonlog            get/set the log level for each daemon 获取或设置每个daemon的log级别

2.2 hadoop核心内容

   Hadoop框架中最核心的设计就是:MapReduce和HDFS。

l  MapReduce的思想是由Google的一篇论文所提及而被广为流传的,简单的一句话解释MapReduce就是“任务的分解与结果的汇总”。

l  HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的缩写,为分布式计算存储提供了底层支持。

2.3 为什么选择hadoop

   下面列举hadoop主要的一些特点:

1)扩容能力(Scalable):能可靠地(reliably)存储和处理千兆字节(PB)数据。

2)成本低(Economical):可以通过普通机器组成的服务器群来分发以及处理数据。这些服务器群总计可达数千个节点。

3)高效率(Efficient):通过分发数据,hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常的快速。

4)可靠性(Reliable):hadoop能自动地维护数据的多份复制,并且在任务失败后能自动地重新部署(redeploy)计算任务。

2.4 HDFS设计特点

   下面说说HDFS的几个设计特点(对于框架设计值得借鉴):

1. Block的放置

默认不配置。一个Block会有三份备份,一份放在NameNode指定的DataNode,另一份放在与指定DataNode非同一Rack上的DataNode,最后一份放在与指定DataNode同一Rack上的DataNode上。

备份无非就是为了数据安全,考虑同一Rack的失败情况以及不同Rack之间数

据拷贝性能问题就采用这种配置方式。

2. 心跳检测

心跳检测DataNode的健康状况,如果发现问题就采取数据备份的方式来保证数据的安全性。

3. 数据复制

数据复制(场景为DataNode失败、需要平衡DataNode的存储利用率和需要平衡DataNode数据交互压力等情况) 这里先说一下,:使用HDFS的balancer命令,

可以配置一个Threshold来平衡每一个DataNode磁盘利用率。例如设置了Threshold为10%,那么执行balancer命令的时候,

首先统计所有DataNode的磁盘利用率的均值,然后判断如果某一个DataNode的磁盘利用率超过这个均值Threshold以上,那么将会把这个DataNode的block转移到磁盘利用率低的DataNode,这对于新节点的加入来说十分有用。

4. 数据校验:

采用CRC32作数据交验。在文件Block写入的时候除了写入数据还会写入交验信息,在读取的时候需要交验后再读入。

5. NameNode是单点

如果失败的话,任务处理信息将会记录在本地文件系统和远端的文件系统中。

6. 数据管道性的写入

当客户端要写入文件到DataNode上,首先客户端读取一个Block然后写到第一个DataNode上,然后由第一个DataNode传递到备份的DataNode上,一直到所有需要写入这个Block的DataNode都成功写入,客户端才会继续开始写下一个Block。

7. 安全模式

安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。

在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,

直到安全模式结束。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。

2.5 说说MapReduce

   MapReduce从它名字上来看就大致可以看出个缘由,两个动词Map和Reduce,“Map(展开)”就是将一个任务分解成为多个任务,“Reduce”就是将分解后多任务处理的结果汇总起来,得出最后的分析结果。

具体过程序如下:

1) Input输入

从文件中读取原始数据

原始数据   <InputKey, InputValue>

2) Map映射

将原始数据映射成用于Reduce的数据

<InputKey, InputValue> List<<MapKey, MapValue>>

3) Reduce合并

将相同Key值的中间数据合并成最终数据

<MapKey, List<MapValue>>   <OutputKey, OutputValue>

4) Output输出

将最终处理结果输出到文件

<OutputKey, OutputValue> 结果文件

上述就是MapReduce大致处理过程,在Map前还可能会对输入的数据有Split(分割)的过程,保证任务并行效率,在Map之后还会有Shuffle(混合)的过程,对于提高Reduce的效率以及减小数据传输的压力有很大的帮助。后面会具体提及这些部分的细节。

再来看看hadoop下的MapReduce

最简单的 MapReduce 应用程序至少包含 3 个部分:一个 Map 函数、一个 Reduce函数和一个 main 函数。main 函数将作业控制和文件输入/输出结合起来。在这点上,Hadoop 提供了大量的接口和抽象类,从而为 Hadoop 应用程序开发人员提供许多工具,可用于调试和性能度量等。

MapReduce 本身就是用于并行处理大数据集的软件框架。

MapReduce 的根源是函数性编程中的 map 和 reduce 函数。它由两个可能包含有许多实例(许多 Map 和Reduce)的操作组成。Map 函数接受一组数据并将其转换为一个键/值对列表,输入域中的每个元素对应一个键/值对。Reduce 函数接受 Map 函数生成的列表,然后根据它们的键(为每个键生成一个键/值对)缩小键/值对列表。

2.6 hadoop结构示意图

  

MapReduce从它名字上在Hadoop的系统中,会有一台Master,主要负责NameNode的工作以及JobTracker的工作。

JobTracker的主要职责就是启动、跟踪和调度各个Slave的任务执行。还会有多台Slave,每一台Slave通常具有DataNode的功能并负责TaskTracker的工作。TaskTracker根据应用要求来结合本地数据执行Map任务以及Reduce任务。

第3章 FSShell 命令指南

3.1 FSShell 命令指南

调用文件系统(FS)Shell 命令应使用 bin/hadoop fs<args>的形式。所有的的 FSshell命令使用 URI 路径作为参数。URI 格式是 scheme://authority/path。对 HDFS 文件系统,scheme 是 hdfs,对本地文件系统,scheme 是 file。其中 scheme 和 authority 参数都是可选的,如果未加指定,就会使用配置中指定的默认 scheme。一个 HDFS 文件或目录比如/parent/child可以表示成 hdfs://namenode:namenodeport/parent/child,或者更简单的/parent/child(假设你配置文件中的默认值是 namenode:namenodeport)。大多数 FSShell命令的行为和对应的 UnixShell 命令类似,不同之处会在下面介绍各命令使用详情时指出。

出错信息会输出到 stderr,其他信息输出到 stdout。

1) cat

使用方法:hadoop fs -catURI[URI...]

将路径指定文件的内容输出到 stdout。

示例:

hadoop fs-cat hdfs://host1:port1/file1hdfs://host2:port2/file2

hadoop fs-cat file:///file3/user/hadoop/file4

返回值:

成功返回 0,失败返回-1。

2) copyFromLocal

使用方法:hadoop fs -copyFromLocal<localsrc>URI 除了限定源路径是一个本地文件外,和 put 命令相似。

3) copyToLocal

使用方法:hadoop fs -copyToLocal[-ignorecrc][-crc]URI<localdst>

除了限定目标路径是一个本地文件外,和 get 命令类似。

4) cp

使用方法:hadoopfs-cpURI[URI...]<dest>

将文件从源路径复制到目标路径。这个 Hadoop Shell 命令允许有多个源路径,此时目标路径必须是一个目录。

示例:

Hadoopfs –cp /user/hadoop/file1/user/hadoop/file2

hadoopfs –cp /user/hadoop/file1/user/hadoop/file2/user/hadoop/dir

返回值:

成功返回 0,失败返回-1。

5) du

使用方法:hadoop fs –du URI[URI...]

此 Hadoop Shell 命令显示目录中所有文件的大小,或者当只指定一个文件时,显示此文件的大小。

示例:

Hadoop fs –du

/user/hadoop/dir1/user/hadoop/file1hdfs://host:port/user/hadoop/dir1

返回值:

成功返回 0,失败返回-1。

6) dus

使用方法:hadoop fs -dus<args>

显示文件的大小。

7) expunge

使用方法:hadoop fs -expunge

清空回收站。请参考 HDFS 设计文档以获取更多关于回收站特性的信息。

8) get

使用方法:hadoop fs -get[-ignorecrc][-crc]<src><localdst>

复制文件到本地文件系统。可用-ignorecrc 选项复制 CRC 校验失败的文件。使用-crc 选项

复制文件以及 CRC 信息。

示例:

hadoop fs –get /user/hadoop/filelocalfile

hadoop fs –get hdfs://host:port/user/hadoop/filelocalfile

返回值:

成功返回 0,失败返回-1。Hadoop Shell 命令还有很多,这里只介绍了其中的一部分。

第4章 eclipse测试hadoop

4.1 配置eclipse

下载插件hadoop-1.03,拷贝到eclipse插件目录

启动hadoop

然后运行jps,看是否服务都已经启动

启动eclipse

配置hadoop,选择window->preferences->Hadoop Map/Reduce,选择hadoop安装路径

编辑map/reduce location

然后新建map/reduce工程

新建类

PutMerge.java

?
public class PutMerge {
 
     /**
      * @throws IOException
      * @Title: main
      * @Description: 测试逐一读取inputFiles中的文件,并写入目标HDFS文件
      * @param args
      *            设定文件
      * @return void 返回类型
      * @throws
      */
     public static void main(String[] args) throws IOException {
         Configuration conf = new Configuration();
 
         FileSystem local = FileSystem.getLocal(conf);
 
         /** 设定文件的输入输出目录 */
         Path inputDir = new Path(args[ 0 ]);
         Path hdfsFile = new Path(args[ 1 ]);
 
         // 伪分布式下这样处理
         FileSystem hdfs = hdfsFile.getFileSystem(conf);
         // 正常分布式
         // FileSystem hdfs = FileSystem.get(conf);
 
         try {
             FileStatus[] inputFiles = local.listStatus(inputDir);
             FSDataOutputStream out = hdfs.create(hdfsFile);
 
             for ( int i = 0 ; i < inputFiles.length; i++) {
                 System.out.println(inputFiles[i].getPath().getName());
                 FSDataInputStream in = local.open(inputFiles[i].getPath());
                 byte buffer[] = new byte [ 256 ];
                 int bytesRead = 0 ;
                 while ((bytesRead = in.read(buffer)) > 0 ) {
                     out.write(buffer, 0 , bytesRead);
                 }
                 in.close();
             }
             out.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 
}

 在本地创建input文件夹,创建file01,file02文件

配置java application,加入参数

 加入本地路径和服务器上的路径

然后运行程序,得到输出结果

file02

file01

使用命令查看

bin/hadoop fs -ls /user

查看文件上传情况

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hadoop使用(五) 的相关文章

  • 云数据库MySQL的选择

    架构介绍 xff1a 云数据库MySQL支持四种架构 xff1a 高可用版 金融版 单节点高IO版 基础版 其中单节点高IO版的只用于只读 版本对比 xff1a 企业级别 xff0c 刚刚好公司没有自己的服务器机房的时候可以做对比选择 一般
  • 淘宝TDDL数据库分库分表

    淘宝TDDL数据库分库分表 2014 06 04 23 18 3334人阅读 评论 0 收藏 举报 分类 数据库 1 分库分表 而且分库规则非常灵活 2 主键生成策略 目前TDDL提供的id生成主要还是依托数据库来进行的 oracle可以直
  • Hadoop Core、HBase 、ZooKeeper

    adoop HBase ZooKeeper三者关系与安装配置 复制链接 qqjue 论坛徽章 18 电梯直达 1
  • Hypertable 快速安装,仅需上载一个RPM包,零编译

    Hypertable 快速安装 仅需上载一个RPM包 零编译 Hypertable 快速安装 仅需下载一个RPM包 零编译 本文采用 单机安装 1 Hypertable 安装 Hypertable 的几种安装方式 单机 安装于单机 采用本地
  • Hadoop 2.4.0+zookeeper3.4.6+hbase0.98.3分布式集群搭建

    Hadoop 2 4 0 zookeeper3 4 6 hbase0 98 3分布式集群搭建 博客分类 hadoop Ip 主机名 程序 进程 192 168 137 11 h1 Jdk Hadoop hbase Namenode DFSZ
  • 分布式系统一致性研究,paxos算法

    感谢eric的敦促 感谢shuai的感召 我尝试记录一点混乱的思考 什么是分布式系统 毋庸置疑 Internet和DNS是两个典型的成功的分布式系统 那么 分布式系统是不是就是计算机网络 1990年 Sun Microsystems 公司提
  • 开源大数据利器汇总

    所有分类 gt 服务器软件 gt 分布式 云计算 大数据 开源大数据利器汇总 开源 2015 05 21 21 00 00 发布 您的评价 0 0 收藏 0收藏 类别 名称 官
  • 阿里云数据库配置IP白名单操作方法(以MySQL为例)

    阿里云数据库RDS创建成功后 首次连接访问RDS需要配置IP白名单 在阿里云RDS控制台即可配置IP白名单 阿里云百科来详细说下阿里云服务器RDS配置白名单的方法 阿里云服务器配置IP白名单 阿里云百科以MySQL云数据库为例 RDS My
  • Hbase split的三种方式和split的过程

    Hbase split的三种方式和split的过程 在Hbase中split是一个很重要的功能 Hbase是通过把数据分配到一定数量的region来达到负载均衡的 一个table会被分配到一个或多个region中 这些region会被分配到
  • Spanner vs. F1:谷歌两大数据管理利器的整体对比及关联 2016-05-22 20:36 757人阅读 评论(0) 收藏 举报 目录(?)[+] http://www.csdn.net/a

    Spanner vs F1 谷歌两大数据管理利器的整体对比及关联 2016 05 22 20 36 757人阅读 评论 0 收藏 举报 目录 http www csdn net article 2013 10 10 2817138 f1 a
  • 分布式系统设计的求生之路

    作者 作者 Simon 腾讯后台开发高级工程师 链接 http wetest qq com lab view id 105 著作权归作者所有 商业转载请联系WeTest获得授权 非商业转载请注明出处 分布式系统理念渐渐成为了后台架构技术的重
  • 分布式数据库资料

    Hadoop是很多组件的集合 主要包括但不限于MapReduce HDFS HBase ZooKeeper MapReduce模仿了Google MapReduce HDFS模仿了Google File System HBase模仿了Goo
  • 一、MapReduce已死,Spark称霸

    一 MapReduce已死 Spark称霸 2014 09 17 11 20 王家林 Spark亚太研究院 字号 T T 综合评级 想读 35 在读 13 已读 2 品书斋鉴 0 已有50人发表书评 Spark亚太研究院系列丛书 Spark
  • Hypertable sql

    First create a new namespace called Test CREATE NAMESPACE Test and make it the current namespace USE Test Now let s crea
  • HBase介绍(列存储)

    HBase介绍 列存储 2013 11 26 23 25 5871人阅读 评论 2 收藏 举报 分类 云存储 2 Hbase简介 started by chad walters and jim 2006 11 G release paper
  • Hypertable 简介 一个 C++ 的Bigtable开源实现

    1 Introduction 随着互联网技术的发展 尤其是云计算平台的出现 分布式应用程序需要处理大量的数据 PB级 在一个或多个云计算平台中 成千上万的计算主机 如何保证数据的有效存储和组织 为应用提供高效和可靠的访问接口 并且保持良好的
  • 分布式数据库需要考虑的(BigTable VS Dynamo)

    分布式数据库需要考虑的 BigTable VS Dynamo 在设计 评价分布式数据库的时候需要考虑一些最基本的特性 我想这些特性可能包括 1 存储系统 一种是类似BigTable将存储交给GFS去做 GFS会保证写入数据的完整 另外一种是
  • hadoop初级到资深

    hadoop初级到资深 2015 06 13 12 08 165人阅读 评论 0 收藏 举报 分类 hadoop 3 1 hadoop是什么 适合大数据的分布式存储与计算平台 2 hadoop版本有哪些 Apache 官方版本 1 1 2
  • 1.1.3 Hadoop生态系统

    1 1 3 Hadoop生态系统 2013 05 08 09 38 16 我来说两句 收藏 我要投稿 本文所属图书 gt Hadoop技术内幕 深入解析Hadoop Common和HDFS架构设计与实现原理 Hadoop技术内幕共两册 分别
  • hadoop使用(五)

    博客园 闪存 首页 新随笔 联系 管理 订阅 随笔 247 文章 122 评论 571 hadoop使用 五 第1章 引言 1 1 编写目的 对关于hadoop的文档及资料进行进一步的整理 1 2 相关网站 毋庸置疑 http hadoop

随机推荐

  • Failed to execute goal on project...

    从eclipse 换到idea 导入了一个maven的父子项目 在idea中的maven project idea双击shift键 执行maven package命令 结果报错 Failed to execute goal on proje
  • 【STM32】时钟系统知识

    基础知识 1 STM32 有5个时钟源 HSI HSE LSI LSE PLL HSI是高速内部时钟 RC振荡器 频率为8MHz 精度不高 HSE是高速外部时钟 可接石英 陶瓷谐振器 或者接外部时钟源 频率范围为4MHz 16MHz LSI
  • plc输入/输出模块的选择

    1 数字量输入模块的选择 1 选择电压等级 根据电压 有DC 5V 12V 24V 48V 60V和交流110V 220V 2 按保护形式分为隔离型和非隔离型两种 3 选择模块密度 按点数分为8分 16分 32分 64分 高密度模块 如32
  • ML--HMM(隐马尔可夫模型及python的实现1)

    1 综述 隐马尔可夫模型是马尔可夫模型的进一步发展 马尔可夫模型是马尔可夫过程的模型化 可以用图1 a 的框图形象表示 它把一个总随机过程看成一系列状态的不断转移 图1 b 是隐马尔可夫模型 1 1几个需要理解的概念 a 马尔可夫性 如果一
  • [QT编程系列-19]: 基础框架 - 信号与槽背后的编程思想

    目录 一 主要的架构思想 二 主要的编程思想 一 主要的架构思想 信号与槽 Signals and Slots 是Qt框架中的一种机制 背后的思想主要有以下几个方面 解耦和松耦合 信号与槽机制通过解耦发出信号的对象和处理信号的对象之间的依赖
  • SQL Server 2012的安装与环境配置以及在Java中连接数据库

    自学Java也已快有一个月了 虽然本人从事的是FPGA开发的工作 但是对于软件开发兴趣盎然 没办法只能工作之余自己慢慢自学了 这应该是我的第一篇Java学习文章 希望以后自己能够坚持 记录一些学习过程 做一些有意思的事 慢慢实现自己的目标吧
  • echarts雷达图自定义射线颜色、边框效果和背景样式

    目录 1 在官网找样例 2 初步改造示例 有个雏形 3 细节改造和优化 4 全部代码 5 原始效果和完成效果对比 1 在官网找样例 样例地址 Examples Apache ECharts 2 初步改造示例 有个雏形 对应的代码 为了说明问
  • 1.7 编程基础之字符串 15 整理药名 python

    http noi openjudge cn ch0107 15 1 7 编程基础之字符串 15 整理药名 http noi openjudge cn ch0107 15 Python字母大小写的转换 两种方法 https blog csdn
  • Java实体类转Map、Map转实体类

    1 创建entity User java package com jeff entity public class User private String userName private String password private I
  • Python错误处理的艺术:使用retrying库实现高效重试机制

    简介 学习如何使用 Python 的 retrying 库来处理在程序运行过程中可能出现的各种异常和错误 retrying 是一种简单 易于使用的重试机制 帮助我们处理由网络问题或其他暂时性错误引起的失败 在很多情况下 简单的重试可能就是解
  • SSM框架运行原理

    ssm框架 包括 springMVC spring mybatis springMVC 是基于MVC的框架 属于MVC框架的还有 Struts1 Struts2 SpringMVC 获取值得方式 Struts1 actionForm jav
  • SylixOS学习三—— SylixOS的引导与安装1

    自学SylixOS启程之旅笔记 一 SylixOS 引导过程分析 1 SylixOS 常用引导程序 2 SylixOS 支持ARM设备的几种引导方式 3 SylixOS引导过程分析 总流程分析 3 1 一个设备从上电到启动完成的整个流程 3
  • 使用两个队列实现一个栈,使用两个栈实现一个队列

    一 栈与队列的特点 一 栈 栈 一种特殊的线性表 其只允许在固定的一端进行插入和删除元素操作 进行数据插入和删除操作的一端称为栈顶 另一端称为栈底 不含任何元素的栈称为空 栈 栈又称为后进先出的线性表 栈的特点 后进先出 LIFO 二 队列
  • Java ZipOutputStream 的使用,实现压缩文件

    Java 压缩文件主要通过 ZipOutputStream 实现 ZipOutputStream 有 5 个关键的方法 putNextEntry 向压缩包中添加子文件 并设置文件路径和名称 压缩包解压后得到的文件叫子文件 该方法接受一个 Z
  • Flask框架十:Flask终章与补充(首)

    1 WTForms的表单验证 form表单验证的类型有多种 邮箱 年龄 是否为空等多种验证 以及验证码等验证 WTForms都提供了相关的验证模块 创建一个froms模块 将想要验证的视图模块中的内容写在类里面 from wtforms i
  • 如果我想用vue来对导入的word文件进行解析呢

    如果你想使用 Vue 来解析 Word 文件 你可以考虑使用第三方库来帮助你完成这个任务 你可以使用 js word library 来解析 Word 文件 它是一个 JavaScript 库 可以解析 Word 文件中的文本 图像 表格等
  • GIF演示排序算法

    最近在准备笔试 面试 看了不少关于排序算法的知识 总感觉代码有余 直观不足 所以想利用直观的GIF动图来演示各种排序算法 1 插入排序 Insertion Sort 1 1算法简介 插入排序 Insertion Sort 的算法描述是一种简
  • CentOS7的firewall和安装iptables

    前言 CentOS7 的防火墙默认使用是firewall 而我们通常使用iptables 本文记录了firewall基础的命令和iptables的安装和使用 firewall部分 part1 服务命令 systemctl start fir
  • 简析多级指针解引用

    转自 简析多级指针解引用 指针是C语言中公认的最为强大的语法要素 但同时也是最难理解的语法要素 它曾给程序员带来了无数麻烦和痛苦 以致于在C语言之后诞生的很多新兴 语言中我们再也难觅指针的身影了 下面是一个最简单的C语言指针的例子 int
  • hadoop使用(五)

    博客园 闪存 首页 新随笔 联系 管理 订阅 随笔 247 文章 122 评论 571 hadoop使用 五 第1章 引言 1 1 编写目的 对关于hadoop的文档及资料进行进一步的整理 1 2 相关网站 毋庸置疑 http hadoop