1、环境准备

1.1、安装CentOS7

1.2、安装JDK7

tar -zxvf jdk-8u211-linux-x64.tar.gzmkdir /usr/java/
mv jdk1.8.0_211/ /usr/java/jdk18
alternatives --install /usr/bin/java java /usr/java/jdk18/bin/java 2

#配置JAVA环境变量(由于openjdk会自动安装一个java,使得我们手动安装的不生效,需要先手动修改)

 alternatives --config java

然后输入数字按回车,可以选择相应的java版本

vi /etc/profile

大写G跳到文本最后,$可以跳至本行的结尾,增加

export JAVA_8_HOME=/usr/java/jdk18
export JAVA_HOME=$JAVA_8_HOME
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar上面三行为添加java8的安装路径

:wq保存退出

source /etc/profile

#重新加载

然后java -version与javac -version查看,两个都能正常反馈,并且版本信息一致,就是java安装成功了。

1.3、配置免密访问

ssh-keygen  //一路回车默认即可
ssh-copy-id   {其他机器的ip}

远程其他机器的时候,提示Are you sure you want to continue connecting (yes/no)?

按yes继续,然后提示输入目标主机的密码。

然后ssh 其他机器IP测试,如果没有提示输入密码即可远程登录,操作完成。

1.4、编辑hosts表

vi /etc/hosts

(三台都需要操作)

10.1.30.52 bigdata52
10.1.30.53 bigdata53
10.1.30.54 bigdata54

1.5、修改hostname

直接输入hostname命令修改

hostname bigdata52
hostname bigdata53
hostname bigdata54
vi /etc/hostsname

(3台分别设置为52、53、54)

hostname bigdata52
hostname bigdata53
hostname bigdata54

重启机器生效

2、安装Hadoop

2.1、安装Hadoop2.7.3

单台初始化设置,设置完再拷贝到其他机器,下载hadoop

wget http://apache.claz.org/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz
mv hadoop2.7.6 hadoop
mv hadoop/ /usr/local/hadoop
vi /etc/profile
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH

保存(最后那行也需要,因为旧版本配置文件在hadoop/conf下,新版都在hadoop/etc/hadoop下面了,很多旧教程没有这条,开启会报错。)

source /etc/profile

2.2、Hadoop配置文件修改

建议当一台配置好之后,再将hadoop整个文件传输到另外2台.

vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh

将export JAVA_HOME=$JAVA_HOME   修改为

export JAVA_HOME=/usr/java/jdk18

然后修改4个配置文件

cd /usr/local/hadoop/etc/hadoop
vi   core-site.xml



        fs.defaultFS
        hdfs://bigdata52:9000



        hadoop.tmp.dir
        /usr/local/hadoop/tmp

vi hdfs-site.xml
               
             dfs.replication                
             1            


         dfs.namenode.secondary.http-address
         bigdata53:50090

#配置了备用的namenode为30.53

cp  mapred-site.xml.template  mapred-site.xml  
vi mapred-site.xml
  
  mapreduce.framework.name
  yarn
vi yarn-site.xml
                       
          yarn.resourcemanager.hostname 
          bigdata52 
              
       
          yarn.nodemanager.aux-services 
          mapreduce_shuffle 

2.3、拷贝到其他节点

scp -r hadoop [email protected]:/usr/local/hadoop 
scp -r hadoop [email protected]:/usr/local/hadoop

2.4、配置slave

vi /usr/local/hadoop/etc/hadoop/slaves
bigdata52
bigdata53
bigdata54

2.5、初始化命名

hdfs namenode -format

如果不是第一次格式化,格式化之前先删除/usr/local/hadoop/下面的tmp、logs两个目录

2.6、启动Hadoop

cd /usr/local/hadoop/sbin

启动程序。

sh start-all.sh

使用jps可以查看运行情况。

10.1.30.52-namenode(master)+datanode

1001.jpg

10.1.30.53-secondary-namenode+datanode

1002.jpg

10.1.30.54-datanode

1003.jpg

3、使用MapReduce进行wordcount

3.1wordcount(单词统计)

测试仅使用Hadoop自带的wordcount来进行测试。

hadoop fs -mkdir -p /usr/local/hadoop/input

 #fs方式创建文件夹input,这个是集群文件夹,直接操作系统ls看不到。注意后面都要使用全路径,否则会报错

cd /software
vi test.txt

然后随便往里面输入写内容,例如Hello World,Hello Hadoop,Hello Mapreduce三行内容

hadoop fs -put /software/test.txt /usr/local/hadoop/input

#把本地test.txt传到集群input文件夹

hadoop fs -ls /usr/local/hadoop/input

#查看input目录结构

hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount  /usr/local/hadoop/input output

