Hadoop工程师面试题解析


1. 下面哪个程序负责 HDFS 数据存储。答案C datanode

a)NameNode
b)Jobtracker
c)Datanode 
d)secondaryNameNode
e)tasktracker

2. HDfS 中的 block 默认保存几份? 答案A默认3分

a)3 份
b)2 份
c)1 份
d)不确定

3. 下列哪个程序通常与 NameNode 在一个节点启动?答案D

a)SecondaryNameNode
b)DataNode
c)TaskTracker
d)Jobtracker

此题分析:

hadoop的集群是基于master/slave模式,namenode和jobtracker属于master,datanode和tasktracker属于slave,master只有一个,而slave有多个SecondaryNameNode内存需求和NameNode在一个数量级上,所以通常secondary NameNode(运行在单独的物理机器上)和NameNode运行在不同的机器上。

JobTracker和TaskTracker

JobTracker 对应于 NameNode

TaskTracker 对应于 DataNode

DataNode 和NameNode 是针对数据存放来而言的

JobTracker和TaskTracker是对于MapReduce执行而言的

mapreduce中几个主要概念,mapreduce整体上可以分为这么几条执行线索:obclient,JobTracker与TaskTracker。

1、JobClient会在用户端通过JobClient类将应用已经配置参数打包成jar文件存储到hdfs,并把路径提交到Jobtracker,然后由JobTracker创建每一个Task(即MapTask和ReduceTask)并将它们分发到各个TaskTracker服务中去执行。

2、JobTracker是一个master服务,软件启动之后JobTracker接收Job,负责调度Job的每一个子任务task运行于TaskTracker上,并监控它们,如果发现有失败的task就重新运行它。一般情况应该把JobTracker部署在单独的机器上。

3、TaskTracker是运行在多个节点上的slaver服务。TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务。TaskTracker都需要运行在HDFS的DataNode上。

4. Hadoop 作者 答案C Doug cutting

a)Martin Fowler
b)Kent Beck
c)Doug cutting

5. HDFS 默认 Block Size 答案:B

a)32MB
b)64MB 
c)128MB

(因为版本更换较快,这里答案只供参考)

6. 下列哪项通常是集群的最主要瓶颈:答案:C磁盘

a)CPU
b)网络
c)磁盘IO 
d)内存

该题解析:

首先集群的目的是为了节省成本,用廉价的pc机,取代小型机及大型机。小型机和大型机有什么特点?

1.cpu处理能力强

2.内存够大

所以集群的瓶颈不可能是a和d

3.网络是一种稀缺资源,但是并不是瓶颈。

4.由于大数据面临海量数据,读写数据都需要io,然后还要冗余数据,hadoop一般备3份数据,所以IO就会打折扣。

7. 关于 SecondaryNameNode 哪项是正确的?答案C

a)它是 NameNode 的热备
b)它对内存没有要求
c)它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间
d)SecondaryNameNode 应与 NameNode 部署到一个节点。

多选题:

8. 下列哪项可以作为集群的管理?答案:ABD

a)Puppet 
b)Pdsh 
c)Cloudera Manager
d)Zookeeper

9. 配置机架感知的下面哪项正确:答案ABC

a)如果一个机架出问题,不会影响数据读写
b)写入数据的时候会写到不同机架的 DataNode 中
c)MapReduce 会根据机架获取离自己比较近的网络数据
10. Client 端上传文件的时候下列哪项正确?答案B

a)数据经过 NameNode 传递给 DataNode

b)Client 端将文件切分为 Block,依次上传

c)Client 只上传数据到一台 DataNode,然后由 NameNode 负责 Block 复制工作

该题分析:
Client向NameNode发起文件写入的请求。

NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。

Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。

11. 下列哪个是 Hadoop 运行的模式:答案ABC

a)单机版 
b)伪分布式 
c)分布式

12. Cloudera 提供哪几种安装 CDH 的方法?答案:ABCD

a)Cloudera manager 
b)Tarball 
c)Yum 
d)Rpm

判断题:

13. Ganglia 不仅可以进行监控,也可以进行告警。( 正确)

分析:此题的目的是考Ganglia的了解。严格意义上来讲是正确。ganglia作为一款最常用的Linux环境中的监控软件,它擅长的的是从节点中按照用户的需求以较低的代价采集数据。但是ganglia在预警以及发生事件后通知用户上并不擅长。最新的ganglia已经有了部分这方面的功能。但是更擅长做警告的还有Nagios。Nagios,就是一款精于预警、通知的软件。通过将Ganglia和Nagios组合起来,把Ganglia采集的数据作为Nagios的数据源,然后利用Nagios来发送预警通知,可以完美的实现一整套监控管理的系统。

14. Block Size 是不可以修改的。(错误 )

分析:它是可以被修改的Hadoop的基础配置文件是hadoop-default.xml,默认建立一个Job的时候会建立Job的Config,Config首先读入hadoop-default.xml的配置,然后再读入hadoop-site.xml的配置(这个文件初始的时候配置为空),hadoop-site.xml中主要配置需要覆盖的hadoop-default.xml的系统级配置。

15. Nagios 不可以监控 Hadoop 集群,因为它不提供 Hadoop 支持。(错误 )

分析:Nagios是集群监控工具,而且是云计算三大利器之一

16. 如果 NameNode 意外终止,SecondaryNameNode 会接替它使集群继续工作。(错误 )

分析:SecondaryNameNode是帮助恢复,而不是替代,如何恢复,可以查看

17. Cloudera CDH 是需要付费使用的。(错误 )

分析:第一套付费产品是Cloudera Enterpris,Cloudera Enterprise在美国加州举行的 Hadoop 大会 (Hadoop Summit) 上公开,以若干私有管理、监控、运作工具加强 Hadoop 的功能。收费采取合约订购方式,价格随用的 Hadoop 叢集大小变动。

18. Hadoop 是 Java 开发的,所以 MapReduce 只支持 Java 语言编写。(错误 )

分析:rhadoop是用R语言开发的,MapReduce是一个框架,可以理解是一种思想,可以使用其他语言开发。

19. Hadoop 支持数据的随机读写。(错 )

分析:lucene是支持随机读写的,而hdfs只支持随机读。但是HBase可以来补救。HBase提供随机读写,来解决Hadoop不能处理的问题。HBase自底层设计开始即聚焦于各种可伸缩性问题:表可以很“高”,有数十亿个数据行;也可以很“宽”,有数百万个列;水平分区并在上千个普通商用机节点上自动复制。表的模式是物理存储的直接反映,使系统有可能提高高效的数据结构的序列化、存储和检索。

20. NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。(错误)

此题分析:

NameNode 不需要从磁盘读取 metadata,所有数据都在内存中,硬盘上的只是序列化的结果,只有每次 namenode 启动的时候才会读取。
1)文件写入
Client向NameNode发起文件写入的请求。
NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。
Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。

2)文件读取
Client向NameNode发起文件读取的请求。

21. NameNode 本地磁盘保存了 Block 的位置信息。( 个人认为正确,欢迎提出其它意见)

分析:DataNode是文件存储的基本单元,它将Block存储在本地文件系统中,保存了Block的Meta-data,同时周期性地将所有存在的Block信息发送给NameNode。NameNode返回文件存储的DataNode的信息。
Client读取文件信息。

22. DataNode 通过长连接与 NameNode 保持通信。( )

这个有分歧:具体正在找这方面的有利资料。下面提供资料可参考。

首先明确一下概念:

(1).长连接
Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在,此种方式常用于点对点通讯。

(2).短连接
Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于一点对多点通讯,比如多个Client连接一个Server.

23. Hadoop 自身具有严格的权限管理和安全措施保障集群正常运行。(错误 )

hadoop只能阻止好人犯错,但是不能阻止坏人干坏事

24. Slave 节点要存储数据,所以它的磁盘越大越好。( 错误)

分析:一旦Slave节点宕机,数据恢复是一个难题

25. hadoop dfsadmin –report 命令用于检测 HDFS 损坏块。(错误 )

26. Hadoop 默认调度器策略为 FIFO(正确 )

27. 集群内每个节点都应该配 RAID,这样避免单磁盘损坏,影响整个节点运行。(错误 )

分析:首先明白什么是RAID,可以参考百科磁盘阵列。这句话错误的地方在于太绝对,具体情况具体分析。题目不是重点,知识才是最重要的。因为hadoop本身就具有冗余能力,所以如果不是很严格不需要都配备RAID。具体参考第二题。

28. 因为 HDFS 有多个副本,所以 NameNode 是不存在单点问题的。(错误 )

29. 每个 map 槽就是一个线程。(错误 )

分析:首先我们知道什么是map 槽,map 槽->map slotmap slot 只是一个逻辑值 ( org.apache.hadoop.mapred.TaskTracker.TaskLauncher.numFreeSlots ),而不是对应着一个线程或者进程

30. Mapreduce 的 input split 就是一个 block。(错误 )

31. NameNode 的 Web UI 端口是 50030,它通过 jetty 启动的 Web 服务。(错误 )

32. Hadoop 环境变量中的 HADOOP_HEAPSIZE 用于设置所有 Hadoop 守护线程的内存。它默认是 200 GB。( 错误)

hadoop为各个守护进程(namenode,secondarynamenode,jobtracker,datanode,tasktracker)统一分配的内存在hadoop-env.sh中设置,参数为HADOOP_HEAPSIZE,默认为1000M。

33、33. DataNode 首次加入 cluster 的时候,如果 log 中报告不兼容文件版本,那需要 NameNode执行“Hadoop namenode -format”操作格式化磁盘。(错误 )

分析:

首先明白介绍,什么ClusterID

ClusterID

添加了一个新的标识符ClusterID用于标识集群中所有的节点。当格式化一个Namenode,需要提供这个标识符或者自动生成。这个ID可以被用来格式化加入集群的其他Namenode。

二次整理

有的同学问题的重点不是上面分析内容:内容如下:

这个报错是说明 DataNode 所装的Hadoop版本和其它节点不一致,应该检查DataNode的Hadoop版本
继续阅读 »

1. 下面哪个程序负责 HDFS 数据存储。答案C datanode

a)NameNode
b)Jobtracker
c)Datanode 
d)secondaryNameNode
e)tasktracker

2. HDfS 中的 block 默认保存几份? 答案A默认3分

a)3 份
b)2 份
c)1 份
d)不确定

3. 下列哪个程序通常与 NameNode 在一个节点启动?答案D

a)SecondaryNameNode
b)DataNode
c)TaskTracker
d)Jobtracker

此题分析:

hadoop的集群是基于master/slave模式,namenode和jobtracker属于master,datanode和tasktracker属于slave,master只有一个,而slave有多个SecondaryNameNode内存需求和NameNode在一个数量级上,所以通常secondary NameNode(运行在单独的物理机器上)和NameNode运行在不同的机器上。

JobTracker和TaskTracker

JobTracker 对应于 NameNode

TaskTracker 对应于 DataNode

DataNode 和NameNode 是针对数据存放来而言的

JobTracker和TaskTracker是对于MapReduce执行而言的

mapreduce中几个主要概念,mapreduce整体上可以分为这么几条执行线索:obclient,JobTracker与TaskTracker。

1、JobClient会在用户端通过JobClient类将应用已经配置参数打包成jar文件存储到hdfs,并把路径提交到Jobtracker,然后由JobTracker创建每一个Task(即MapTask和ReduceTask)并将它们分发到各个TaskTracker服务中去执行。

2、JobTracker是一个master服务,软件启动之后JobTracker接收Job,负责调度Job的每一个子任务task运行于TaskTracker上,并监控它们,如果发现有失败的task就重新运行它。一般情况应该把JobTracker部署在单独的机器上。

3、TaskTracker是运行在多个节点上的slaver服务。TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务。TaskTracker都需要运行在HDFS的DataNode上。

4. Hadoop 作者 答案C Doug cutting

a)Martin Fowler
b)Kent Beck
c)Doug cutting

5. HDFS 默认 Block Size 答案:B

a)32MB
b)64MB 
c)128MB

(因为版本更换较快,这里答案只供参考)

6. 下列哪项通常是集群的最主要瓶颈:答案:C磁盘

a)CPU
b)网络
c)磁盘IO 
d)内存

该题解析:

首先集群的目的是为了节省成本,用廉价的pc机,取代小型机及大型机。小型机和大型机有什么特点?

1.cpu处理能力强

2.内存够大

所以集群的瓶颈不可能是a和d

3.网络是一种稀缺资源,但是并不是瓶颈。

4.由于大数据面临海量数据,读写数据都需要io,然后还要冗余数据,hadoop一般备3份数据,所以IO就会打折扣。

7. 关于 SecondaryNameNode 哪项是正确的?答案C

a)它是 NameNode 的热备
b)它对内存没有要求
c)它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间
d)SecondaryNameNode 应与 NameNode 部署到一个节点。

多选题:

8. 下列哪项可以作为集群的管理?答案:ABD

a)Puppet 
b)Pdsh 
c)Cloudera Manager
d)Zookeeper

9. 配置机架感知的下面哪项正确:答案ABC

a)如果一个机架出问题,不会影响数据读写
b)写入数据的时候会写到不同机架的 DataNode 中
c)MapReduce 会根据机架获取离自己比较近的网络数据
10. Client 端上传文件的时候下列哪项正确?答案B

a)数据经过 NameNode 传递给 DataNode

b)Client 端将文件切分为 Block,依次上传

c)Client 只上传数据到一台 DataNode,然后由 NameNode 负责 Block 复制工作

该题分析:
Client向NameNode发起文件写入的请求。

NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。

Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。

11. 下列哪个是 Hadoop 运行的模式:答案ABC

a)单机版 
b)伪分布式 
c)分布式

12. Cloudera 提供哪几种安装 CDH 的方法?答案:ABCD

a)Cloudera manager 
b)Tarball 
c)Yum 
d)Rpm

判断题:

13. Ganglia 不仅可以进行监控,也可以进行告警。( 正确)

分析:此题的目的是考Ganglia的了解。严格意义上来讲是正确。ganglia作为一款最常用的Linux环境中的监控软件,它擅长的的是从节点中按照用户的需求以较低的代价采集数据。但是ganglia在预警以及发生事件后通知用户上并不擅长。最新的ganglia已经有了部分这方面的功能。但是更擅长做警告的还有Nagios。Nagios,就是一款精于预警、通知的软件。通过将Ganglia和Nagios组合起来,把Ganglia采集的数据作为Nagios的数据源,然后利用Nagios来发送预警通知,可以完美的实现一整套监控管理的系统。

14. Block Size 是不可以修改的。(错误 )

分析:它是可以被修改的Hadoop的基础配置文件是hadoop-default.xml,默认建立一个Job的时候会建立Job的Config,Config首先读入hadoop-default.xml的配置,然后再读入hadoop-site.xml的配置(这个文件初始的时候配置为空),hadoop-site.xml中主要配置需要覆盖的hadoop-default.xml的系统级配置。

15. Nagios 不可以监控 Hadoop 集群,因为它不提供 Hadoop 支持。(错误 )

分析:Nagios是集群监控工具,而且是云计算三大利器之一

16. 如果 NameNode 意外终止,SecondaryNameNode 会接替它使集群继续工作。(错误 )

分析:SecondaryNameNode是帮助恢复,而不是替代,如何恢复,可以查看

17. Cloudera CDH 是需要付费使用的。(错误 )

分析:第一套付费产品是Cloudera Enterpris,Cloudera Enterprise在美国加州举行的 Hadoop 大会 (Hadoop Summit) 上公开,以若干私有管理、监控、运作工具加强 Hadoop 的功能。收费采取合约订购方式,价格随用的 Hadoop 叢集大小变动。

18. Hadoop 是 Java 开发的,所以 MapReduce 只支持 Java 语言编写。(错误 )

分析:rhadoop是用R语言开发的,MapReduce是一个框架,可以理解是一种思想,可以使用其他语言开发。

19. Hadoop 支持数据的随机读写。(错 )

分析:lucene是支持随机读写的,而hdfs只支持随机读。但是HBase可以来补救。HBase提供随机读写,来解决Hadoop不能处理的问题。HBase自底层设计开始即聚焦于各种可伸缩性问题:表可以很“高”,有数十亿个数据行;也可以很“宽”,有数百万个列;水平分区并在上千个普通商用机节点上自动复制。表的模式是物理存储的直接反映,使系统有可能提高高效的数据结构的序列化、存储和检索。

20. NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。(错误)

此题分析:

NameNode 不需要从磁盘读取 metadata,所有数据都在内存中,硬盘上的只是序列化的结果,只有每次 namenode 启动的时候才会读取。
1)文件写入
Client向NameNode发起文件写入的请求。
NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。
Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。

2)文件读取
Client向NameNode发起文件读取的请求。

21. NameNode 本地磁盘保存了 Block 的位置信息。( 个人认为正确,欢迎提出其它意见)

分析:DataNode是文件存储的基本单元,它将Block存储在本地文件系统中,保存了Block的Meta-data,同时周期性地将所有存在的Block信息发送给NameNode。NameNode返回文件存储的DataNode的信息。
Client读取文件信息。

22. DataNode 通过长连接与 NameNode 保持通信。( )

这个有分歧:具体正在找这方面的有利资料。下面提供资料可参考。

首先明确一下概念:

(1).长连接
Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在,此种方式常用于点对点通讯。

(2).短连接
Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于一点对多点通讯,比如多个Client连接一个Server.

23. Hadoop 自身具有严格的权限管理和安全措施保障集群正常运行。(错误 )

hadoop只能阻止好人犯错,但是不能阻止坏人干坏事

24. Slave 节点要存储数据,所以它的磁盘越大越好。( 错误)

分析:一旦Slave节点宕机,数据恢复是一个难题

25. hadoop dfsadmin –report 命令用于检测 HDFS 损坏块。(错误 )

26. Hadoop 默认调度器策略为 FIFO(正确 )

27. 集群内每个节点都应该配 RAID,这样避免单磁盘损坏,影响整个节点运行。(错误 )

分析:首先明白什么是RAID,可以参考百科磁盘阵列。这句话错误的地方在于太绝对,具体情况具体分析。题目不是重点,知识才是最重要的。因为hadoop本身就具有冗余能力,所以如果不是很严格不需要都配备RAID。具体参考第二题。

28. 因为 HDFS 有多个副本,所以 NameNode 是不存在单点问题的。(错误 )

29. 每个 map 槽就是一个线程。(错误 )

分析:首先我们知道什么是map 槽,map 槽->map slotmap slot 只是一个逻辑值 ( org.apache.hadoop.mapred.TaskTracker.TaskLauncher.numFreeSlots ),而不是对应着一个线程或者进程

30. Mapreduce 的 input split 就是一个 block。(错误 )

31. NameNode 的 Web UI 端口是 50030,它通过 jetty 启动的 Web 服务。(错误 )

32. Hadoop 环境变量中的 HADOOP_HEAPSIZE 用于设置所有 Hadoop 守护线程的内存。它默认是 200 GB。( 错误)

