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
10.1.30.53-secondary-namenode+datanode
10.1.30.54-datanode
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目录下面的文件
hadoop fs -cat output/part-r-00000
#查看输出文件里面保存的结果
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小时内算出并且汇总结果提供给你而已。只是帮你用分布式计算,缩短整个计算周期而已。
所以大数据分析根本就不是直接将海量的数据灌进去黑盒子,然后大数据自动帮你挖掘,机器学习,自动分析,最终告诉你结果。这个是完全的误解。
大数据分析只是帮你在处理海量的数据的时候,将任务拆分,分布式计算,用尽量短的时间帮你分析出结果而已。