#运行wordcount,版本根据实际替换,output也是个文件夹

hadoop fs -ls output

#查看output目录下面的文件

1005.jpg

hadoop fs -cat output/part-r-00000

#查看输出文件里面保存的结果

1006.jpg

3.2其他例子(计算圆周率

在mapreduce文件夹里面还有很多例子可以试用,例如圆周率计算。

hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar pi 10 10

#计算圆周率,第一个10是运行10次map任务,第二个10是每个map任务投掷次数,所以总投掷次数是10×10=100。

删除提示已经存在的输出文件夹

hadoop fs -rmr output


4、总结

4.1Hadoop与MapReduce的本质

按照我的理解,Hadoop是个软件,本质上是一个分布式计算的软件,MapReduce只是Hadoop里面的框架与方法论。

与负载均衡不同,负载均衡是对于很多个访问请求,分摊到不同的服务器来处理/响应。而分布式计算,是将一个很复杂的任务(可能需要很大量的CPU与内存计算资源)拆分(Map)成多个任务,每个任务分别分摊到1台服务器进行处理/计算,然后将所有服务器的计算结果汇总/合并(Reduce)成最终的结果,然后输出。

因为可以分布式(并行)计算,所以计算节点可以横向扩容(scale out),理论上可以无限节点横向扩容,提供足够多的计算资源去并行处理足够复杂的任务,可以大大提升计算性能与处理速度,减少计算等待时长。

4.2Hadoop的使用

与上面浅尝则止的直接调用现成example案例不同。真正需要使用MapReduce,去完成个性化的任务,是需要编程的。

MapReduce只是个框架而已,具体需要实现的业务逻辑,是需要调用Map与Reduce里面的类与方法,自行进行编写的。

至少要编写Mapper类、Reducer类,main函数,使用eclipse打包为一个jar包,再使用hadoop执行的。

具体还需要学习java的编程语言与面向对象的编程方法,并不是安装之后,即插即用的。

4.3关于大数据的一些思考

随着大数据的兴起,无论懂还是不懂的人,都喜欢著书立论说大数据如何厉害,如何神奇,有什么作用。但是市面上的8~9成的书籍,都是告诉你什么是大数据、大数据有什么作用,并且喜欢将大数据的作用神化。但是书里面从来都不会涉及,如何使用大数据,采用什么方法才能达到它说的作用,可能因为他们根本不知道。

书籍上面动不动就扯,你每天微博、朋友圈、淘宝、拼多多留下了好多数据,你的消费习惯、购买能力、饮食偏好、出入行踪,形成了好多数据,然后通过大数据分析(又来了,来来去去就那么一句,到底hadoop?mapreduce?spark?Hive?还是咋的?你说啊,怎么你不说了),就能画出你的用户画像,你是怎么样的人,然后给你精准营销,预测你的行动......(此处省略一万字)

问题是,真的那么神奇吗?通过“大数据分析”这个黑盒子,真的能够无所不能吗?答案当然是否定的。

如果你深入自己动手用java写过一个wordcount甚至更多的自定义分析实例出来,你就会发觉,使用大数据之前,你先需要:

1)你先要收集数据(可能通过写爬虫,从多个网站例如淘宝、京东、拼多多同时爬取商品信息过来,也可能通过其他手段)

2)然后还需要多数据做预处理与清洗(过滤不需要的数据、去除重复的数据、按照统一的规范与格式转换数据,如2019-07-13统一为2019/07/13等)

要达到上面两个目的,你需要自己最终想要什么,需要分析什么,什么样的数据与你分析的目标有关联,可能对你最终的目标分析有帮助,即你需要知道需要什么数据。

而不是书里面说的,只要把乱七八糟的海量数据回来,扔进去大数据分析系统,系统就会自动像机器学习、深度学习、神经网络那样,帮你自动挖掘、分析、提炼,找到你要的东西分析结论,那是不可能的。

你必须知道你需要什么,也需要写好算法告诉系统如何去分析(这才是重点)。

至此,数据准备完毕,你才能使用Hadoop,依照MapReduce框架:

1)编写如何将任务拆开

2)编写如何将计算结果整合

Hadoop只是帮你将原来1台机器要算1000个小时的工作量,变为并行计算,让你可以将1个大任务拆分为1000个小任务,让1000台机器可以同时帮你计算,1小时内算出并且汇总结果提供给你而已。只是帮你用分布式计算,缩短整个计算周期而已。


所以大数据分析根本就不是直接将海量的数据灌进去黑盒子,然后大数据自动帮你挖掘,机器学习,自动分析,最终告诉你结果。这个是完全的误解。

大数据分析只是帮你在处理海量的数据的时候,将任务拆分,分布式计算,用尽量短的时间帮你分析出结果而已。