hadoop为各个守护进程(namenode,secondarynamenode,jobtracker,datanode,tasktracker)统一分配的内存在hadoop-env.sh中设置,参数为HADOOP_HEAPSIZE,默认为1000M。

33、33. DataNode 首次加入 cluster 的时候,如果 log 中报告不兼容文件版本,那需要 NameNode执行“Hadoop namenode -format”操作格式化磁盘。(错误 )

分析:

首先明白介绍,什么ClusterID

ClusterID

添加了一个新的标识符ClusterID用于标识集群中所有的节点。当格式化一个Namenode,需要提供这个标识符或者自动生成。这个ID可以被用来格式化加入集群的其他Namenode。

二次整理

有的同学问题的重点不是上面分析内容:内容如下:

这个报错是说明 DataNode 所装的Hadoop版本和其它节点不一致,应该检查DataNode的Hadoop版本 收起阅读 »

一篇文章告诉你,该学R还是Python

1710.jpg



对于想从事数据行业的人和数据工作者来说,是学习R还是python,哪个工具更实用一直被大家争论。Martijn Theuwissen,DataCamp的教育专家详细比较了这两个工具。

ython和R是统计学中两种最流行的的编程语言,R的功能性主要是统计学家在开发时考虑的(R具有强大的可视化功能),而Python因为易于理解的语法被大家所接受。

在这篇文章中,我们将重点介绍R和Python以及它们在数据科学和统计上地位之间的差异。

关于R的介绍

Ross Ihaka和Robert Gentleman于1995年在S语言中创造了 开源语言R,目的是专注于提供更好和更人性化的方式做数据分析、统计和图形模型的语言。

起初R主要是在学术和研究使用,但近来企业界发现R也很不错。这使得中的R成为企业中使用的全球发展最快的统计语言之一。

R的主要优势是它有一个庞大的社区,通过邮件列表,用户贡献的文档和一个非常活跃的堆栈溢出组提供支持。还有CRAN镜像,一个用户可以很简单地创造的一个包含R包的知识库。这些包有R里面的函数和数据,各地的镜像都是R网站的备份文件,完全一样,用户可以可以选择离你最近的镜像访问最新的技术和功能,而无需从头开发。

如果你是一个有经验的程序员,你可以不会觉得使用R可以提高效率,但是,你可能会发现学习R经常会遇到瓶颈。幸运的是现在的资源很多。

关于Python的介绍

Python是由Guido van Rossem创建于1991年,并强调效率和代码的可读性。希望深入的数据分析或应用统计技术的程序员是Python的主要用户。

当你越需要在工程环境中工作,你会越喜欢Python。它是一种灵活的语言,在处理一些新东西上表现很好,并且注重可读性和简单性,它的学习曲线是比较低的。

和R类似,Python也有包,pypi是一个Python包的仓库,里面有很多别人写好的Python库。

Python也是一个大社区,但它是一个有点比较分散,因为它是一个通用的语言。然而,Python自称他们在数据科学中更占优势地位:预期的增长,更新颖的科学数据应用的起源在这里。

R和Python:数字的比较

在网上可以经常看到比较R和Python人气的数字,虽然这些数字往往就这两种语言是如何在计算机科学的整体生态系统不断发展,但是很难并列进行比较。主要的原因是,R仅在数据科学的环境中使用,而Python作为一种通用语言,被广泛应用于许多领域,如网络的发展。这往往导致排名结果偏向于Python,而且从业者工资会较低。

R如何使用?

R主要用于当数据分析任务需要独立的计算或分析单个服务器。这是探索性的工作,因为R有很多包和随时可用的测试,可以提供提供必要的工具,快速启动和运行的数量庞大几乎任何类型的数据分析。R甚至可以是一个大数据解决方案的一部分。

当开始使用R的时候,最好首先安装RStudio IDE。之后建议你看看下面的流行包:

•dplyr, plyr 和 data.table 可以轻松操作包
•stringr 操作字符串
•zoo做定期和不定期的时间序列工作
•ggvis, lattice, and ggplot2 进行数据可视化
•caret 机器学习

Python如何使用?

如果你的数据分析任务需要使用Web应用程序,或代码的统计数据需要被纳入生产数据库进行集成时你可以使用python,作为一个完全成熟的编程语言,它是实现算法一个伟大的工具。

虽然在过去python包对于数据分析还处于早期阶段,但是这些年已经有了显著改善。使用时需要安装NumPy/ SciPy的(科学计算)和pandas(数据处理),以使Python可用于数据分析。也看看matplotlib,使图形和scikit-learn机器学习。

不同于R,Python有没有明确的非常好的IDE。我们建议你看看Spyder以及IPython网站,看看哪一个最适合你。

R和Python:数据科学行业的表现

如果你看一下最近的民意调查,在数据分析的编程语言方面,R是明显的赢家。

有越来越多的人从研发转向Python。此外,有越来越多的公司使用这两种语言来进行组合。

如果你打算从事数据行业,你用好学会这两种语言。招聘趋势显示这两个技能的需求日益增加,而工资远高于平均水平。

R:优点和缺点

优点

可视化能力强

可视化通常让我们更有效地理解数字本身。R和可视化是绝配。一些必看的可视化软件包是ggplot2,ggvis,googleVis和rCharts。

完善的生态系统

R具有活跃的社区和一个丰富的生态系统。R包在CRAN,Bioconductor的和Github上。您可以通过Rdocumentation搜索所有的R包。

用于数据科学

R由统计学家开发,他们可以通过R代码和包交流想法和概念,你不一定需要有计算机背景。此外企业界也越来越接受R。

缺点

R比较缓慢

R使统计人员的更轻松,但你电脑的运行速度可能很慢。虽然R的体验是缓慢的,但是有多个包来提高的r性能:pqR,renjin,FastR, Riposte 等等。

R不容易深入学习

R学习起来并不容易,特别是如果你要从GUI来进行统计分析。如果你不熟悉它,即使发现包可能会非常耗时。

Python:优点和缺点

优点

IPython Notebook

IPython Notebook使我们更容易使用Python进行数据工作,你可以轻松地与同事共享Notebook,而无需他们安装任何东西。这大大减少了组织代码,输出和注释文件的开销。可以花更多的时间做实际的工作。

通用语言

Python是一种通用的语言,容易和直观。在学习上会比较容易,它可以加快你写一个程序的速度。此外,Python测试框架是一个内置的,这样可以保证你的代码是可重复使用和可靠的。

一个多用途的语言

Python把不同背景的人集合在一起。作为一种常见的、容易理解,大部分程序员都懂的,可以很容易地和统计学家沟通,你可以使用一个简单的工具就把你每一个工作伙伴都整合起来。

缺点

可视化

可视化是选择数据分析软件的一个重要的标准。虽然Python有一些不错的可视化库,如Seaborn,Bokeh和Pygal。但相比于R,呈现的结果并不总是那么顺眼。

Python是挑战者

Python对于R来说是一个挑战者,它不提供必不可少的R包。虽然它在追赶,但是还不够。

最终你该学习什么呢:

由你决定!作为一个数据工作者,你需要在工作中选择最适合需要的语言。在学习之前问清楚这些问题可以帮助你:

你想解决什么问题?
什么是学习语言的净成本?
是什么在你的领域中常用的工具?
什么是其他可用工具以及如何做这些涉及到的常用工具?
继续阅读 »
1710.jpg



对于想从事数据行业的人和数据工作者来说,是学习R还是python,哪个工具更实用一直被大家争论。Martijn Theuwissen,DataCamp的教育专家详细比较了这两个工具。

ython和R是统计学中两种最流行的的编程语言,R的功能性主要是统计学家在开发时考虑的(R具有强大的可视化功能),而Python因为易于理解的语法被大家所接受。

在这篇文章中,我们将重点介绍R和Python以及它们在数据科学和统计上地位之间的差异。

关于R的介绍

Ross Ihaka和Robert Gentleman于1995年在S语言中创造了 开源语言R,目的是专注于提供更好和更人性化的方式做数据分析、统计和图形模型的语言。

起初R主要是在学术和研究使用,但近来企业界发现R也很不错。这使得中的R成为企业中使用的全球发展最快的统计语言之一。

R的主要优势是它有一个庞大的社区,通过邮件列表,用户贡献的文档和一个非常活跃的堆栈溢出组提供支持。还有CRAN镜像,一个用户可以很简单地创造的一个包含R包的知识库。这些包有R里面的函数和数据,各地的镜像都是R网站的备份文件,完全一样,用户可以可以选择离你最近的镜像访问最新的技术和功能,而无需从头开发。

如果你是一个有经验的程序员,你可以不会觉得使用R可以提高效率,但是,你可能会发现学习R经常会遇到瓶颈。幸运的是现在的资源很多。

关于Python的介绍

Python是由Guido van Rossem创建于1991年,并强调效率和代码的可读性。希望深入的数据分析或应用统计技术的程序员是Python的主要用户。

当你越需要在工程环境中工作,你会越喜欢Python。它是一种灵活的语言,在处理一些新东西上表现很好,并且注重可读性和简单性,它的学习曲线是比较低的。

和R类似,Python也有包,pypi是一个Python包的仓库,里面有很多别人写好的Python库。

Python也是一个大社区,但它是一个有点比较分散,因为它是一个通用的语言。然而,Python自称他们在数据科学中更占优势地位:预期的增长,更新颖的科学数据应用的起源在这里。

R和Python:数字的比较

在网上可以经常看到比较R和Python人气的数字,虽然这些数字往往就这两种语言是如何在计算机科学的整体生态系统不断发展,但是很难并列进行比较。主要的原因是,R仅在数据科学的环境中使用,而Python作为一种通用语言,被广泛应用于许多领域,如网络的发展。这往往导致排名结果偏向于Python,而且从业者工资会较低。

R如何使用?

R主要用于当数据分析任务需要独立的计算或分析单个服务器。这是探索性的工作,因为R有很多包和随时可用的测试,可以提供提供必要的工具,快速启动和运行的数量庞大几乎任何类型的数据分析。R甚至可以是一个大数据解决方案的一部分。

当开始使用R的时候,最好首先安装RStudio IDE。之后建议你看看下面的流行包:

•dplyr, plyr 和 data.table 可以轻松操作包
•stringr 操作字符串
•zoo做定期和不定期的时间序列工作
•ggvis, lattice, and ggplot2 进行数据可视化
•caret 机器学习

Python如何使用?

如果你的数据分析任务需要使用Web应用程序,或代码的统计数据需要被纳入生产数据库进行集成时你可以使用python,作为一个完全成熟的编程语言,它是实现算法一个伟大的工具。

虽然在过去python包对于数据分析还处于早期阶段,但是这些年已经有了显著改善。使用时需要安装NumPy/ SciPy的(科学计算)和pandas(数据处理),以使Python可用于数据分析。也看看matplotlib,使图形和scikit-learn机器学习。

不同于R,Python有没有明确的非常好的IDE。我们建议你看看Spyder以及IPython网站,看看哪一个最适合你。

R和Python:数据科学行业的表现

如果你看一下最近的民意调查,在数据分析的编程语言方面,R是明显的赢家。

有越来越多的人从研发转向Python。此外,有越来越多的公司使用这两种语言来进行组合。

如果你打算从事数据行业,你用好学会这两种语言。招聘趋势显示这两个技能的需求日益增加,而工资远高于平均水平。

R:优点和缺点

优点

可视化能力强

可视化通常让我们更有效地理解数字本身。R和可视化是绝配。一些必看的可视化软件包是ggplot2,ggvis,googleVis和rCharts。

完善的生态系统

R具有活跃的社区和一个丰富的生态系统。R包在CRAN,Bioconductor的和Github上。您可以通过Rdocumentation搜索所有的R包。

用于数据科学

R由统计学家开发,他们可以通过R代码和包交流想法和概念,你不一定需要有计算机背景。此外企业界也越来越接受R。

缺点

R比较缓慢

R使统计人员的更轻松,但你电脑的运行速度可能很慢。虽然R的体验是缓慢的,但是有多个包来提高的r性能:pqR,renjin,FastR, Riposte 等等。

R不容易深入学习

R学习起来并不容易,特别是如果你要从GUI来进行统计分析。如果你不熟悉它,即使发现包可能会非常耗时。

Python:优点和缺点

优点

IPython Notebook

IPython Notebook使我们更容易使用Python进行数据工作,你可以轻松地与同事共享Notebook,而无需他们安装任何东西。这大大减少了组织代码,输出和注释文件的开销。可以花更多的时间做实际的工作。

通用语言

Python是一种通用的语言,容易和直观。在学习上会比较容易,它可以加快你写一个程序的速度。此外,Python测试框架是一个内置的,这样可以保证你的代码是可重复使用和可靠的。

一个多用途的语言

Python把不同背景的人集合在一起。作为一种常见的、容易理解,大部分程序员都懂的,可以很容易地和统计学家沟通,你可以使用一个简单的工具就把你每一个工作伙伴都整合起来。

缺点

可视化

可视化是选择数据分析软件的一个重要的标准。虽然Python有一些不错的可视化库,如Seaborn,Bokeh和Pygal。但相比于R,呈现的结果并不总是那么顺眼。

Python是挑战者

Python对于R来说是一个挑战者,它不提供必不可少的R包。虽然它在追赶,但是还不够。

最终你该学习什么呢:

由你决定!作为一个数据工作者,你需要在工作中选择最适合需要的语言。在学习之前问清楚这些问题可以帮助你:

你想解决什么问题?
什么是学习语言的净成本?
是什么在你的领域中常用的工具?
什么是其他可用工具以及如何做这些涉及到的常用工具? 收起阅读 »

重要的事情说三遍

常见问题:

1、菜单栏里的“动态”和“发现”分别是什么意思?


2、如何发帖?如何使用“话题”?


3、发帖时,“问答”和“文章”有什么区别?


 


 
继续阅读 »
常见问题:

1、菜单栏里的“动态”和“发现”分别是什么意思?


2、如何发帖?如何使用“话题”?


3、发帖时,“问答”和“文章”有什么区别?


 


  收起阅读 »

Sqoop从Hive导入mysql失败解决方案

 

Sqoop从Hive导入mysql语句:

sqoop export -D sqoop.export.records.per.statement=10 --connect jdbc:mysql://kks1:3306/sougou --username hive --password hive --table sougou --fields-terminated-by '\t' --export-dir "/hivedata/warehouse/sougou.db/sougou/month=6/week=1/day=1" --null-string '\\N' --null-non-string '\\N'
Sqoop从Hive导入mysql注意事项:

导入mysql前mysql必须建立和hive数据格式一致的表。

应确保mysql的数据类型长度大于相对应的hive数据的最大长度。

导入mysql前应确保相应的用户拥有远程登录MySQL的权限。

应该指定null字段的填充符。

如果之前已经导入了部分数据,需要继续导入,就必须指定更新的键。

--update-key
使用正确的分隔符。

如果你以上几点你都注意了,可能还是会遇到这个错误:

字段对不上或字段类型不一致

Caused by: java.lang.NumberFormatException: For input string: “什么是OSI参考模型?各层的主要功能是什么?] ″
出现这个问题的原因是数据本身的内容含有相应的分隔符,从而导致解析类型错位,进而解析失败。这条记录的源数据如下:

18:47:29 5999958585312108 [1. 什么是OSI参考模型?各层的主要功能是什么?] 9 68 www.eyea.net/bbs/index.php%3Fm ... %3D42
我们使用'\t'分割,所以sqoop把 什么是OSI参考模型?各层的主要功能是什么?] 当做 int类型解析,进而失败。

Sqoop从Hive导入mysql失败终极解决方案:

这个时候,我们所能做的就是修改,重新编译sqoop导入mysql解析规则的java文件。每次通过sqoop导入MySql的时,都会在sqoop目录生成一个以MySql表命名的.java文件,然后打成JAR包,给sqoop提交给hadoop 的MR来解析Hive表中的数据。那可以根据报的错误,找到对应的行,改写该文件,编译,重新打包,sqoop可以通过 -jar-file ,--class-name 组合让我们指定运行自己的jar包中的某个class。

编译打包方法如下:

javac -cp ./:/home/sqoop/sqoop-1.4.6.jar:/home/hadoop/share/hadoop/common/hadoop-common-2.6.0.jar:/home/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.0.jar sougou.java
jar -cf sougou.jar sougou.class
运行命令如下:

//hive导入mysql:

sqoop export -D sqoop.export.records.per.statement=10 --connect jdbc:mysql://kks1:3306/sougou --username hive --password hive --table sougou --fields-terminated-by '\t' --export-dir "/hivedata/warehouse/sougou.db/sougou/month=6/week=1/day=1" --null-string '\\N' --null-non-string '\\N' --jar-file /home/sqoop/sougou.jar --class-name sougou;
我们通过修改相关的java文件不仅可以解决各种解析异常,也可以实现自定义多字节列分隔符的功能。

继续阅读 »
 

Sqoop从Hive导入mysql语句:

sqoop export -D sqoop.export.records.per.statement=10 --connect jdbc:mysql://kks1:3306/sougou --username hive --password hive --table sougou --fields-terminated-by '\t' --export-dir "/hivedata/warehouse/sougou.db/sougou/month=6/week=1/day=1" --null-string '\\N' --null-non-string '\\N'
Sqoop从Hive导入mysql注意事项:

导入mysql前mysql必须建立和hive数据格式一致的表。

应确保mysql的数据类型长度大于相对应的hive数据的最大长度。

导入mysql前应确保相应的用户拥有远程登录MySQL的权限。

应该指定null字段的填充符。

如果之前已经导入了部分数据,需要继续导入,就必须指定更新的键。

--update-key
使用正确的分隔符。

如果你以上几点你都注意了,可能还是会遇到这个错误:

字段对不上或字段类型不一致

Caused by: java.lang.NumberFormatException: For input string: “什么是OSI参考模型?各层的主要功能是什么?] ″
出现这个问题的原因是数据本身的内容含有相应的分隔符,从而导致解析类型错位,进而解析失败。这条记录的源数据如下:

18:47:29 5999958585312108 [1. 什么是OSI参考模型?各层的主要功能是什么?] 9 68 www.eyea.net/bbs/index.php%3Fm ... %3D42
我们使用'\t'分割,所以sqoop把 什么是OSI参考模型?各层的主要功能是什么?] 当做 int类型解析,进而失败。

Sqoop从Hive导入mysql失败终极解决方案:

这个时候,我们所能做的就是修改,重新编译sqoop导入mysql解析规则的java文件。每次通过sqoop导入MySql的时,都会在sqoop目录生成一个以MySql表命名的.java文件,然后打成JAR包,给sqoop提交给hadoop 的MR来解析Hive表中的数据。那可以根据报的错误,找到对应的行,改写该文件,编译,重新打包,sqoop可以通过 -jar-file ,--class-name 组合让我们指定运行自己的jar包中的某个class。

编译打包方法如下:

javac -cp ./:/home/sqoop/sqoop-1.4.6.jar:/home/hadoop/share/hadoop/common/hadoop-common-2.6.0.jar:/home/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.0.jar sougou.java
jar -cf sougou.jar sougou.class
运行命令如下:

//hive导入mysql:

sqoop export -D sqoop.export.records.per.statement=10 --connect jdbc:mysql://kks1:3306/sougou --username hive --password hive --table sougou --fields-terminated-by '\t' --export-dir "/hivedata/warehouse/sougou.db/sougou/month=6/week=1/day=1" --null-string '\\N' --null-non-string '\\N' --jar-file /home/sqoop/sougou.jar --class-name sougou;
我们通过修改相关的java文件不仅可以解决各种解析异常,也可以实现自定义多字节列分隔符的功能。

收起阅读 »

Mapreduce导入导出Hbase0.98代码示例

在[button href=http://www.bcmeng.com/hbasemr/ color=red]Hadoop2.6.0|Hbase0.98.13的Mapreduce开发环境搭建[/button]一文中,我们已经成功搭建了Hadoop2.6.0|Hbase0.98.13的Mapreduce开发环境。下面小梦给大家演示一下具体代码。

1:Mapreduce从HDFS导入Hbase0.98代码示例:

源文件格式:

175.44.30.93 - - [29/Sep/2013:00:10:15 +0800] "GET /structure/heap HTTP/1.1" 301 406 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)"
java代码:

package hbase;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableOutputFormat;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class HbaseMr {

public static class MapperClass extends Mapper<LongWritable,Text,ImmutableBytesWritable,Put>{

public void map(LongWritable key,Text value,Context context)throws IOException,InterruptedException{

String[] strs = value.toString().split(" ");
String rowkey = strs[0]+"-"+strs[3].substring(1);

byte [] row = Bytes.toBytes(rowkey);
byte [] family = Bytes.toBytes("info");
byte [] qualifier = Bytes.toBytes("url");
byte [] values = Bytes.toBytes(strs[6]);
Put put=new Put(row);
put.add(family,qualifier,values);

context.write(new ImmutableBytesWritable(row),put);
}
}

public static void main(String[] args) throws Exception {

Configuration conf = HBaseConfiguration.create();
conf.set(TableOutputFormat.OUTPUT_TABLE,"access-log");
String[] otherArgs = new GenericOptionsParser(conf, args)
.getRemainingArgs();
Job job = Job.getInstance(conf, "Hbase_Mr");
job.setNumReduceTasks(0);
job.setJarByClass(HbaseMr.class);
job.setMapperClass(MapperClass.class);
job.setOutputKeyClass(ImmutableBytesWritable.class);
job.setOutputValueClass(Put.class);
job.setOutputFormatClass(TableOutputFormat.class);

FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}

}
导入Hbase效果如下:

Mapreduce导入导出Hbase0.98代码示例

2:Mapreduce从Hbase导入Hbase代码示例:

统计上张图的同一IP目录总数,代码如下:

package hbase;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;

import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableMapper;

import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;

public class HbaseMR {

final static String inTable = "access-log";
final static String inFamily = "info";
final static String inColumn = "url";

final static String outTable="total-access";
final static String outFamily="url";
final static String outColumn="count";
public static class Mapper extends TableMapper<Text,Text> {
public Mapper() {}
@Override
public void map(ImmutableBytesWritable row, Result values,Context context) throws IOException, InterruptedException {

byte [] b =values.getValue(inFamily.getBytes(), inColumn.getBytes());
if(b!=null){
String v = new String(b);

String r= new String(values.getRow());
String[] strs = r.split("-");
String ip=strs[0];

context.write(new Text(ip), new Text(v));
}
}
}

public static class Reducer extends TableReducer<Text, Text, Text> {
@Override
public void reduce(Text key,Iterable<Text> values,
Context context) throws IOException, InterruptedException {
int count=0;
String sum=null;
for (Text val : values) {
count++;
}
sum=String.valueOf(count);

Put put = new Put(Bytes.toBytes(key.toString()));

put.add(outFamily.getBytes(),outColumn.getBytes(),sum.getBytes());
context.write(key, put);
}
}

public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = HBaseConfiguration.create();

Job job = Job.getInstance(conf, "HbaseMR");
job.setJarByClass(HbaseMR.class);
Scan scan = new Scan();
TableMapReduceUtil.initTableMapperJob("access-log",scan,Mapper.class,
Text.class, Text.class, job);
TableMapReduceUtil.initTableReducerJob("total-access",Reducer.class, job);
System.exit(job.waitForCompletion(true) ? 0 : 1);

}

}
新表效果如下:

Mapreduce导入导出Hbase0.98代码示例

3:Mapreduce导入Hbase时去重:

在上面的导入hbase过程中我们并没有考虑同一IP访问的子目录重复问题,所以我们应该去重。

正常的Mapreduce去重思路:

利用经过shuffle之后输入到reduce中key的唯一性直接输出key即可。

具体就是map的输出的key为map输入的value,value为null。自然reduce的输入就是map的输出。当reduce接收到一个<key,value-list>时,其中value-list为null,就直接将key复制到输出的key中,并将value设置成空值
map端的输出:

context.write(value, NullWriteable.get());
reduce端的输出:

context.write(key, NullWriteable.get());
在Mapreduce导入Hbase时我们也可以先去重,然后再导入,不过那样会需要俩次任务。

我们可以直接在上面的reduce任务中去重即可。利用HashSet来去重。改动代码如下:

public static class Reducer extends TableReducer<Text, Text, Text> {
@Override
public void reduce(Text key,Iterable<Text> values,
Context context) throws IOException, InterruptedException {

String sum=null;
HashSet<Text> set = new HashSet<Text>();

for (Text val : values) {
set.add(val);
}

sum=String.valueOf(set.size());

Put put = new Put(Bytes.toBytes(key.toString()));

put.add(outFamily.getBytes(),outColumn.getBytes(),sum.getBytes());
context.write(key, put);
}
}
同一数据源,效果如下:

hbase mapreduce去重

大家可以发现,统计的值明显减少。
继续阅读 »
在[button href=http://www.bcmeng.com/hbasemr/ color=red]Hadoop2.6.0|Hbase0.98.13的Mapreduce开发环境搭建[/button]一文中,我们已经成功搭建了Hadoop2.6.0|Hbase0.98.13的Mapreduce开发环境。下面小梦给大家演示一下具体代码。

1:Mapreduce从HDFS导入Hbase0.98代码示例:

源文件格式:

175.44.30.93 - - [29/Sep/2013:00:10:15 +0800] "GET /structure/heap HTTP/1.1" 301 406 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)"
java代码:

package hbase;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableOutputFormat;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class HbaseMr {

public static class MapperClass extends Mapper<LongWritable,Text,ImmutableBytesWritable,Put>{

public void map(LongWritable key,Text value,Context context)throws IOException,InterruptedException{

String[] strs = value.toString().split(" ");
String rowkey = strs[0]+"-"+strs[3].substring(1);

byte [] row = Bytes.toBytes(rowkey);
byte [] family = Bytes.toBytes("info");
byte [] qualifier = Bytes.toBytes("url");
byte [] values = Bytes.toBytes(strs[6]);
Put put=new Put(row);
put.add(family,qualifier,values);

context.write(new ImmutableBytesWritable(row),put);
}
}

public static void main(String[] args) throws Exception {

Configuration conf = HBaseConfiguration.create();
conf.set(TableOutputFormat.OUTPUT_TABLE,"access-log");
String[] otherArgs = new GenericOptionsParser(conf, args)
.getRemainingArgs();
Job job = Job.getInstance(conf, "Hbase_Mr");
job.setNumReduceTasks(0);
job.setJarByClass(HbaseMr.class);
job.setMapperClass(MapperClass.class);
job.setOutputKeyClass(ImmutableBytesWritable.class);
job.setOutputValueClass(Put.class);
job.setOutputFormatClass(TableOutputFormat.class);

FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}

}
导入Hbase效果如下:

Mapreduce导入导出Hbase0.98代码示例

2:Mapreduce从Hbase导入Hbase代码示例:

统计上张图的同一IP目录总数,代码如下:

package hbase;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;

import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableMapper;

import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;

public class HbaseMR {

final static String inTable = "access-log";
final static String inFamily = "info";
final static String inColumn = "url";

final static String outTable="total-access";
final static String outFamily="url";
final static String outColumn="count";
public static class Mapper extends TableMapper<Text,Text> {
public Mapper() {}
@Override
public void map(ImmutableBytesWritable row, Result values,Context context) throws IOException, InterruptedException {

byte [] b =values.getValue(inFamily.getBytes(), inColumn.getBytes());
if(b!=null){
String v = new String(b);

String r= new String(values.getRow());
String[] strs = r.split("-");
String ip=strs[0];

context.write(new Text(ip), new Text(v));
}
}
}

public static class Reducer extends TableReducer<Text, Text, Text> {
@Override
public void reduce(Text key,Iterable<Text> values,
Context context) throws IOException, InterruptedException {
int count=0;
String sum=null;
for (Text val : values) {
count++;
}
sum=String.valueOf(count);

Put put = new Put(Bytes.toBytes(key.toString()));

put.add(outFamily.getBytes(),outColumn.getBytes(),sum.getBytes());
context.write(key, put);
}
}

public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = HBaseConfiguration.create();

Job job = Job.getInstance(conf, "HbaseMR");
job.setJarByClass(HbaseMR.class);
Scan scan = new Scan();
TableMapReduceUtil.initTableMapperJob("access-log",scan,Mapper.class,
Text.class, Text.class, job);
TableMapReduceUtil.initTableReducerJob("total-access",Reducer.class, job);
System.exit(job.waitForCompletion(true) ? 0 : 1);

}

}
新表效果如下:

Mapreduce导入导出Hbase0.98代码示例

3:Mapreduce导入Hbase时去重:

在上面的导入hbase过程中我们并没有考虑同一IP访问的子目录重复问题,所以我们应该去重。

正常的Mapreduce去重思路:

利用经过shuffle之后输入到reduce中key的唯一性直接输出key即可。

具体就是map的输出的key为map输入的value,value为null。自然reduce的输入就是map的输出。当reduce接收到一个<key,value-list>时,其中value-list为null,就直接将key复制到输出的key中,并将value设置成空值
map端的输出:

context.write(value, NullWriteable.get());
reduce端的输出:

context.write(key, NullWriteable.get());
在Mapreduce导入Hbase时我们也可以先去重,然后再导入,不过那样会需要俩次任务。

我们可以直接在上面的reduce任务中去重即可。利用HashSet来去重。改动代码如下:

public static class Reducer extends TableReducer<Text, Text, Text> {
@Override
public void reduce(Text key,Iterable<Text> values,
Context context) throws IOException, InterruptedException {

String sum=null;
HashSet<Text> set = new HashSet<Text>();

for (Text val : values) {
set.add(val);
}

sum=String.valueOf(set.size());

Put put = new Put(Bytes.toBytes(key.toString()));

put.add(outFamily.getBytes(),outColumn.getBytes(),sum.getBytes());
context.write(key, put);
}
}
同一数据源,效果如下:

hbase mapreduce去重

大家可以发现,统计的值明显减少。
收起阅读 »

Hadoop2.6.0|Hbase0.98.13的Mapreduce开发环境搭建

在[button href=http://www.bcmeng.com/hadoop-zookeeper-hbase/ color=red]阿里ECSHadoop2.6.0|Zookeeper3.4.6|Hbase0.98.13集群搭建[/button]一文中我们已经搭建了Hadoop和Hbase集群,但是还是无法运行Hbase Mapreduce 任务。我们运行Mapreduce 任务时会遇到许多java.lang.ClassNotFoundException。这个问题是因为Hadoop classpath中没有hbase的相关jar包,所以我们可以将hbase的相关jar包导入Hadoop的classpath中。同时为了避免以后一些不确定错误的发生,我们应该将hbase的lib的Hadoop的2.2.0版本的jar包替换为Hadoop的2.6.0的jar包。所以,为了搭建好完整健全的hbase的Mapreduce 开发环境,我们需要以下3步:

1:用Hadoop2.6.0的jar包替换掉Hbase的lib下Hadoop相关j ar包

cd /home/hbase/lib
vim f.sh
find -name "hadoop*jar" | sed 's/2.2.0/2.6.0/g' | sed 's/\.\///g' > f.log
rm ./hadoop*jar
cat ./f.log | while read Line
do
find /home/hadoop/share/hadoop -name "$Line" | xargs -i cp {} ./
done
rm ./f.log
chmod u+x f.sh
./f.sh
rm -f f.sh

cp /home/hadoop/share/hadoop/common/lib/htrace-core-3.0.4.jar /home/hbase/lib
替换完成后,Hbase的lib目录如下:

activation-1.1.jar
aopalliance-1.0.jar
asm-3.1.jar
avro-1.7.4.jar
commons-beanutils-1.7.0.jar
commons-beanutils-core-1.8.0.jar
commons-cli-1.2.jar
commons-codec-1.7.jar
commons-collections-3.2.1.jar
commons-compress-1.4.1.jar
commons-configuration-1.6.jar
commons-daemon-1.0.13.jar
commons-digester-1.8.jar
commons-el-1.0.jar
commons-httpclient-3.1.jar
commons-io-2.4.jar
commons-lang-2.6.jar
commons-logging-1.1.1.jar
commons-math-2.1.jar
commons-net-3.1.jar
findbugs-annotations-1.3.9-1.jar
gmbal-api-only-3.0.0-b023.jar
grizzly-framework-2.1.2.jar
grizzly-http-2.1.2.jar
grizzly-http-server-2.1.2.jar
grizzly-http-servlet-2.1.2.jar
grizzly-rcm-2.1.2.jar
guava-12.0.1.jar
guice-3.0.jar
guice-servlet-3.0.jar
hadoop-annotations-2.6.0.jar
hadoop-auth-2.6.0.jar
hadoop-common-2.6.0.jar
hadoop-hdfs-2.6.0.jar
hadoop-mapreduce-client-app-2.6.0.jar
hadoop-mapreduce-client-common-2.6.0.jar
hadoop-mapreduce-client-core-2.6.0.jar
hadoop-mapreduce-client-jobclient-2.6.0.jar
hadoop-mapreduce-client-shuffle-2.6.0.jar
hadoop-yarn-api-2.6.0.jar
hadoop-yarn-client-2.6.0.jar
hadoop-yarn-common-2.6.0.jar
hadoop-yarn-server-common-2.6.0.jar
hadoop-yarn-server-nodemanager-2.6.0.jar
hamcrest-core-1.3.jar
hbase-annotations-0.98.13-hadoop2.jar
hbase-checkstyle-0.98.13-hadoop2.jar
hbase-client-0.98.13-hadoop2.jar
hbase-common-0.98.13-hadoop2.jar
hbase-common-0.98.13-hadoop2-tests.jar
hbase-examples-0.98.13-hadoop2.jar
hbase-hadoop2-compat-0.98.13-hadoop2.jar
hbase-hadoop-compat-0.98.13-hadoop2.jar
hbase-it-0.98.13-hadoop2.jar
hbase-it-0.98.13-hadoop2-tests.jar
hbase-prefix-tree-0.98.13-hadoop2.jar
hbase-protocol-0.98.13-hadoop2.jar
hbase-rest-0.98.13-hadoop2.jar
hbase-server-0.98.13-hadoop2.jar
hbase-server-0.98.13-hadoop2-tests.jar
hbase-shell-0.98.13-hadoop2.jar
hbase-testing-util-0.98.13-hadoop2.jar
hbase-thrift-0.98.13-hadoop2.jar
high-scale-lib-1.1.1.jar
htrace-core-2.04.jar
htrace-core-3.0.4.jar
httpclient-4.1.3.jar
httpcore-4.1.3.jar
jackson-core-asl-1.8.8.jar
jackson-jaxrs-1.8.8.jar
jackson-mapper-asl-1.8.8.jar
jackson-xc-1.8.8.jar
jamon-runtime-2.3.1.jar
jasper-compiler-5.5.23.jar
jasper-runtime-5.5.23.jar
javax.inject-1.jar
javax.servlet-3.1.jar
javax.servlet-api-3.0.1.jar
jaxb-api-2.2.2.jar
jaxb-impl-2.2.3-1.jar
jcodings-1.0.8.jar
jersey-client-1.8.jar
jersey-core-1.8.jar
jersey-grizzly2-1.9.jar
jersey-guice-1.9.jar
jersey-json-1.8.jar
jersey-server-1.8.jar
jersey-test-framework-core-1.9.jar
jersey-test-framework-grizzly2-1.9.jar
jets3t-0.6.1.jar
jettison-1.3.1.jar
jetty-6.1.26.jar
jetty-sslengine-6.1.26.jar
jetty-util-6.1.26.jar
joni-2.1.2.jar
jruby-complete-1.6.8.jar
jsch-0.1.42.jar
jsp-2.1-6.1.14.jar
jsp-api-2.1-6.1.14.jar
jsr305-1.3.9.jar
junit-4.11.jar
libthrift-0.9.0.jar
log4j-1.2.17.jar
management-api-3.0.0-b012.jar
metrics-core-2.2.0.jar
netty-3.6.6.Final.jar
paranamer-2.3.jar
protobuf-java-2.5.0.jar
ruby
servlet-api-2.5-6.1.14.jar
slf4j-api-1.6.4.jar
snappy-java-1.0.4.1.jar
xmlenc-0.52.jar
xz-1.0.jar
zookeeper-3.4.6.jar
2:将Hbase的相关jar包导入Hadoop的classpath:

cp /home/hbase/lib/hbase-*.jar /home/hadoop/share/hadoop/common

cp /home/hbase/lib/htrace-*.jar /home/hadoop/share/hadoop/common

cp /home/hbase/lib/high-scale-lib-1.1.1.jar /home/hadoop/share/hadoop/common

cp /home/hbase/lib/metrics-core-2.2.0.jar /home/hadoop/share/hadoop/common

cp /home/hbase/conf/hbase-site.xml /home/hadoop/etc/hadoop
注:以上包均为必须jar包。如果没有high-scale-lib-1.1.1.jar和metrics-core-2.2.0.jarHadoop只可以将mapreduce导入hbase,但是无法使用TableMapReduceUtil将hbase导入mapreduce.

完成后/home/hadoop/share/hadoop/common如下:

hadoop-common-2.6.0.jar hbase-rest-0.98.13-hadoop2.jar
hadoop-common-2.6.0-tests.jar hbase-server-0.98.13-hadoop2.jar
hadoop-nfs-2.6.0.jar hbase-server-0.98.13-hadoop2-tests.jar
hbase-annotations-0.98.13-hadoop2.jar hbase-shell-0.98.13-hadoop2.jar
hbase-checkstyle-0.98.13-hadoop2.jar hbase-testing-util-0.98.13-hadoop2.jar
hbase-client-0.98.13-hadoop2.jar hbase-thrift-0.98.13-hadoop2.jar
hbase-common-0.98.13-hadoop2.jar high-scale-lib-1.1.1.jar
hbase-common-0.98.13-hadoop2-tests.jar htrace-core-2.04.jar
hbase-examples-0.98.13-hadoop2.jar htrace-core-3.0.4.jar
hbase-hadoop2-compat-0.98.13-hadoop2.jar jdiff
hbase-hadoop-compat-0.98.13-hadoop2.jar lib
hbase-it-0.98.13-hadoop2.jar metrics-core-2.2.0.jar
hbase-it-0.98.13-hadoop2-tests.jar sources
hbase-prefix-tree-0.98.13-hadoop2.jar templates
hbase-protocol-0.98.13-hadoop2.jar
然后重启启动hadoop 和hbase集群即可。

3:配置eclipse的Hbase的mapreduce的 maven开发环境:

图形界面安装:
安装
yum groupinstall "Desktop"
yum install xrdp
yum install tigervnc-server
service xrdp start
service xrdp restart

eclipse安装:

wget http://www.eclipse.org/downloa ... D1071

桌面上右键创建启动器
浏览eclipse路径
点击图标 进入到eclipse根目录下
即可将eclipse添加到桌面
远程登录kks1,在eclipse建立maven项目。配置pom.xml如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/ma ... gt%3B
<modelVersion>4.0.0</modelVersion>
<groupId>com.kks</groupId>
<artifactId>hbase</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hbase</name>
<description>hbase test</description>
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>0.98.13-hadoop2</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>0.98.13-hadoop2</version>
</dependency>
</dependencies>
</project>
就可以正常开发mapreduce程序。编写完成后将到处jar包。按如下方式运行即可:

hadoop jar job.jar hbase.HbaseScanRow 后面可以添加参数
具体如何将利用mapreduce将hbase导入导入,请看下文:

[button href=http://www.bcmeng.com/hbasemrdemo color=red]Mapreduce导入导出Hbase0.98代码示例[/button]
继续阅读 »
在[button href=http://www.bcmeng.com/hadoop-zookeeper-hbase/ color=red]阿里ECSHadoop2.6.0|Zookeeper3.4.6|Hbase0.98.13集群搭建[/button]一文中我们已经搭建了Hadoop和Hbase集群,但是还是无法运行Hbase Mapreduce 任务。我们运行Mapreduce 任务时会遇到许多java.lang.ClassNotFoundException。这个问题是因为Hadoop classpath中没有hbase的相关jar包,所以我们可以将hbase的相关jar包导入Hadoop的classpath中。同时为了避免以后一些不确定错误的发生,我们应该将hbase的lib的Hadoop的2.2.0版本的jar包替换为Hadoop的2.6.0的jar包。所以,为了搭建好完整健全的hbase的Mapreduce 开发环境,我们需要以下3步:

1:用Hadoop2.6.0的jar包替换掉Hbase的lib下Hadoop相关j ar包

cd /home/hbase/lib
vim f.sh
find -name "hadoop*jar" | sed 's/2.2.0/2.6.0/g' | sed 's/\.\///g' > f.log
rm ./hadoop*jar
cat ./f.log | while read Line
do
find /home/hadoop/share/hadoop -name "$Line" | xargs -i cp {} ./
done
rm ./f.log
chmod u+x f.sh
./f.sh
rm -f f.sh

cp /home/hadoop/share/hadoop/common/lib/htrace-core-3.0.4.jar /home/hbase/lib
替换完成后,Hbase的lib目录如下:

activation-1.1.jar
aopalliance-1.0.jar
asm-3.1.jar
avro-1.7.4.jar
commons-beanutils-1.7.0.jar
commons-beanutils-core-1.8.0.jar
commons-cli-1.2.jar
commons-codec-1.7.jar
commons-collections-3.2.1.jar
commons-compress-1.4.1.jar
commons-configuration-1.6.jar
commons-daemon-1.0.13.jar
commons-digester-1.8.jar
commons-el-1.0.jar
commons-httpclient-3.1.jar
commons-io-2.4.jar
commons-lang-2.6.jar
commons-logging-1.1.1.jar
commons-math-2.1.jar
commons-net-3.1.jar
findbugs-annotations-1.3.9-1.jar
gmbal-api-only-3.0.0-b023.jar
grizzly-framework-2.1.2.jar
grizzly-http-2.1.2.jar
grizzly-http-server-2.1.2.jar
grizzly-http-servlet-2.1.2.jar
grizzly-rcm-2.1.2.jar
guava-12.0.1.jar
guice-3.0.jar
guice-servlet-3.0.jar
hadoop-annotations-2.6.0.jar
hadoop-auth-2.6.0.jar
hadoop-common-2.6.0.jar
hadoop-hdfs-2.6.0.jar
hadoop-mapreduce-client-app-2.6.0.jar
hadoop-mapreduce-client-common-2.6.0.jar
hadoop-mapreduce-client-core-2.6.0.jar
hadoop-mapreduce-client-jobclient-2.6.0.jar
hadoop-mapreduce-client-shuffle-2.6.0.jar
hadoop-yarn-api-2.6.0.jar
hadoop-yarn-client-2.6.0.jar
hadoop-yarn-common-2.6.0.jar
hadoop-yarn-server-common-2.6.0.jar
hadoop-yarn-server-nodemanager-2.6.0.jar
hamcrest-core-1.3.jar
hbase-annotations-0.98.13-hadoop2.jar
hbase-checkstyle-0.98.13-hadoop2.jar
hbase-client-0.98.13-hadoop2.jar
hbase-common-0.98.13-hadoop2.jar
hbase-common-0.98.13-hadoop2-tests.jar
hbase-examples-0.98.13-hadoop2.jar
hbase-hadoop2-compat-0.98.13-hadoop2.jar
hbase-hadoop-compat-0.98.13-hadoop2.jar
hbase-it-0.98.13-hadoop2.jar
hbase-it-0.98.13-hadoop2-tests.jar
hbase-prefix-tree-0.98.13-hadoop2.jar
hbase-protocol-0.98.13-hadoop2.jar
hbase-rest-0.98.13-hadoop2.jar
hbase-server-0.98.13-hadoop2.jar
hbase-server-0.98.13-hadoop2-tests.jar
hbase-shell-0.98.13-hadoop2.jar
hbase-testing-util-0.98.13-hadoop2.jar
hbase-thrift-0.98.13-hadoop2.jar
high-scale-lib-1.1.1.jar
htrace-core-2.04.jar
htrace-core-3.0.4.jar
httpclient-4.1.3.jar
httpcore-4.1.3.jar
jackson-core-asl-1.8.8.jar
jackson-jaxrs-1.8.8.jar
jackson-mapper-asl-1.8.8.jar
jackson-xc-1.8.8.jar
jamon-runtime-2.3.1.jar
jasper-compiler-5.5.23.jar
jasper-runtime-5.5.23.jar
javax.inject-1.jar
javax.servlet-3.1.jar
javax.servlet-api-3.0.1.jar
jaxb-api-2.2.2.jar
jaxb-impl-2.2.3-1.jar
jcodings-1.0.8.jar
jersey-client-1.8.jar
jersey-core-1.8.jar
jersey-grizzly2-1.9.jar
jersey-guice-1.9.jar
jersey-json-1.8.jar
jersey-server-1.8.jar
jersey-test-framework-core-1.9.jar
jersey-test-framework-grizzly2-1.9.jar
jets3t-0.6.1.jar
jettison-1.3.1.jar
jetty-6.1.26.jar
jetty-sslengine-6.1.26.jar
jetty-util-6.1.26.jar
joni-2.1.2.jar
jruby-complete-1.6.8.jar
jsch-0.1.42.jar
jsp-2.1-6.1.14.jar
jsp-api-2.1-6.1.14.jar
jsr305-1.3.9.jar
junit-4.11.jar
libthrift-0.9.0.jar
log4j-1.2.17.jar
management-api-3.0.0-b012.jar
metrics-core-2.2.0.jar
netty-3.6.6.Final.jar
paranamer-2.3.jar
protobuf-java-2.5.0.jar
ruby
servlet-api-2.5-6.1.14.jar
slf4j-api-1.6.4.jar
snappy-java-1.0.4.1.jar
xmlenc-0.52.jar
xz-1.0.jar
zookeeper-3.4.6.jar
2:将Hbase的相关jar包导入Hadoop的classpath:

cp /home/hbase/lib/hbase-*.jar /home/hadoop/share/hadoop/common

cp /home/hbase/lib/htrace-*.jar /home/hadoop/share/hadoop/common

cp /home/hbase/lib/high-scale-lib-1.1.1.jar /home/hadoop/share/hadoop/common

cp /home/hbase/lib/metrics-core-2.2.0.jar /home/hadoop/share/hadoop/common

cp /home/hbase/conf/hbase-site.xml /home/hadoop/etc/hadoop
注:以上包均为必须jar包。如果没有high-scale-lib-1.1.1.jar和metrics-core-2.2.0.jarHadoop只可以将mapreduce导入hbase,但是无法使用TableMapReduceUtil将hbase导入mapreduce.

完成后/home/hadoop/share/hadoop/common如下:

hadoop-common-2.6.0.jar hbase-rest-0.98.13-hadoop2.jar
hadoop-common-2.6.0-tests.jar hbase-server-0.98.13-hadoop2.jar
hadoop-nfs-2.6.0.jar hbase-server-0.98.13-hadoop2-tests.jar
hbase-annotations-0.98.13-hadoop2.jar hbase-shell-0.98.13-hadoop2.jar
hbase-checkstyle-0.98.13-hadoop2.jar hbase-testing-util-0.98.13-hadoop2.jar
hbase-client-0.98.13-hadoop2.jar hbase-thrift-0.98.13-hadoop2.jar
hbase-common-0.98.13-hadoop2.jar high-scale-lib-1.1.1.jar
hbase-common-0.98.13-hadoop2-tests.jar htrace-core-2.04.jar
hbase-examples-0.98.13-hadoop2.jar htrace-core-3.0.4.jar
hbase-hadoop2-compat-0.98.13-hadoop2.jar jdiff
hbase-hadoop-compat-0.98.13-hadoop2.jar lib
hbase-it-0.98.13-hadoop2.jar metrics-core-2.2.0.jar
hbase-it-0.98.13-hadoop2-tests.jar sources
hbase-prefix-tree-0.98.13-hadoop2.jar templates
hbase-protocol-0.98.13-hadoop2.jar
然后重启启动hadoop 和hbase集群即可。

3:配置eclipse的Hbase的mapreduce的 maven开发环境:

图形界面安装:
安装
yum groupinstall "Desktop"
yum install xrdp
yum install tigervnc-server
service xrdp start
service xrdp restart

eclipse安装:

wget http://www.eclipse.org/downloa ... D1071

桌面上右键创建启动器
浏览eclipse路径
点击图标 进入到eclipse根目录下
即可将eclipse添加到桌面
远程登录kks1,在eclipse建立maven项目。配置pom.xml如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/ma ... gt%3B
<modelVersion>4.0.0</modelVersion>
<groupId>com.kks</groupId>
<artifactId>hbase</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hbase</name>
<description>hbase test</description>
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>0.98.13-hadoop2</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>0.98.13-hadoop2</version>
</dependency>
</dependencies>
</project>
就可以正常开发mapreduce程序。编写完成后将到处jar包。按如下方式运行即可:

hadoop jar job.jar hbase.HbaseScanRow 后面可以添加参数
具体如何将利用mapreduce将hbase导入导入,请看下文:

[button href=http://www.bcmeng.com/hbasemrdemo color=red]Mapreduce导入导出Hbase0.98代码示例[/button]
收起阅读 »

Hadoop2.6.0|Zookeeper3.4.6|Hbase0.98.13集群搭建

今天小梦从阿里云ECS裸机开始给大家一步一步演示一下Hadoop2.6.0|Zookeeper3.4.6|Hbase;0.98.13集群搭建。

我的集群情况如下:

120.24.83.53 10.169.132.145 kks1 namenode hmatser zookeeper ResourceManager

120.24.50.76 10.45.162.55 kks2 datanode regionserver zookeeper NodeManager

120.24.50.27 10.45.162.0 kks3 datanode regionserver zookeeper NodeManager SecondaryNameNode

120.24.51.109 10.45.165.59 kks4 datanode regionserver NodeManager
1:修改hostname

vim /etc/sysconfig/network
修改:HOSTNAME=kks1
sudo hostname kks1

重启即可。
2:挂载数据盘

fdisk -l
fdisk /dev/xvdb
依次输入“n”,“p” “1”,两次回车,“wq"
fdisk -l

mkfs.ext3 /dev/xvdb1
echo '/dev/xvdb1 /mnt ext3 defaults 0 0' >> /etc/fstab
mount -a
df -h


3:修改/etc/hosts

vim /etc/hosts
10.169.132.145 kks1
10.45.162.55 kks2
10.45.162.0 kks3
10.45.165.59 kks4
4:SSH免密码登录:

A为本地主机(即用于控制其他主机的机器) ;
B为远程主机(即被控制的机器Server), 假如ip为172.24.253.2 ;
A和B的系统都是Linux

在A上的命令:
# ssh-keygen -t rsa (连续三次回车,即在本地生成了公钥和私钥,不设置密码)
# ssh root@172.24.253.2 "mkdir .ssh;chmod 0700 .ssh" (需要输入密码, 注:必须将.ssh的权限设为700)
# scp ~/.ssh/id_rsa.pub root@172.24.253.2:.ssh/id_rsa.pub (需要输入密码)

ssh root@kks1 "mkdir .ssh;chmod 0700 .ssh"
scp ~/.ssh/id_rsa.pub root@kks1:.ssh/id_rsa.pub
在B上的命令:
# touch /root/.ssh/authorized_keys (如果已经存在这个文件, 跳过这条)
# chmod 600 ~/.ssh/authorized_keys (# 注意: 必须将~/.ssh/authorized_keys的权限改为600, 该文件用于保存ssh客户端生成的公钥,可以修改服务器的ssh服务端配置文件/etc/ssh/sshd_config来指定其他文件名)
# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys (将id_rsa.pub的内容追加到 authorized_keys 中, 注意不要用 > ,否则会清空原有的内容,使其他人无法使用原有的密钥登录)
5:安装JDK1.7:

yum install java-1.7.0-openjdk-devel.x86_64 -y
6:安装maven:(只在kks1节点上安装即可)

wget http://ftp.tsukuba.wide.ad.jp/ ... ar.gz
maven下载到home目录下,则运行:
echo export PATH='$PATH':/home/maven/bin >> /etc/profile
配置好环境变量后,运行:source /etc/profile
运行:mvn --version,如系统打印maven版本信息,则配置成功
7:下载Hadoop:

wget http://apache.cs.utah.edu/hado ... ar.gz
8:修改hadoop-env.sh

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79.x86_64
export HADOOP_PID_DIR=/var/hadoop/pids
注1:为了避免以后 sbin/stop-dfs.sh等命令失效,强烈建议设置HADOOP_PID_DIR

注2:以后所有配置的目录尽量在启动集群前都建立好。

9:core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://kks1:8020</value>
</property>
</configuration>
10:hdfs-site.xml

<configuration>

<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/hadoop/hdfs/name</value>
</property>

<property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/hadoop/hdfs/data</value>
</property>

<property>
<name>dfs.namenode.secondary.http-address</name>
<value>kks3:9001</value>
</property>

</configuration>
11:yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
<property>
<description>The hostname of the RM.</description>
<name>yarn.resourcemanager.hostname</name>
<value>kks1</value>
</property>

<property>
<description>The address of the applications manager interface in the RM.</description>
<name>yarn.resourcemanager.address</name>
<value>${yarn.resourcemanager.hostname}:8032</value>
</property>

<property>
<description>The address of the scheduler interface.</description>
<name>yarn.resourcemanager.scheduler.address</name>
<value>${yarn.resourcemanager.hostname}:8030</value>
</property>

<property>
<description>The http address of the RM web application.</description>
<name>yarn.resourcemanager.webapp.address</name>
<value>${yarn.resourcemanager.hostname}:8088</value>
</property>

<property>
<description>The https adddress of the RM web application.</description>
<name>yarn.resourcemanager.webapp.https.address</name>
<value>${yarn.resourcemanager.hostname}:8090</value>
</property>

<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>${yarn.resourcemanager.hostname}:8031</value>
</property>

<property>
<description>The address of the RM admin interface.</description>
<name>yarn.resourcemanager.admin.address</name>
<value>${yarn.resourcemanager.hostname}:8033</value>
</property>

<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

<property>
<name>yarn.scheduler.fair.allocation.file</name>
<value>/home/hadoop/etc/hadoop/fairscheduler.xml</value>
</property>

<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/home/hadoop/yarn/local</value>
</property>

<property>
<description>Whether to enable log aggregation</description>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>

<property>
<description>Where to aggregate logs to.</description>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
</property>

<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>30720</value>
</property>

<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>12</value>
</property>

<property>
<description>the valid service name should only contain a-zA-Z0-9_ and can not start with numbers</description>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
12:mapred-site.xml

<configuration>

<!-- MR YARN Application properties -->

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

<!-- jobhistory properties -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>kks2:10020</value>
<description>MapReduce JobHistory Server IPC host:port</description>
</property>

<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>kks2:19888</value>
<description>MapReduce JobHistory Server Web UI host:port</description>
</property>

</configuration>
13:slaves

kks2
kks3
kks4
14:fairscheduler.xml

<?xml version="1.0"?>
<allocations>

<queue name="infrastructure">
<minResources>102400 mb, 50 vcores </minResources>
<maxResources>153600 mb, 100 vcores </maxResources>
<maxRunningApps>200</maxRunningApps>
<minSharePreemptionTimeout>300</minSharePreemptionTimeout>
<weight>1.0</weight>
<aclSubmitApps>root,yarn,search,hdfs</aclSubmitApps>
</queue>

<queue name="tool">
<minResources>102400 mb, 30 vcores</minResources>
<maxResources>153600 mb, 50 vcores</maxResources>
</queue>

<queue name="sentiment">
<minResources>102400 mb, 30 vcores</minResources>
<maxResources>153600 mb, 50 vcores</maxResources>
</queue>

</allocations>
15:yarn-env.sh

export YARN_PID_DIR=/var/hadoop/pids

16:复制到其余主机

scp -r hadoop root@kks2:/home
scp -r hadoop root@kks3:/home
scp -r hadoop root@kks4:/home
17:启动集群

注意:所有操作均在Hadoop部署目录下进行。

在kks1上,对其进行格式化,并启动:
bin/hdfs namenode -format

sbin/hadoop-daemon.sh start namenode

在kks1上,启动所有datanode
sbin/hadoop-daemons.sh start datanode

启动YARN:
sbin/start-yarn.sh

至此,Hadoop 搭建完毕。 可用jps命令查看jvm进程。

以后关闭,停闭集群可以使用以下命令:

sbin/stop-dfs.sh

sbin/start-dfs.sh

sbin/start-yarn.sh

sbin/stop-yarn.sh
18:zookeeper安装:

wget http://mirrors.cnnic.cn/apache ... ar.gz

tar -zvxf zookeeper-..jar
cd zookeeper 目录
mkdir data
mkdir datalog
19:在data目录下创建myid文件

在kks1,kks2,kks3上依次为1,2,3。

20:在conf目录下建立zoo.cfg文件

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/home/zookeeper/data
dataLogDir=/home/zookeeper/datalog
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/do ... nance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=kks1:2888:3888
server.2=kks2:2888:3888
server.3=kks3:2888:3888
21:在每个节点上启动zookeeper

bin/zkServer.sh stop
bin/zkServer.sh start
bin/zkServer.sh status 查看节点状态
至此zookeeper安装成功。

22:Hbase安装

wget http://mirrors.koehn.com/apach ... ar.gz
23:hbase-env.sh

vim hbase-env.sh
export HBASE_MANAGES_ZK=false
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79.x86_64
export HBASE_PID_DIR=/var/hadoop/pids
24:hbase-site.xml

<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://kks1:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>kks1,kks2,kks3</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>120000</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hbase/data</value>
</property>
</configuration>
25:regionservers

kks2
kks3
kks4
26:复制到其他节点

scp -r hbase root@kks4:/home
27:启动集群

bin/start-hbase.sh

bin/stop-hbase.sh
至此hbase集群搭建完毕。

但是hbase的编程环境还远没有完成。请看下文:

[button href=http://www.bcmeng.com/hbasemr color=red]Hadoop2.6.0|Hbase0.98.13的Mapreduce编程环境搭建[/button]
继续阅读 »
今天小梦从阿里云ECS裸机开始给大家一步一步演示一下Hadoop2.6.0|Zookeeper3.4.6|Hbase;0.98.13集群搭建。

我的集群情况如下:

120.24.83.53 10.169.132.145 kks1 namenode hmatser zookeeper ResourceManager

120.24.50.76 10.45.162.55 kks2 datanode regionserver zookeeper NodeManager

120.24.50.27 10.45.162.0 kks3 datanode regionserver zookeeper NodeManager SecondaryNameNode

120.24.51.109 10.45.165.59 kks4 datanode regionserver NodeManager
1:修改hostname

vim /etc/sysconfig/network
修改:HOSTNAME=kks1
sudo hostname kks1

重启即可。
2:挂载数据盘

fdisk -l
fdisk /dev/xvdb
依次输入“n”,“p” “1”,两次回车,“wq"
fdisk -l

mkfs.ext3 /dev/xvdb1
echo '/dev/xvdb1 /mnt ext3 defaults 0 0' >> /etc/fstab
mount -a
df -h


3:修改/etc/hosts

vim /etc/hosts
10.169.132.145 kks1
10.45.162.55 kks2
10.45.162.0 kks3
10.45.165.59 kks4
4:SSH免密码登录:

A为本地主机(即用于控制其他主机的机器) ;
B为远程主机(即被控制的机器Server), 假如ip为172.24.253.2 ;
A和B的系统都是Linux

在A上的命令:
# ssh-keygen -t rsa (连续三次回车,即在本地生成了公钥和私钥,不设置密码)
# ssh root@172.24.253.2 "mkdir .ssh;chmod 0700 .ssh" (需要输入密码, 注:必须将.ssh的权限设为700)
# scp ~/.ssh/id_rsa.pub root@172.24.253.2:.ssh/id_rsa.pub (需要输入密码)

ssh root@kks1 "mkdir .ssh;chmod 0700 .ssh"
scp ~/.ssh/id_rsa.pub root@kks1:.ssh/id_rsa.pub
在B上的命令:
# touch /root/.ssh/authorized_keys (如果已经存在这个文件, 跳过这条)
# chmod 600 ~/.ssh/authorized_keys (# 注意: 必须将~/.ssh/authorized_keys的权限改为600, 该文件用于保存ssh客户端生成的公钥,可以修改服务器的ssh服务端配置文件/etc/ssh/sshd_config来指定其他文件名)
# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys (将id_rsa.pub的内容追加到 authorized_keys 中, 注意不要用 > ,否则会清空原有的内容,使其他人无法使用原有的密钥登录)
5:安装JDK1.7:

yum install java-1.7.0-openjdk-devel.x86_64 -y
6:安装maven:(只在kks1节点上安装即可)

wget http://ftp.tsukuba.wide.ad.jp/ ... ar.gz
maven下载到home目录下,则运行:
echo export PATH='$PATH':/home/maven/bin >> /etc/profile
配置好环境变量后,运行:source /etc/profile
运行:mvn --version,如系统打印maven版本信息,则配置成功
7:下载Hadoop:

wget http://apache.cs.utah.edu/hado ... ar.gz
8:修改hadoop-env.sh

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79.x86_64
export HADOOP_PID_DIR=/var/hadoop/pids
注1:为了避免以后 sbin/stop-dfs.sh等命令失效,强烈建议设置HADOOP_PID_DIR

注2:以后所有配置的目录尽量在启动集群前都建立好。

9:core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://kks1:8020</value>
</property>
</configuration>
10:hdfs-site.xml

<configuration>

<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/hadoop/hdfs/name</value>
</property>

<property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/hadoop/hdfs/data</value>
</property>

<property>
<name>dfs.namenode.secondary.http-address</name>
<value>kks3:9001</value>
</property>

</configuration>
11:yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
<property>
<description>The hostname of the RM.</description>
<name>yarn.resourcemanager.hostname</name>
<value>kks1</value>
</property>

<property>
<description>The address of the applications manager interface in the RM.</description>
<name>yarn.resourcemanager.address</name>
<value>${yarn.resourcemanager.hostname}:8032</value>
</property>

<property>
<description>The address of the scheduler interface.</description>
<name>yarn.resourcemanager.scheduler.address</name>
<value>${yarn.resourcemanager.hostname}:8030</value>
</property>

<property>
<description>The http address of the RM web application.</description>
<name>yarn.resourcemanager.webapp.address</name>
<value>${yarn.resourcemanager.hostname}:8088</value>
</property>

<property>
<description>The https adddress of the RM web application.</description>
<name>yarn.resourcemanager.webapp.https.address</name>
<value>${yarn.resourcemanager.hostname}:8090</value>
</property>

<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>${yarn.resourcemanager.hostname}:8031</value>
</property>

<property>
<description>The address of the RM admin interface.</description>
<name>yarn.resourcemanager.admin.address</name>
<value>${yarn.resourcemanager.hostname}:8033</value>
</property>

<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

<property>
<name>yarn.scheduler.fair.allocation.file</name>
<value>/home/hadoop/etc/hadoop/fairscheduler.xml</value>
</property>

<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/home/hadoop/yarn/local</value>
</property>

<property>
<description>Whether to enable log aggregation</description>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>

<property>
<description>Where to aggregate logs to.</description>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
</property>

<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>30720</value>
</property>

<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>12</value>
</property>

<property>
<description>the valid service name should only contain a-zA-Z0-9_ and can not start with numbers</description>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
12:mapred-site.xml

<configuration>

<!-- MR YARN Application properties -->

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

<!-- jobhistory properties -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>kks2:10020</value>
<description>MapReduce JobHistory Server IPC host:port</description>
</property>

<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>kks2:19888</value>
<description>MapReduce JobHistory Server Web UI host:port</description>
</property>

</configuration>
13:slaves

kks2
kks3
kks4
14:fairscheduler.xml

<?xml version="1.0"?>
<allocations>

<queue name="infrastructure">
<minResources>102400 mb, 50 vcores </minResources>
<maxResources>153600 mb, 100 vcores </maxResources>
<maxRunningApps>200</maxRunningApps>
<minSharePreemptionTimeout>300</minSharePreemptionTimeout>
<weight>1.0</weight>
<aclSubmitApps>root,yarn,search,hdfs</aclSubmitApps>
</queue>

<queue name="tool">
<minResources>102400 mb, 30 vcores</minResources>
<maxResources>153600 mb, 50 vcores</maxResources>
</queue>

<queue name="sentiment">
<minResources>102400 mb, 30 vcores</minResources>
<maxResources>153600 mb, 50 vcores</maxResources>
</queue>

</allocations>
15:yarn-env.sh

export YARN_PID_DIR=/var/hadoop/pids

16:复制到其余主机

scp -r hadoop root@kks2:/home
scp -r hadoop root@kks3:/home
scp -r hadoop root@kks4:/home
17:启动集群

注意:所有操作均在Hadoop部署目录下进行。

在kks1上,对其进行格式化,并启动:
bin/hdfs namenode -format

sbin/hadoop-daemon.sh start namenode

在kks1上,启动所有datanode
sbin/hadoop-daemons.sh start datanode

启动YARN:
sbin/start-yarn.sh

至此,Hadoop 搭建完毕。 可用jps命令查看jvm进程。

以后关闭,停闭集群可以使用以下命令:

sbin/stop-dfs.sh

sbin/start-dfs.sh

sbin/start-yarn.sh

sbin/stop-yarn.sh
18:zookeeper安装:

wget http://mirrors.cnnic.cn/apache ... ar.gz

tar -zvxf zookeeper-..jar
cd zookeeper 目录
mkdir data
mkdir datalog
19:在data目录下创建myid文件

在kks1,kks2,kks3上依次为1,2,3。

20:在conf目录下建立zoo.cfg文件

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/home/zookeeper/data
dataLogDir=/home/zookeeper/datalog
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/do ... nance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=kks1:2888:3888
server.2=kks2:2888:3888
server.3=kks3:2888:3888
21:在每个节点上启动zookeeper

bin/zkServer.sh stop
bin/zkServer.sh start
bin/zkServer.sh status 查看节点状态
至此zookeeper安装成功。

22:Hbase安装

wget http://mirrors.koehn.com/apach ... ar.gz
23:hbase-env.sh

vim hbase-env.sh
export HBASE_MANAGES_ZK=false
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79.x86_64
export HBASE_PID_DIR=/var/hadoop/pids
24:hbase-site.xml

<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://kks1:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>kks1,kks2,kks3</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>120000</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hbase/data</value>
</property>
</configuration>
25:regionservers

kks2
kks3
kks4
26:复制到其他节点

scp -r hbase root@kks4:/home
27:启动集群

bin/start-hbase.sh

bin/stop-hbase.sh
至此hbase集群搭建完毕。

但是hbase的编程环境还远没有完成。请看下文:

[button href=http://www.bcmeng.com/hbasemr color=red]Hadoop2.6.0|Hbase0.98.13的Mapreduce编程环境搭建[/button]
收起阅读 »

JavaScript删除数组重复元素的5个高效算法

之前一段时间一直在准备面试, 因而博客太久没更新; 现在基本知识点都复习完毕, 接下来就分享下 面试的一些常见问题:

去正规的互联网公司笔试、面试有很大的概率会碰到 使用javascript实现数组去重 的编码问题:如:魅族笔试题;

本博文就 js 如何实现数组去重整理出5种方法,并附上演示Demo 以及 源码。1.遍历数组法

最简单的去重方法, 实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,需多写一些兼容低版本浏览器代码,源码如下:// 最简单数组去重法 function unique1(array){ var n = []; //一个新的临时数组 //遍历当前数组 for(var i = 0; i < array.length; i++){ //如果当前数组的第i已经保存进了临时数组,那么跳过, //否则把当前项push到临时数组里面 if (n.indexOf(array[i]) == -1) n.push(array[i]); } return n; }
// 判断浏览器是否支持indexOf ,indexOf 为ecmaScript5新方法 IE8以下(包括IE8, IE8只支持部分ecma5)不支持 if (!Array.prototype.indexOf){ // 新增indexOf方法 Array.prototype.indexOf = function(item){ var result = -1, a_item = null; if (this.length == 0){ return result; } for(var i = 0, len = this.length; i < len; i++){ a_item = this[i]; if (a_item === item){ result = i; break; } } return result; } }2.对象键值对法

该方法执行的速度比其他任何方法都快, 就是占用的内存大一些;实现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。注意点: 判断是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a["1"] 。解决上述问题还是得调用“indexOf”。// 速度最快, 占空间最多(空间换时间) function unique2(array){ var n = {}, r = [], len = array.length, val, type; for (var i = 0; i < array.length; i++) { val = array[i]; type = typeof val; if (!n[val]) { n[val] = [type]; r.push(val); } else if (n[val].indexOf(type) < 0) { n[val].push(type); r.push(val); } } return r; }3.数组下标判断法

还是得调用“indexOf”性能跟方法1差不多,实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。function unique3(array){ var n = [array[0]]; //结果数组 //从第二项开始遍历 for(var i = 1; i < array.length; i++) { //如果当前数组的第i项在当前数组中第一次出现的位置不是i, //那么表示第i项是重复的,忽略掉。否则存入结果数组 if (array.indexOf(array[i]) == i) n.push(array[i]); } return n; }4.排序后相邻去除法

虽然原生数组的”sort”方法排序结果不怎么靠谱,但在不注重顺序的去重里该缺点毫无影响。实现思路:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。// 将相同的值相邻,然后遍历去除重复值 function unique4(array){ array.sort(); var re=[array[0]]; for(var i = 1; i < array.length; i++){ if( array[i] !== re[re.length-1]) { re.push(array[i]); } } return re; }5.优化遍历数组法

源自外国博文,该方法的实现代码相当酷炫;实现思路:获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)// 思路:获取没重复的最右一值放入新数组 function unique5(array){ var r = []; for(var i = 0, l = array.length; i < l; i++) { for(var j = i + 1; j < l; j++) if (array[i] === array[j]) j = ++i; r.push(array[i]); } return r; }实现demo     demo 源码

参考资料:Fast Algorithm To Find Unique Items in JavaScript Array
继续阅读 »
之前一段时间一直在准备面试, 因而博客太久没更新; 现在基本知识点都复习完毕, 接下来就分享下 面试的一些常见问题:

去正规的互联网公司笔试、面试有很大的概率会碰到 使用javascript实现数组去重 的编码问题:如:魅族笔试题;

本博文就 js 如何实现数组去重整理出5种方法,并附上演示Demo 以及 源码。1.遍历数组法

最简单的去重方法, 实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,需多写一些兼容低版本浏览器代码,源码如下:// 最简单数组去重法 function unique1(array){ var n = []; //一个新的临时数组 //遍历当前数组 for(var i = 0; i < array.length; i++){ //如果当前数组的第i已经保存进了临时数组,那么跳过, //否则把当前项push到临时数组里面 if (n.indexOf(array[i]) == -1) n.push(array[i]); } return n; }
// 判断浏览器是否支持indexOf ,indexOf 为ecmaScript5新方法 IE8以下(包括IE8, IE8只支持部分ecma5)不支持 if (!Array.prototype.indexOf){ // 新增indexOf方法 Array.prototype.indexOf = function(item){ var result = -1, a_item = null; if (this.length == 0){ return result; } for(var i = 0, len = this.length; i < len; i++){ a_item = this[i]; if (a_item === item){ result = i; break; } } return result; } }2.对象键值对法

该方法执行的速度比其他任何方法都快, 就是占用的内存大一些;实现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。注意点: 判断是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a["1"] 。解决上述问题还是得调用“indexOf”。// 速度最快, 占空间最多(空间换时间) function unique2(array){ var n = {}, r = [], len = array.length, val, type; for (var i = 0; i < array.length; i++) { val = array[i]; type = typeof val; if (!n[val]) { n[val] = [type]; r.push(val); } else if (n[val].indexOf(type) < 0) { n[val].push(type); r.push(val); } } return r; }3.数组下标判断法

还是得调用“indexOf”性能跟方法1差不多,实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。function unique3(array){ var n = [array[0]]; //结果数组 //从第二项开始遍历 for(var i = 1; i < array.length; i++) { //如果当前数组的第i项在当前数组中第一次出现的位置不是i, //那么表示第i项是重复的,忽略掉。否则存入结果数组 if (array.indexOf(array[i]) == i) n.push(array[i]); } return n; }4.排序后相邻去除法

虽然原生数组的”sort”方法排序结果不怎么靠谱,但在不注重顺序的去重里该缺点毫无影响。实现思路:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。// 将相同的值相邻,然后遍历去除重复值 function unique4(array){ array.sort(); var re=[array[0]]; for(var i = 1; i < array.length; i++){ if( array[i] !== re[re.length-1]) { re.push(array[i]); } } return re; }5.优化遍历数组法

源自外国博文,该方法的实现代码相当酷炫;实现思路:获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)// 思路:获取没重复的最右一值放入新数组 function unique5(array){ var r = []; for(var i = 0, l = array.length; i < l; i++) { for(var j = i + 1; j < l; j++) if (array[i] === array[j]) j = ++i; r.push(array[i]); } return r; }实现demo     demo 源码

参考资料:Fast Algorithm To Find Unique Items in JavaScript Array 收起阅读 »

大数据绝密资源,一般人我不告诉!

译者:刘帝伟

原文链接:

http://www.smartdatacollective ... -know

20个大家应该知道的大数据资源


我总是在证明这样一个论点,即数据无处不在——并且很多都是免费的。在开始大数据分析之前,公司不一定要建立自己的大规模数据仓库。企业和政府将大量信息投入到公共领域的举措,使得每个人都能够获得海量数据。




迄今为止,从大蓝筹企业到极小型创业公司,都可以使用比以往更多的数据。我的很多客户都在向我寻求他们在向大数据方面努力时可以使用的顶尖数据源,下面描述的就是如今可以获得的,一些好用同时免费的大数据来源。


1. Data.gov http://data.gov/美国政府去年承诺使所有政府数据都能在网上免费获得。这个网站是第一阶段,作为一个门户网站,囊括了从气候到犯罪的一切惊人的信息。


2. 美国人口普查局 http://www.census.gov/data.html一个关于美国公民生活的丰富信息,包括人口数据,地域数据以及教育。


3. 欧洲联盟开放数据门户 http://open-data.europa.eu/en/data/如上所述,但它是基于欧洲联盟机构的数据。


4. Data.gov.uk http://data.gov.uk/来自英国政府的数据,包括《英国国家书目》——自1950以来所有的英国书籍以及出版物的元数据。


5. 中情局世界概况 https://www.cia.gov/library/pu ... k/267个国家历史、人口、经济、政府、基础设施以及军事信息。


6.  Healthdata.gov https://www.healthdata.gov/125年来美国的医疗保健数据,包括索赔型医保数据,流行病学和人口统计。


7. NHS 健康和社会保健信息中心 http://www.hscic.gov.uk/home来自英国国民健康服务的健康状况数据集。


8. Amazon网络服务公共数据集 http://aws.amazon.com/datasets巨型公共数据源,包括1000个基因组工程,试图建立最全面的人类遗传信息数据库和美国宇航局的卫星图像数据库。


9. Facebook Graph https://developers.facebook.com/docs/graph-api虽然Facebook用户个人资料中的很多信息是私有的,但很多也不是——Facebook提供Graph API作为查询大量信息的一种方式,它的用户很乐意与世界分享(或者说是不能隐藏,因为他们还没有制定如何设置隐私功能)。


10. Gapminder http://www.gapminder.org/data/世界卫生组织和世界银行的数据集合,包括世界各地的经济、医疗以及社会统计数据。


11. Google Trends http://www.google.com/trends/explore自2004年以来,对所有关键字的搜索量(作为总搜索的比例)的数据统计。


12. Google财经https://www.google.com/finance40年的股票市场数据,并实时更新。


13. Google Books Ngramshttp://storage.googleapis.com/ ... .html搜索和分析数以百万计的数字图书全文,作为Google图书项目的一部分。


14. 国家气候数据中心 http://www.ncdc.noaa.gov/data- ... -clim从美国国家气候数据中心收集的环境、气象以及气候数据集。全球最大的天气数据存档。


15. DBPedia http://wiki.dbpedia.org维基百科包含数以百万计的数据,生活中每个事物的结构化和非结构化信息。DBpedia的是一个用来分类的大型工程,并创建了一个公共的,免费发布的并允许任何人来分析这些数据的数据库。


16. Topsy http://topsy.com/免费而全面的社交媒体数据是很难得到的——毕竟这些数据是为那些大玩家(Facebook,Twitter等)产生利润的,所以他们不想轻易送人。然而Topsy提供了一个可搜索回溯至2006年公共微博的数据库,和现在一些用来分析会话的工具。


17. Likebutton http://likebutton.com/在全球范围内,从你自己的网络中挖掘Facebook的公共数据,来了解在某个时刻人们“喜欢”什么。


18. New York Times《纽约时报》 http://developer.nytimes.com/docs可搜索的新闻文章的索引档案,可以追溯到1851年。


19. Freebase http://www.freebase.com/一个关于人,地点和事物的结构化数据的社区数据库,记录数超过45万个。


20. 百万歌曲数据集 http://aws.amazon.com/datasets/6468931156960467超过一百万首歌曲和音乐作品的元数据。部分属于亚马逊网络服务。


我希望这个列表对大家是有用的,现在你同意我说,缺乏数据不是一个拖延任何大数据举措的有效借口了吗?此外,请在公众号留言给我分享其他免费的大数据来源。


中国最专业的大数据学习社区
继续阅读 »
译者:刘帝伟

原文链接:

http://www.smartdatacollective ... -know

20个大家应该知道的大数据资源


我总是在证明这样一个论点,即数据无处不在——并且很多都是免费的。在开始大数据分析之前,公司不一定要建立自己的大规模数据仓库。企业和政府将大量信息投入到公共领域的举措,使得每个人都能够获得海量数据。




迄今为止,从大蓝筹企业到极小型创业公司,都可以使用比以往更多的数据。我的很多客户都在向我寻求他们在向大数据方面努力时可以使用的顶尖数据源,下面描述的就是如今可以获得的,一些好用同时免费的大数据来源。


1. Data.gov http://data.gov/美国政府去年承诺使所有政府数据都能在网上免费获得。这个网站是第一阶段,作为一个门户网站,囊括了从气候到犯罪的一切惊人的信息。


2. 美国人口普查局 http://www.census.gov/data.html一个关于美国公民生活的丰富信息,包括人口数据,地域数据以及教育。


3. 欧洲联盟开放数据门户 http://open-data.europa.eu/en/data/如上所述,但它是基于欧洲联盟机构的数据。


4. Data.gov.uk http://data.gov.uk/来自英国政府的数据,包括《英国国家书目》——自1950以来所有的英国书籍以及出版物的元数据。


5. 中情局世界概况 https://www.cia.gov/library/pu ... k/267个国家历史、人口、经济、政府、基础设施以及军事信息。


6.  Healthdata.gov https://www.healthdata.gov/125年来美国的医疗保健数据,包括索赔型医保数据,流行病学和人口统计。


7. NHS 健康和社会保健信息中心 http://www.hscic.gov.uk/home来自英国国民健康服务的健康状况数据集。


8. Amazon网络服务公共数据集 http://aws.amazon.com/datasets巨型公共数据源,包括1000个基因组工程,试图建立最全面的人类遗传信息数据库和美国宇航局的卫星图像数据库。


9. Facebook Graph https://developers.facebook.com/docs/graph-api虽然Facebook用户个人资料中的很多信息是私有的,但很多也不是——Facebook提供Graph API作为查询大量信息的一种方式,它的用户很乐意与世界分享(或者说是不能隐藏,因为他们还没有制定如何设置隐私功能)。


10. Gapminder http://www.gapminder.org/data/世界卫生组织和世界银行的数据集合,包括世界各地的经济、医疗以及社会统计数据。


11. Google Trends http://www.google.com/trends/explore自2004年以来,对所有关键字的搜索量(作为总搜索的比例)的数据统计。


12. Google财经https://www.google.com/finance40年的股票市场数据,并实时更新。


13. Google Books Ngramshttp://storage.googleapis.com/ ... .html搜索和分析数以百万计的数字图书全文,作为Google图书项目的一部分。


14. 国家气候数据中心 http://www.ncdc.noaa.gov/data- ... -clim从美国国家气候数据中心收集的环境、气象以及气候数据集。全球最大的天气数据存档。


15. DBPedia http://wiki.dbpedia.org维基百科包含数以百万计的数据,生活中每个事物的结构化和非结构化信息。DBpedia的是一个用来分类的大型工程,并创建了一个公共的,免费发布的并允许任何人来分析这些数据的数据库。


16. Topsy http://topsy.com/免费而全面的社交媒体数据是很难得到的——毕竟这些数据是为那些大玩家(Facebook,Twitter等)产生利润的,所以他们不想轻易送人。然而Topsy提供了一个可搜索回溯至2006年公共微博的数据库,和现在一些用来分析会话的工具。


17. Likebutton http://likebutton.com/在全球范围内,从你自己的网络中挖掘Facebook的公共数据,来了解在某个时刻人们“喜欢”什么。


18. New York Times《纽约时报》 http://developer.nytimes.com/docs可搜索的新闻文章的索引档案,可以追溯到1851年。


19. Freebase http://www.freebase.com/一个关于人,地点和事物的结构化数据的社区数据库,记录数超过45万个。


20. 百万歌曲数据集 http://aws.amazon.com/datasets/6468931156960467超过一百万首歌曲和音乐作品的元数据。部分属于亚马逊网络服务。


我希望这个列表对大家是有用的,现在你同意我说,缺乏数据不是一个拖延任何大数据举措的有效借口了吗?此外,请在公众号留言给我分享其他免费的大数据来源。


中国最专业的大数据学习社区 收起阅读 »

深度解析Hadoop与大数据

译者:付军
原文链接

深度解析Hadoop与大数据


Hadoop与大数据都极大地影响了商业,然而,Hadoop和大数据之间的确切关系还有待讨论。

Hadoop是一种开源的分布式计算平台,可以利用成千上万个服务器节点来处理大量数据。而大数据在通过定量-定性的科学分析,从存储的海量数据中获得见解方面赢得大量赞誉。

你可以把Hadoop想象成一匹马,那么大数据就是骑手。或者更准确地讲:Hadoop是建房的工具,大数据是正在建造的房子。无论那种比喻,都说明,这两项正在快速发展的技术有着不可分割的联系。

然而,Hadoop和大数据也都面临着同样的问题:都是相对比较新兴的技术,都面临着快速变动的挑战,这是不成熟而又快速发展的技术的特点。

Hadoop开发于2006年,然而直到2009年Cloudera的投入才使它走向商业化。几年后它引发大规模的争论。2015年6月的纽约时报 “ Companies Move On From Big Data Technology Hadoop”对它做了悲观的估计。此外,大数据专家(见下文)认为,Hadoop发展会遭受到重大阻力。

类似的,虽然大数据已经存在多年了,之前以“商业智能”一词出现,但它依然带来了很大的混乱。企业不清楚如何获得它的能力。无数的软件解决方案和可能的策略只会让一些用户觉得困惑。由于大数据的炒作的作用,也可能引起激烈反应。关于“大数据”这个词本身的界定就很模糊,“大数据”有多种定义。它通常被定义为“从大量数据中挖掘出具有操作性见解的过程”,它还囊括了机器学习、地理分析和其他一系列智能应用。

无论你怎么定义它,“大数据”将逐渐成为区分企业的工具。那些能从“大数据”解决方案中获得有竞争力见解的企业就获得了关键优势;而那些不能掌控这项技术的企业将会落后。

一大笔钱已经被盯上了。调研机构IDC预测,“大数据”技术和服务将以26.4%的年增长率增长到2018年,那时将形成一个414亿美元的全球市场。如果准确的话,这一预测将意味着“大数据”将以6倍于整个技术市场的速度快速增长。
Wikibon的研究预测出了相似的增长率;下图反映了“大数据”在近几年的指数级增长。鉴于“大数据”的爆炸式增长轨迹,毫无疑问,Hadoop——被视为一个关键的大数据处理工具——引起了各种规模的企业的极大兴趣。

图片来自:Wikibon


1
Hadoop和大数据:最完美的结合?Hadoop和大数据是否是最完美的匹配“取决于你正在做什么,”Nick Heudecker说,一个专注于数据管理和数据集成的Gartner分析师。

“Hadoop当然允许你快速装载巨大数量的数据,而不需要做任何关于你存储了什么或者你保留了什么的妥协。当然这些确实有利于大量的大数据发现。”

然而,企业继续使用其他的大数据技术,Heudecker说。一个Gartner的调查显示,Hadoop是大数据技术的第三选择,在企业级数据仓库和云计算之后。

尽管Hadoop是主要的大数据工具,它并不是企业用户的第一选择。

企业级的数据仓库排在Hadoop之上作为主要的大数据工具是毫无疑问的。一个公司的完整历史和结构可以被存储在数据仓库中的数据展示出来。

而且,Heudecker说,基于Gartner的用户调研,“我们看到企业级数据仓库正在和多种不同的数据库结合在一起:SQL、图形数据库、内存技术、复杂处理技术,还有流处理技术。”

因此,尽管Hadoop是一个重要的大数据技术,在这一点上它仍然许多竞争者中的一个。“我认为将多种数据存储联合起来还是很有价值的,”Heudecker说。

也就是说,“Hadoop被用于处理一些事情;你的数据仓库可以用于处理另一些。我认为任何人都不想把所有的数据集中放在一个单一的平台上。你需要优化来应对你正在做的潜在工作量。”

Hadoop在一个大数据平台中提供了一个完整的生态系统。有时候被称为“数据操作系统”。

Mike Gualtieri,一个Forrester的分析师,主要研究方向是大数据技术和Hadoop,解释说,Hadoop是一个更大生态系统的一部分——但是它是那个数据生态系统中的基础元素。“我可能说‘Hadoop and friends’对大数据来说是最完美的匹配,”Gualtieri说。多种多样的工具能够联合起来达到最好的结果。“

例如,你需要流处理技术来处理实时数据。就有类似Data Torrent这样的软件可以运行在Hadoop上,可以包括流,还有Spark。你可能想要在内存中做批处理作业,尽管不是必须的,但是在Hadoop集群上运行Spark集群来处理将会非常方便。”

Hadoop在大数据宇宙中仍然处于主宰地位。“我认为Hadoop是一个数据操作系统,” Gualtieri说。它是一个通用的基础平台。它拥有一个操作系统有的一切能力:它有一个文件系统,有一种运行作业的方式。”并且提供商的社区和开源项目都在为Hadoop的健康发展添砖加瓦。“他们正在将它变成一个大数据平台。”

事实上,对大数据应用来说,Hadoop的价值已不仅仅是最初作为一个数据操作系统那么简单。Gualtieri看到,Hadoop也是一个应用平台。这个能力是由YARN提供的,YARN作为Hadoop的一部分,是一项集群管理技术(YARN代表Yet Another Resource Manager)。

“YARN确实是一个重要的组成部分,因为它允许大数据社区出现一些创新,”他说,“因为当一个提供商或者开源项目贡献了一些新东西,一些新的应用程序,无论它是机器学习、流、一个SQL引擎或者是一个ETL工具,最终,Hadoop编程一个应用平台同时也是一个数据平台。并且它有处理所有这些应用以及控制它们使用的资源这些基础能力。”

YARN和HDFS为Hadoop提供了多样化的功能

不管技术在未来的几年如何演变,在大数据初期的日子里,Hadoop永远占据一席之地。曾经有一段时间,当很多企业看到他们大量的数据时——也许是庞大的20TB——他们在本质上已经放弃了。他们假设这些数据量太大以至于不能从中挖掘出价值。

但是Hadoop改变了这一切, Mike Matchett说,Tenaja Group中专注于大数据的分析师。Hadoop的发展意味着“嗨,如果你有五十个空白的集群服务器节点——这不会花费你太多——你有商业服务器,你并不需要SAN因为你能够使用HDFS和本地磁盘,你可以用它做一些事情。你能发现大数据的价值。并且这正是Hadoop起飞的时候。”

2
谁会选择Hadoop作为大数据工具根据Gartner的研究报告,深度使用Hadoop的行业就是那些银行和金融服务业。其他的Hadoop早期使用者包括:“通常来说是服务,我们定义为软件销售人员或者IT服务人员,”Heudecker 说。金融业,制造业和自然资源也能看到Hadoop用户。

这些都是能够产生更多不同种类数据的行业。Heudecker 说:“我认为Hadoop当然适合这些行业,因为现在你不必要向你将要保留或者将要存储什么东西作出妥协,你只是需要存储所有的东西,稍后再搞明白这些事情。”

另一方面,有一些落伍者,Teneja Group的Matchett说:“你看到有人说‘我们使用结构化的数据仓库做得很好。我们正在做得市场并没有很多实时的应用,或者我并没有看到这方面需求。”

但是这些较晚采用的人将会逐渐使用,他说,“他们会说,‘如果我们有一个网站并且我们会跟踪用户的行为,这就会产生一个快速的大数据流,我们就会在市场数据上使用它’”,其实事实上,他问道:“我们并没有一个网站和一个这种类型的用户群?”

Forrester的Gualtieri注意到Hadoop的吸引力很大。他说:“我们做了一个Hadoop波形图,参考的是Forrester的报告:大数据Hadoop解决方案。这是我们去年评估和发布的报告,并且在那一年发布的关于各种主题的上千份Forrester报告中,这一篇是阅读量排在第二名的。”他说,如此受欢迎正是Hadoop作为数据处理系统的根基所在。

而且,Gaultieri 说:“投资的数量,我谈论的不是来自创业者的投资,而是那些来自像SAS、IBM、微软这样的公司及所有商业公司的投资,他们的目标就是让它变的简单并且能够处理更加复杂的东西,因此它将会产生巨大的价值。”

他预见一个潜在的场景,Hadoop会成为每个操作系统的一部分。同时,使用者仍然在不断增长,“我估计在接下来的几年中,可能是2-3年,企业将会百分之一百部署Hadoop,”Gaultieri 指出一个现象,他称之为“Hadoopenomics”,即Hadoop的能力开启了一个适合大数据场景的完整生态系统,主要是因为相对于复杂的数据仓库系统,Hadoop提供了低代价的存取数据方案。他说:“它不像数据仓库那样,但是它对很多事情都有好处。”

3
Hadoop的不利因素然而,在Hadoop的世界里并不是所有都是美好的。最近的关于Hadoop使用者的Gartner报告指出“围绕着商业价值和技能还面临着巨大的挑战,投资仍然在试探阶段。”

2015年五月,Heudecker 和Gartner 的分析师Merv Adrian合作的报告中这样说:“尽管有很多关于早期的采用者成功案例的炒作和报道,54%的受访者表示此时没有投资计划,只有18%的受访者在未来两年中有对Hadoop的投资计划。此外,这些早期的采用者似乎并没有在未来的24个月中倡导大量使用Hadoop;事实上,在未来两年中,真正开始的公司比当时计划开始的要少很多。”

“只有26%的受访者声称他们正在使用Hadoop进行部署,试点或者测试,11%计划在12个月之内投资,7%正在计划24个月之内进行投资。回应显示,关于缺乏投资意愿主要有两个原因。第一,一些回应显示Hadoop并不是一个优先方案。第二个原因是Hadoop对于商业面临的问题有些矫枉过正,这意味着相对于预期收益实施的Hadoop的机会成本太高。”

Gartner报告中关于Hadoop的悲观消息:鉴于有这很多公司没有使用Hadoop计划或者刚开始Hadoop旅程,至少在未来24个月,对Hadoop的需求量显得颇为贫乏。而且,缺乏对使用Hadoop的短期规划表明,尽管对于大数据现象的热情持续高涨,对Hadoop的需求实际没有增加。对提供商来说,收入增长最好的希望似乎是将现有的用户群带入到更大的部署集群中去。

我问Heudecker关于这些Hadoop的阻碍,并且他提到了缺乏有高级Hadoop技能的IT专业人才的问题:“我们谈论了很多大型金融服务机构,他们只是刚刚开始使用Hadoop,”他说,“然后我们问,‘谁帮助了你?’他们回答‘没有人,因为我们找的公司在使用Hadoop方面的经验和我们是一样的。’因此,当地球上最大的金融服务公司都不能为自己的Hadoop项目寻求到帮助,这对全球30000多公司又意味着什么呢?”

缺乏Hadoop技能的专业人才这个问题是要真正考虑的,Heudecker说。“这从我们的数据中以及我们和客户的谈话中就能证明,并且我认为在Hadoop技能在市场上多起来之前还需要一段时间。”

然而,针对Hadoop面临的短板即有此技术的工作者是一个‘神话’这样的观点,Gualtieri却表达了另外一种不同的看法。他说:“Hadoop是基于Java的,一个大企业有很多的Java程序员,而且具有多年经验的Java开发者仍然要学习新的框架。猜猜会怎么样?只需要找几个好的Java程序员并且说‘在Hadoop上做吧’然后他们将会搞定它。这并不困难。”Java程序员很快就能够运行一个做简单任务的示例应用程序,他说。

这些内部成长起来的Hadoop专家能够极大节省成本,他说:“不要花高价去请那些说‘我知道Hadoop’的Hadoop专家,当我和许多大企业中工作十年之久的员工交谈的时候,就我所知,他们已经变成Hadoop专家了。”

Gualtieri 说:“另一个让Hadoop易于使用的因素是SQL for Hadoop。SQL是开发者都知道的。它被很多商业智能专业人士所熟知,甚至是商业人士和数据分析师,对么?它很流行。” “并且目前Hadoop体系中有至少30中不同的SQL For Hadoop查询引擎。因此你根本不需要知道关于MapReduce的东西,为了完成一个高效的查询,你不需要知道任何关于分布式数据或者分布式作业的东西。”

Gualtieri指出了多种可用的Hadoop SQL解决方案:“Apache Drill、Cloudera Impala、Apache Hive …Presto、HP Vertica 、Pivotal Hawk、Microsoft Polybase···当然了所有的数据库公司和数据仓库提供商都有一个解决方案。他们已经改变了自己引擎的用途。并且有开源力量的支持。”所有(或者大多数)解决方案都展示了它们的可用性。

Matchett的观点在Heudecker(即Hadoop面临着缺乏有技能的工作者) 和Gualtieri的观点(即相信内部的饿Java开发者和提供商解决方案能够解决技能不足的问题)中间。 “有许多人们可以创造出里程碑事件的地方,”他说,对于简单易用的Hadoop部署来说,特别是AWS所提供的。

“你和我都能够去Amazon,带着信用卡,购买一个EMR cluster(这是一个Hadoop集群),启动它而不需要知道其他任何东西,使用你的Amazon帐户,你能够在十分钟之内完成这件事而且拥有一个大数据集群。”

然而,Matchett 说:“在一些专业性方面或者产能规模方面,你还是需要专家的,就像你使用RDBMS的时候也需要一样,它们之间有极大的相似性。”自然了,这些专家会更贵,而且很难找到。

可以确信的是,这些是简单一点的解决方案:“有许多创业公司致力于提供基于cloud和基于Web的服务,他们并不需要在公司内部建立并运行Hadoop集群,”Matchett 说,“他们将在云端集群部署。”

尽管这样,在某些方面他们可能还是需要顶尖的人才:“他们可能仍然需要一个数据科学家来解决绝无仅有的复杂问题,他们需要科学家搞清楚自己能够做些什么不同于竞争对手或者其他人的东西。”

4
Hadoop或大数据提供商关系正在壮大的Hadoop提供商社区提供了一个拜占庭式的解决方案。风格和配置都很丰富。这些提供商都基于这样一个事实,即Hadoop有着一些与生俱来的复杂性——意思是购买者需要一些帮助。Hadoop由许多软件的组件构成,所有的这些组件都需要和谐的工作。

再加上潜在的混乱,整个生态系统以不同的速度向不同的方面发展。 处理这些挑战一个有利条件是和提供商一起合作,Heudecker 说。“他们会为你做这些工作。”正如上面提到的,这些解决方案中一个主要的方法是SQL——Heudecker 把SQL称为“数据管理界的通用语言。”

是否有一个特殊的SQL解决方案能够和Hadoop完美匹配呢?

Heudecker说:“我认为在未来的3-5年中,你可能会看到不是某一个SQL解决方案会成为赢家,而是会看到一些,这取决于你想要做什么,在一些情况下,对于某些用例来说Hive可能是你的选择。另外一些情况下你可能想要使用Drill或者是Presto,这取决于你工具的支持程度和你想要完成的东西。”

“对于市场份额竞争中的赢家或者输家?”我认为还太早了,我们将要讨论的是幸存者而不是胜利者。”提供商新兴的社区趋向于吹捧一个关键的特点:易用性。Matchett解释到:“如果你去参加行业活动,那里会充斥着创业者,它们会说‘嗨,我们由一个新的接口,允许使用者仅仅只是拖拽即可利用大数据能力而无需知道任何其它东西。’”

他将Hadoop工具的迅速发展和过去几年虚拟化技术的发展做了对比。如果一个提供商想要销售它的产品,简单的用户接口是一个卖点。Hadoop提供商兜售他们的产品,声称“‘我们已经有这个功能,并且现在我们使它更易管理,’”Matchett 说。“‘我们使之日益成熟并且我们添加了安全性和远程访问功能,我们正在增强其可用性,为开发人员台添加一些在不需要知道太多的情况下控制它的方法。’”

5
Hadoop设备:黑盒中的大数据尽管Hadoop日益成熟,仍然有一些大数据解决方案凌驾于它之上——以高价给那些需要更大能力的企业。

在Teradata warehouse或者IBM Netezza, Oracle Exadata能做的事情和Hadoop之间仍然有不小的差距。Forrester的Gualtieri说。“我意思是如果你需要高并发,你有很多的用户并且他们会执行很复杂的查询而且需要保证查询速度,这就像如果你在一个比赛中,你需要赛车一样。”在这种情况下你只是需要最好的。“因此,这里仍然有一个性能的差距,还有很多工程工作需要去完成。”

他发现Hadoop设备的崛起促进了Hadoop技术的发展。“Oracle有设备,Teradata有设备,HP正在推出基于Moonshot的设备,有Cray Computer,还有些其他的,”他说,还有Cisco 。

目前发生的一切还远不能称之为“appliance 1.0 for Hadoop,”Gualtieri 说。第一代只是找到一个柜子,在里面放一些节点,安装上Hadoop并提供给用户使用。“但是,他们现在所做的正是他们所说的,‘Hadoop看起来就停留在这个阶段。我们是怎么创建一个工程解决方案来帮助克服Hadoop一些天生的瓶颈呢?提高IO吞吐量,使用更多的缓存,在真正需要的时候使用计算资源?’因此,现在我们正在创建一个更加工程化的系统。”

Matchett也说,在第一波浪潮过后可能会在Hadoop设备上有新的兴趣。“在几年前,DNN有一个HScaler appliance,他们将超级无敌的存储和计算模块打包在一起作为框架售卖,你可以购买这个Hadoop设备。”

设备对商业有吸引力。客户喜欢免费下载Hadoop,但是当他们将它变成工作机器时,这个工作(如上所述)需要专家的支持。购买一个预编译的设备很简单,公司“不希望雇佣一个专家,花费六个月自己做出类似的东西,”Matchett 说。“因此,他们只是快速购买一个已经预设好的设备,就像一个VCE设备如VBlock,或者其他一些人正在考虑出售的一个超融合版本。因此,你购买了一个框架···并且它已经做好了运行Hadoop,Spark等的准备。”简而言之,头痛的事情少了,生产力多了。

6
大数据辩论:Hadoop vs. Spark 或者 Hadoop and Spark?一个讨论或者说是辩论正在大数据社区如火如荼的进行:当然,Hadoop很热火,但是Spark正在兴起。可能Spark更好些——一些技术观察者大肆宣扬它的优点——并且Hadoop(一些观察着表示)将会很快从其高位消亡。

像Hadoop一样,Spark是一个集群计算平台(Hadoop和Spark都是Apache的项目)。Spark在作为需要快速计算的复杂数据处理作业的一个较好的选择方面赢得了很多赞誉。它基于内存的架构和有向无环图(DAG)处理远比Hadoop的MapReduce要快——至少目前是这样。当然Spark也有自己缺点。例如,它没有自己的文件系统。通常情况下,IT专业人员认为Hadoop最适合于处理量大的任务而Spark适合处理速度有要求的任务,但事实上界限并没有那么清楚。

Spark的支持者指出,当数据集能够装入内存的时候处理速度相当快。

“我认为这里有很多的炒作",Gualtieri 说。可以确信的是,他高度评价Spark和它的能力。”有一些事情它不能够很好的我完成。Spark,举个例子,没有自己的文件系统。因此它就像汽车没有轮子一样。” 

这场辩论没有考虑到如何让Spark或者Hadoop发展快一点。例如,Gualtieri 说,“一些人将会说Hadoop之所以会比Spark慢是因为它是基于磁盘的。从现在六个月后它真的还必须要基于磁盘么?事实上,一部分Hadoop社区正在致力于让Hadoop支持SSD,之后是文件和内存。因此,人们需要意识到这点,特别是现在处在Spark和Hadoop激战中的那些。”

这两种处理引擎经常被比较。“现在,大多数使用Hadoop的人说相对于Spark的DAG引擎,MapReduce有点蹩脚”,Gualtieri 说。“DAG引擎之所以优于MapReduce是因为它帮助程序员更好的并行执行作业。但是谁又能说没有人可以为Hadoop编写一个DAG引擎呢?他们可以。因此,这就是我所说的:这并不是一个静止的世界,代码库没有被冻结。这正是这个谈论让我恼火的地方,就是它假设这些技术是停滞不前的而且它们不会发展或者变得更好了。”

但是,当然它们是——可能是宜早不宜迟。

像Hadoop一样,Spark包含一组不停发展的工具和特征来扩大主平台的功能。

最终,Hadoop和Spark的辩论可能并不重要,Matchett说,因为这两种技术可能会以某种方式合并。在任何情况下,“你有的仍然是一个大数据生态系统,并且不管是Spark项目赢得了成功,或者是MapReduce项目赢了,现在Spark是Apache的一部分。它们都是那个生态系统的一部分。”

随着Hadoop和Spark的发展,“他们可能合并,也可能联姻,也可能偏离不同的方向。我认为重要的是你能够在同一个集群中同时运行Hadoop和Spark。”

一个公司在组建一个大数据工具集的时候会面临很多选择,Matchett 指出。“如果当它是块白板并且说‘我遇到这样一个问题,我想解决它,我应该使用Map Reduce么?我应该使用Spark么?我应该使用其他很多方法么?或者一个SQL数据库或者一个图形数据库?’这是一个关于架构的开放式讨论。”最终会有一些完全正确和错误的答案,唯一的问题是这个解决方案对于特定的场景是最好的。

许多大数据的实践者们找到这样一个场景,Spark和Hadoop一前一后协作,达到两全其美的效果,而不是选择其中一个。

7
Hadoop和大数据的未来:Data Gravity、Containers(容器)、IoT(物联网)很明显,在如何成为业务决策的新圣杯方面,已经有很多关于大数据的炒作。

这些炒作可能已经自生自灭了。“大数据基本上正在变成数据,”Heudecker这么认为。“是时候让这些炒作成为过去并且开始考虑它对你业务的价值在哪里。”重要的一点:“不要把大数据当作自己的终结。它必须由业务需求来驱动。”

至于Hadoop在这方面的角色,它的成功可能包含一个悖论。随着时间的推移,Hadoop的成长可能会不太明显。他可能变得无所不在,而不再被视为一个独立的工具。

“随着时间的推移,Hadoop最终会合并进您的基础信息架构中,”Huedecker说。“它不再是一个either/or的选择。并且将来它也不会是那样。可能是我会有多个数据存储。我将会根据我必须对业务遵守的SLA来使用它们。所以你将会有各种不同的数据存储。”

按照Gualtieri的观点,Hadoop不久的将来是基于SQL的。“我将要说得是今年SQL on Hadoop对Hadoop来说是个杀手级的应用,”他说。“这样的应用程序使得企业可以很容易就能采用Hadoop。”他预言:“从现在起两年内,你将看到企业构建专门应用程序在Hadoop上运行。” 展望未来,Gualtieri认为物联网所具有的海量大数据的潜力将会提振Hadoop。例如,他指出通过有线电视盒子创造的海量数据。所有的数据需要被存储在某个地方。

“你可能会想到放在最经济的地方,即Hadoop中的HDFS,”他说,“并且你可能像要分析这些数据,来看看你是否能够预测这个时间是谁在看电视,并且预测用户趋势的数量,而且你可能会在Hadoop集群中做这件事。也可能是在Spark中。或许只是将一个子集数据放入Spark。”

说句题外话,Gualtieri指出了关于Hadoop和云的关键点,他称之为“data gravity的神话”。企业经常会问他将他们的数据存在哪个地方:在云端?传统的观点是,你应该将它们存储在你经常用来分析和处理的地方。然而,Gualtieri却不同意——这样的态度实在太局限了,他说。

这也是为什么data gravity是一个神话的原因:“将1TB的数据移到云端大概只需要50分钟左右,并且很多企业只有100TB左右.”因此,如果你的Hadoop集群构建在云端,它只需要几个小时来将已存在的数据移到云端,之后都是增量更新。“我希望去也都能明白这一点,所以他们中的一些可以在实际中也使用云,”他说。

当Matchett谈到Hadoop和大数据的未来,他看到了联合的影响:任何数量的提供商和解决方案联合在一起就能更加灵活的处理各种挑战。“我们刚开始从自有平台和具有规模化数据处理的商业平台联合中看到一点点能力的不断增强,”他说。他指出了MapReduce和Spark的联合。“我们也有那些可以运行在这些平台上的SQL数据库。并且我们看到像 Vertica这样的数据库一开始就将数据库运行在相同的平台上……来自EMC的Green Plum,还有来自Teradata的一些。”

他补充说:“如果你考虑这种推动作用,data lake就更有意义了,它不再作为a lake of data,而是作为一个数据处理平台,你能够利用存储在那里的数据做任何事情。”

Hadoop和大数据在将来会包含各种技术的混合并相互匹配在一起——包括现在兴起的容器技术。

“你开始看到正在发生的一切,工作负载调度和容器调度以及容器集群管理,并且在这方面大数据逐步参与进来,你意识到:好吧,MapReduce是什么,它实际上是一个得到Map的结果的Java作业。而且容器到底是什么,它是一个装有Java应用程序的容器……你开始说,我们真的会看到一种新型的数据中心架构,并且它起源于Hadoop。”

所有这些如何演变呢?正如Matchett所说,“故事还在继续。”
 
继续阅读 »
译者:付军
原文链接

深度解析Hadoop与大数据


Hadoop与大数据都极大地影响了商业,然而,Hadoop和大数据之间的确切关系还有待讨论。

Hadoop是一种开源的分布式计算平台,可以利用成千上万个服务器节点来处理大量数据。而大数据在通过定量-定性的科学分析,从存储的海量数据中获得见解方面赢得大量赞誉。

你可以把Hadoop想象成一匹马,那么大数据就是骑手。或者更准确地讲:Hadoop是建房的工具,大数据是正在建造的房子。无论那种比喻,都说明,这两项正在快速发展的技术有着不可分割的联系。

然而,Hadoop和大数据也都面临着同样的问题:都是相对比较新兴的技术,都面临着快速变动的挑战,这是不成熟而又快速发展的技术的特点。

Hadoop开发于2006年,然而直到2009年Cloudera的投入才使它走向商业化。几年后它引发大规模的争论。2015年6月的纽约时报 “ Companies Move On From Big Data Technology Hadoop”对它做了悲观的估计。此外,大数据专家(见下文)认为,Hadoop发展会遭受到重大阻力。

类似的,虽然大数据已经存在多年了,之前以“商业智能”一词出现,但它依然带来了很大的混乱。企业不清楚如何获得它的能力。无数的软件解决方案和可能的策略只会让一些用户觉得困惑。由于大数据的炒作的作用,也可能引起激烈反应。关于“大数据”这个词本身的界定就很模糊,“大数据”有多种定义。它通常被定义为“从大量数据中挖掘出具有操作性见解的过程”,它还囊括了机器学习、地理分析和其他一系列智能应用。

无论你怎么定义它,“大数据”将逐渐成为区分企业的工具。那些能从“大数据”解决方案中获得有竞争力见解的企业就获得了关键优势;而那些不能掌控这项技术的企业将会落后。

一大笔钱已经被盯上了。调研机构IDC预测,“大数据”技术和服务将以26.4%的年增长率增长到2018年,那时将形成一个414亿美元的全球市场。如果准确的话,这一预测将意味着“大数据”将以6倍于整个技术市场的速度快速增长。
Wikibon的研究预测出了相似的增长率;下图反映了“大数据”在近几年的指数级增长。鉴于“大数据”的爆炸式增长轨迹,毫无疑问,Hadoop——被视为一个关键的大数据处理工具——引起了各种规模的企业的极大兴趣。

图片来自:Wikibon


1
Hadoop和大数据:最完美的结合?Hadoop和大数据是否是最完美的匹配“取决于你正在做什么,”Nick Heudecker说,一个专注于数据管理和数据集成的Gartner分析师。

“Hadoop当然允许你快速装载巨大数量的数据,而不需要做任何关于你存储了什么或者你保留了什么的妥协。当然这些确实有利于大量的大数据发现。”

然而,企业继续使用其他的大数据技术,Heudecker说。一个Gartner的调查显示,Hadoop是大数据技术的第三选择,在企业级数据仓库和云计算之后。

尽管Hadoop是主要的大数据工具,它并不是企业用户的第一选择。

企业级的数据仓库排在Hadoop之上作为主要的大数据工具是毫无疑问的。一个公司的完整历史和结构可以被存储在数据仓库中的数据展示出来。

而且,Heudecker说,基于Gartner的用户调研,“我们看到企业级数据仓库正在和多种不同的数据库结合在一起:SQL、图形数据库、内存技术、复杂处理技术,还有流处理技术。”

因此,尽管Hadoop是一个重要的大数据技术,在这一点上它仍然许多竞争者中的一个。“我认为将多种数据存储联合起来还是很有价值的,”Heudecker说。

也就是说,“Hadoop被用于处理一些事情;你的数据仓库可以用于处理另一些。我认为任何人都不想把所有的数据集中放在一个单一的平台上。你需要优化来应对你正在做的潜在工作量。”

Hadoop在一个大数据平台中提供了一个完整的生态系统。有时候被称为“数据操作系统”。

Mike Gualtieri,一个Forrester的分析师,主要研究方向是大数据技术和Hadoop,解释说,Hadoop是一个更大生态系统的一部分——但是它是那个数据生态系统中的基础元素。“我可能说‘Hadoop and friends’对大数据来说是最完美的匹配,”Gualtieri说。多种多样的工具能够联合起来达到最好的结果。“

例如,你需要流处理技术来处理实时数据。就有类似Data Torrent这样的软件可以运行在Hadoop上,可以包括流,还有Spark。你可能想要在内存中做批处理作业,尽管不是必须的,但是在Hadoop集群上运行Spark集群来处理将会非常方便。”

Hadoop在大数据宇宙中仍然处于主宰地位。“我认为Hadoop是一个数据操作系统,” Gualtieri说。它是一个通用的基础平台。它拥有一个操作系统有的一切能力:它有一个文件系统,有一种运行作业的方式。”并且提供商的社区和开源项目都在为Hadoop的健康发展添砖加瓦。“他们正在将它变成一个大数据平台。”

事实上,对大数据应用来说,Hadoop的价值已不仅仅是最初作为一个数据操作系统那么简单。Gualtieri看到,Hadoop也是一个应用平台。这个能力是由YARN提供的,YARN作为Hadoop的一部分,是一项集群管理技术(YARN代表Yet Another Resource Manager)。

“YARN确实是一个重要的组成部分,因为它允许大数据社区出现一些创新,”他说,“因为当一个提供商或者开源项目贡献了一些新东西,一些新的应用程序,无论它是机器学习、流、一个SQL引擎或者是一个ETL工具,最终,Hadoop编程一个应用平台同时也是一个数据平台。并且它有处理所有这些应用以及控制它们使用的资源这些基础能力。”

YARN和HDFS为Hadoop提供了多样化的功能

不管技术在未来的几年如何演变,在大数据初期的日子里,Hadoop永远占据一席之地。曾经有一段时间,当很多企业看到他们大量的数据时——也许是庞大的20TB——他们在本质上已经放弃了。他们假设这些数据量太大以至于不能从中挖掘出价值。

但是Hadoop改变了这一切, Mike Matchett说,Tenaja Group中专注于大数据的分析师。Hadoop的发展意味着“嗨,如果你有五十个空白的集群服务器节点——这不会花费你太多——你有商业服务器,你并不需要SAN因为你能够使用HDFS和本地磁盘,你可以用它做一些事情。你能发现大数据的价值。并且这正是Hadoop起飞的时候。”

2
谁会选择Hadoop作为大数据工具根据Gartner的研究报告,深度使用Hadoop的行业就是那些银行和金融服务业。其他的Hadoop早期使用者包括:“通常来说是服务,我们定义为软件销售人员或者IT服务人员,”Heudecker 说。金融业,制造业和自然资源也能看到Hadoop用户。

这些都是能够产生更多不同种类数据的行业。Heudecker 说:“我认为Hadoop当然适合这些行业,因为现在你不必要向你将要保留或者将要存储什么东西作出妥协,你只是需要存储所有的东西,稍后再搞明白这些事情。”

另一方面,有一些落伍者,Teneja Group的Matchett说:“你看到有人说‘我们使用结构化的数据仓库做得很好。我们正在做得市场并没有很多实时的应用,或者我并没有看到这方面需求。”

但是这些较晚采用的人将会逐渐使用,他说,“他们会说,‘如果我们有一个网站并且我们会跟踪用户的行为,这就会产生一个快速的大数据流,我们就会在市场数据上使用它’”,其实事实上,他问道:“我们并没有一个网站和一个这种类型的用户群?”

Forrester的Gualtieri注意到Hadoop的吸引力很大。他说:“我们做了一个Hadoop波形图,参考的是Forrester的报告:大数据Hadoop解决方案。这是我们去年评估和发布的报告,并且在那一年发布的关于各种主题的上千份Forrester报告中,这一篇是阅读量排在第二名的。”他说,如此受欢迎正是Hadoop作为数据处理系统的根基所在。

而且,Gaultieri 说:“投资的数量,我谈论的不是来自创业者的投资,而是那些来自像SAS、IBM、微软这样的公司及所有商业公司的投资,他们的目标就是让它变的简单并且能够处理更加复杂的东西,因此它将会产生巨大的价值。”

他预见一个潜在的场景,Hadoop会成为每个操作系统的一部分。同时,使用者仍然在不断增长,“我估计在接下来的几年中,可能是2-3年,企业将会百分之一百部署Hadoop,”Gaultieri 指出一个现象,他称之为“Hadoopenomics”,即Hadoop的能力开启了一个适合大数据场景的完整生态系统,主要是因为相对于复杂的数据仓库系统,Hadoop提供了低代价的存取数据方案。他说:“它不像数据仓库那样,但是它对很多事情都有好处。”

3
Hadoop的不利因素然而,在Hadoop的世界里并不是所有都是美好的。最近的关于Hadoop使用者的Gartner报告指出“围绕着商业价值和技能还面临着巨大的挑战,投资仍然在试探阶段。”

2015年五月,Heudecker 和Gartner 的分析师Merv Adrian合作的报告中这样说:“尽管有很多关于早期的采用者成功案例的炒作和报道,54%的受访者表示此时没有投资计划,只有18%的受访者在未来两年中有对Hadoop的投资计划。此外,这些早期的采用者似乎并没有在未来的24个月中倡导大量使用Hadoop;事实上,在未来两年中,真正开始的公司比当时计划开始的要少很多。”

“只有26%的受访者声称他们正在使用Hadoop进行部署,试点或者测试,11%计划在12个月之内投资,7%正在计划24个月之内进行投资。回应显示,关于缺乏投资意愿主要有两个原因。第一,一些回应显示Hadoop并不是一个优先方案。第二个原因是Hadoop对于商业面临的问题有些矫枉过正,这意味着相对于预期收益实施的Hadoop的机会成本太高。”

Gartner报告中关于Hadoop的悲观消息:鉴于有这很多公司没有使用Hadoop计划或者刚开始Hadoop旅程,至少在未来24个月,对Hadoop的需求量显得颇为贫乏。而且,缺乏对使用Hadoop的短期规划表明,尽管对于大数据现象的热情持续高涨,对Hadoop的需求实际没有增加。对提供商来说,收入增长最好的希望似乎是将现有的用户群带入到更大的部署集群中去。

我问Heudecker关于这些Hadoop的阻碍,并且他提到了缺乏有高级Hadoop技能的IT专业人才的问题:“我们谈论了很多大型金融服务机构,他们只是刚刚开始使用Hadoop,”他说,“然后我们问,‘谁帮助了你?’他们回答‘没有人,因为我们找的公司在使用Hadoop方面的经验和我们是一样的。’因此,当地球上最大的金融服务公司都不能为自己的Hadoop项目寻求到帮助,这对全球30000多公司又意味着什么呢?”

缺乏Hadoop技能的专业人才这个问题是要真正考虑的,Heudecker说。“这从我们的数据中以及我们和客户的谈话中就能证明,并且我认为在Hadoop技能在市场上多起来之前还需要一段时间。”

然而,针对Hadoop面临的短板即有此技术的工作者是一个‘神话’这样的观点,Gualtieri却表达了另外一种不同的看法。他说:“Hadoop是基于Java的,一个大企业有很多的Java程序员,而且具有多年经验的Java开发者仍然要学习新的框架。猜猜会怎么样?只需要找几个好的Java程序员并且说‘在Hadoop上做吧’然后他们将会搞定它。这并不困难。”Java程序员很快就能够运行一个做简单任务的示例应用程序,他说。

这些内部成长起来的Hadoop专家能够极大节省成本,他说:“不要花高价去请那些说‘我知道Hadoop’的Hadoop专家,当我和许多大企业中工作十年之久的员工交谈的时候,就我所知,他们已经变成Hadoop专家了。”

Gualtieri 说:“另一个让Hadoop易于使用的因素是SQL for Hadoop。SQL是开发者都知道的。它被很多商业智能专业人士所熟知,甚至是商业人士和数据分析师,对么?它很流行。” “并且目前Hadoop体系中有至少30中不同的SQL For Hadoop查询引擎。因此你根本不需要知道关于MapReduce的东西,为了完成一个高效的查询,你不需要知道任何关于分布式数据或者分布式作业的东西。”

Gualtieri指出了多种可用的Hadoop SQL解决方案:“Apache Drill、Cloudera Impala、Apache Hive …Presto、HP Vertica 、Pivotal Hawk、Microsoft Polybase···当然了所有的数据库公司和数据仓库提供商都有一个解决方案。他们已经改变了自己引擎的用途。并且有开源力量的支持。”所有(或者大多数)解决方案都展示了它们的可用性。

Matchett的观点在Heudecker(即Hadoop面临着缺乏有技能的工作者) 和Gualtieri的观点(即相信内部的饿Java开发者和提供商解决方案能够解决技能不足的问题)中间。 “有许多人们可以创造出里程碑事件的地方,”他说,对于简单易用的Hadoop部署来说,特别是AWS所提供的。

“你和我都能够去Amazon,带着信用卡,购买一个EMR cluster(这是一个Hadoop集群),启动它而不需要知道其他任何东西,使用你的Amazon帐户,你能够在十分钟之内完成这件事而且拥有一个大数据集群。”

然而,Matchett 说:“在一些专业性方面或者产能规模方面,你还是需要专家的,就像你使用RDBMS的时候也需要一样,它们之间有极大的相似性。”自然了,这些专家会更贵,而且很难找到。

可以确信的是,这些是简单一点的解决方案:“有许多创业公司致力于提供基于cloud和基于Web的服务,他们并不需要在公司内部建立并运行Hadoop集群,”Matchett 说,“他们将在云端集群部署。”

尽管这样,在某些方面他们可能还是需要顶尖的人才:“他们可能仍然需要一个数据科学家来解决绝无仅有的复杂问题,他们需要科学家搞清楚自己能够做些什么不同于竞争对手或者其他人的东西。”

4
Hadoop或大数据提供商关系正在壮大的Hadoop提供商社区提供了一个拜占庭式的解决方案。风格和配置都很丰富。这些提供商都基于这样一个事实,即Hadoop有着一些与生俱来的复杂性——意思是购买者需要一些帮助。Hadoop由许多软件的组件构成,所有的这些组件都需要和谐的工作。

再加上潜在的混乱,整个生态系统以不同的速度向不同的方面发展。 处理这些挑战一个有利条件是和提供商一起合作,Heudecker 说。“他们会为你做这些工作。”正如上面提到的,这些解决方案中一个主要的方法是SQL——Heudecker 把SQL称为“数据管理界的通用语言。”

是否有一个特殊的SQL解决方案能够和Hadoop完美匹配呢?

Heudecker说:“我认为在未来的3-5年中,你可能会看到不是某一个SQL解决方案会成为赢家,而是会看到一些,这取决于你想要做什么,在一些情况下,对于某些用例来说Hive可能是你的选择。另外一些情况下你可能想要使用Drill或者是Presto,这取决于你工具的支持程度和你想要完成的东西。”

“对于市场份额竞争中的赢家或者输家?”我认为还太早了,我们将要讨论的是幸存者而不是胜利者。”提供商新兴的社区趋向于吹捧一个关键的特点:易用性。Matchett解释到:“如果你去参加行业活动,那里会充斥着创业者,它们会说‘嗨,我们由一个新的接口,允许使用者仅仅只是拖拽即可利用大数据能力而无需知道任何其它东西。’”

他将Hadoop工具的迅速发展和过去几年虚拟化技术的发展做了对比。如果一个提供商想要销售它的产品,简单的用户接口是一个卖点。Hadoop提供商兜售他们的产品,声称“‘我们已经有这个功能,并且现在我们使它更易管理,’”Matchett 说。“‘我们使之日益成熟并且我们添加了安全性和远程访问功能,我们正在增强其可用性,为开发人员台添加一些在不需要知道太多的情况下控制它的方法。’”

5
Hadoop设备:黑盒中的大数据尽管Hadoop日益成熟,仍然有一些大数据解决方案凌驾于它之上——以高价给那些需要更大能力的企业。

在Teradata warehouse或者IBM Netezza, Oracle Exadata能做的事情和Hadoop之间仍然有不小的差距。Forrester的Gualtieri说。“我意思是如果你需要高并发,你有很多的用户并且他们会执行很复杂的查询而且需要保证查询速度,这就像如果你在一个比赛中,你需要赛车一样。”在这种情况下你只是需要最好的。“因此,这里仍然有一个性能的差距,还有很多工程工作需要去完成。”

他发现Hadoop设备的崛起促进了Hadoop技术的发展。“Oracle有设备,Teradata有设备,HP正在推出基于Moonshot的设备,有Cray Computer,还有些其他的,”他说,还有Cisco 。

目前发生的一切还远不能称之为“appliance 1.0 for Hadoop,”Gualtieri 说。第一代只是找到一个柜子,在里面放一些节点,安装上Hadoop并提供给用户使用。“但是,他们现在所做的正是他们所说的,‘Hadoop看起来就停留在这个阶段。我们是怎么创建一个工程解决方案来帮助克服Hadoop一些天生的瓶颈呢?提高IO吞吐量,使用更多的缓存,在真正需要的时候使用计算资源?’因此,现在我们正在创建一个更加工程化的系统。”

Matchett也说,在第一波浪潮过后可能会在Hadoop设备上有新的兴趣。“在几年前,DNN有一个HScaler appliance,他们将超级无敌的存储和计算模块打包在一起作为框架售卖,你可以购买这个Hadoop设备。”

设备对商业有吸引力。客户喜欢免费下载Hadoop,但是当他们将它变成工作机器时,这个工作(如上所述)需要专家的支持。购买一个预编译的设备很简单,公司“不希望雇佣一个专家,花费六个月自己做出类似的东西,”Matchett 说。“因此,他们只是快速购买一个已经预设好的设备,就像一个VCE设备如VBlock,或者其他一些人正在考虑出售的一个超融合版本。因此,你购买了一个框架···并且它已经做好了运行Hadoop,Spark等的准备。”简而言之,头痛的事情少了,生产力多了。

6
大数据辩论:Hadoop vs. Spark 或者 Hadoop and Spark?一个讨论或者说是辩论正在大数据社区如火如荼的进行:当然,Hadoop很热火,但是Spark正在兴起。可能Spark更好些——一些技术观察者大肆宣扬它的优点——并且Hadoop(一些观察着表示)将会很快从其高位消亡。

像Hadoop一样,Spark是一个集群计算平台(Hadoop和Spark都是Apache的项目)。Spark在作为需要快速计算的复杂数据处理作业的一个较好的选择方面赢得了很多赞誉。它基于内存的架构和有向无环图(DAG)处理远比Hadoop的MapReduce要快——至少目前是这样。当然Spark也有自己缺点。例如,它没有自己的文件系统。通常情况下,IT专业人员认为Hadoop最适合于处理量大的任务而Spark适合处理速度有要求的任务,但事实上界限并没有那么清楚。

Spark的支持者指出,当数据集能够装入内存的时候处理速度相当快。

“我认为这里有很多的炒作",Gualtieri 说。可以确信的是,他高度评价Spark和它的能力。”有一些事情它不能够很好的我完成。Spark,举个例子,没有自己的文件系统。因此它就像汽车没有轮子一样。” 

这场辩论没有考虑到如何让Spark或者Hadoop发展快一点。例如,Gualtieri 说,“一些人将会说Hadoop之所以会比Spark慢是因为它是基于磁盘的。从现在六个月后它真的还必须要基于磁盘么?事实上,一部分Hadoop社区正在致力于让Hadoop支持SSD,之后是文件和内存。因此,人们需要意识到这点,特别是现在处在Spark和Hadoop激战中的那些。”

这两种处理引擎经常被比较。“现在,大多数使用Hadoop的人说相对于Spark的DAG引擎,MapReduce有点蹩脚”,Gualtieri 说。“DAG引擎之所以优于MapReduce是因为它帮助程序员更好的并行执行作业。但是谁又能说没有人可以为Hadoop编写一个DAG引擎呢?他们可以。因此,这就是我所说的:这并不是一个静止的世界,代码库没有被冻结。这正是这个谈论让我恼火的地方,就是它假设这些技术是停滞不前的而且它们不会发展或者变得更好了。”

但是,当然它们是——可能是宜早不宜迟。

像Hadoop一样,Spark包含一组不停发展的工具和特征来扩大主平台的功能。

最终,Hadoop和Spark的辩论可能并不重要,Matchett说,因为这两种技术可能会以某种方式合并。在任何情况下,“你有的仍然是一个大数据生态系统,并且不管是Spark项目赢得了成功,或者是MapReduce项目赢了,现在Spark是Apache的一部分。它们都是那个生态系统的一部分。”

随着Hadoop和Spark的发展,“他们可能合并,也可能联姻,也可能偏离不同的方向。我认为重要的是你能够在同一个集群中同时运行Hadoop和Spark。”

一个公司在组建一个大数据工具集的时候会面临很多选择,Matchett 指出。“如果当它是块白板并且说‘我遇到这样一个问题,我想解决它,我应该使用Map Reduce么?我应该使用Spark么?我应该使用其他很多方法么?或者一个SQL数据库或者一个图形数据库?’这是一个关于架构的开放式讨论。”最终会有一些完全正确和错误的答案,唯一的问题是这个解决方案对于特定的场景是最好的。

许多大数据的实践者们找到这样一个场景,Spark和Hadoop一前一后协作,达到两全其美的效果,而不是选择其中一个。

7
Hadoop和大数据的未来:Data Gravity、Containers(容器)、IoT(物联网)很明显,在如何成为业务决策的新圣杯方面,已经有很多关于大数据的炒作。

这些炒作可能已经自生自灭了。“大数据基本上正在变成数据,”Heudecker这么认为。“是时候让这些炒作成为过去并且开始考虑它对你业务的价值在哪里。”重要的一点:“不要把大数据当作自己的终结。它必须由业务需求来驱动。”

至于Hadoop在这方面的角色,它的成功可能包含一个悖论。随着时间的推移,Hadoop的成长可能会不太明显。他可能变得无所不在,而不再被视为一个独立的工具。

“随着时间的推移,Hadoop最终会合并进您的基础信息架构中,”Huedecker说。“它不再是一个either/or的选择。并且将来它也不会是那样。可能是我会有多个数据存储。我将会根据我必须对业务遵守的SLA来使用它们。所以你将会有各种不同的数据存储。”

按照Gualtieri的观点,Hadoop不久的将来是基于SQL的。“我将要说得是今年SQL on Hadoop对Hadoop来说是个杀手级的应用,”他说。“这样的应用程序使得企业可以很容易就能采用Hadoop。”他预言:“从现在起两年内,你将看到企业构建专门应用程序在Hadoop上运行。” 展望未来,Gualtieri认为物联网所具有的海量大数据的潜力将会提振Hadoop。例如,他指出通过有线电视盒子创造的海量数据。所有的数据需要被存储在某个地方。

“你可能会想到放在最经济的地方,即Hadoop中的HDFS,”他说,“并且你可能像要分析这些数据,来看看你是否能够预测这个时间是谁在看电视,并且预测用户趋势的数量,而且你可能会在Hadoop集群中做这件事。也可能是在Spark中。或许只是将一个子集数据放入Spark。”

说句题外话,Gualtieri指出了关于Hadoop和云的关键点,他称之为“data gravity的神话”。企业经常会问他将他们的数据存在哪个地方:在云端?传统的观点是,你应该将它们存储在你经常用来分析和处理的地方。然而,Gualtieri却不同意——这样的态度实在太局限了,他说。

这也是为什么data gravity是一个神话的原因:“将1TB的数据移到云端大概只需要50分钟左右,并且很多企业只有100TB左右.”因此,如果你的Hadoop集群构建在云端,它只需要几个小时来将已存在的数据移到云端,之后都是增量更新。“我希望去也都能明白这一点,所以他们中的一些可以在实际中也使用云,”他说。

当Matchett谈到Hadoop和大数据的未来,他看到了联合的影响:任何数量的提供商和解决方案联合在一起就能更加灵活的处理各种挑战。“我们刚开始从自有平台和具有规模化数据处理的商业平台联合中看到一点点能力的不断增强,”他说。他指出了MapReduce和Spark的联合。“我们也有那些可以运行在这些平台上的SQL数据库。并且我们看到像 Vertica这样的数据库一开始就将数据库运行在相同的平台上……来自EMC的Green Plum,还有来自Teradata的一些。”

他补充说:“如果你考虑这种推动作用,data lake就更有意义了,它不再作为a lake of data,而是作为一个数据处理平台,你能够利用存储在那里的数据做任何事情。”

Hadoop和大数据在将来会包含各种技术的混合并相互匹配在一起——包括现在兴起的容器技术。

“你开始看到正在发生的一切,工作负载调度和容器调度以及容器集群管理,并且在这方面大数据逐步参与进来,你意识到:好吧,MapReduce是什么,它实际上是一个得到Map的结果的Java作业。而且容器到底是什么,它是一个装有Java应用程序的容器……你开始说,我们真的会看到一种新型的数据中心架构,并且它起源于Hadoop。”

所有这些如何演变呢?正如Matchett所说,“故事还在继续。”
  收起阅读 »