现在很多公司要分析用户行为、销售数据或者日志信息,数据量动辄几十GB甚至上TB。这时候单台机器根本跑不动,得靠分布式系统来扛。Hadoop就是干这个的——把一堆普通服务器联合起来,像一个超级计算机那样处理海量数据。
为什么用虚拟机跑Hadoop
买一堆物理服务器成本太高,尤其对学习和测试来说不现实。虚拟机就成了最划算的选择。比如你在一台8核16G的电脑上装几个Linux虚拟机,每个分配2核4G,再配上Hadoop,就能模拟出一个小集群。不仅省钱,还能随时快照回滚,调试起来特别方便。
准备三台CentOS虚拟机
建议至少搭三个节点:一个NameNode(主节点),两个DataNode(从节点)。用VMware或VirtualBox都可以,系统选CentOS 7或Stream 8都行。网络模式设成“桥接”或“仅主机”,确保它们能互相ping通。
比如你给它们分别起名叫:
- hadoop-master(主节点)
- hadoop-slave1
- hadoop-slave2
然后修改每台机器的 /etc/hosts 文件,加上这些IP映射:
192.168.1.10 hadoop-master
192.168.1.11 hadoop-slave1
192.168.1.12 hadoop-slave2
配置SSH免密登录
Hadoop要求主节点能无密码登录各个从节点。在master上执行:
ssh-keygen -t rsa
一路回车生成密钥,然后把公钥复制到所有节点:
ssh-copy-id hadoop-master
ssh-copy-id hadoop-slave1
ssh-copy-id hadoop-slave2
之后就能直接 ssh hadoop-slave1 登录,不用输密码了。
安装Java和Hadoop
先确认Java已装好:
java -version
如果没装,可以用yum:
yum install java-1.8.0-openjdk-devel -y
下载Hadoop二进制包,解压到 /usr/local/hadoop:
tar -xzvf hadoop-3.3.6.tar.gz -C /usr/local/
修改Hadoop配置文件
进入 /usr/local/hadoop/etc/hadoop 目录,改几个关键文件。
在 core-site.xml 中设置文件系统地址:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-master:9000</value>
</property>
</configuration>
在 hdfs-site.xml 中设置副本数和数据目录:
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop/data/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop/data/datanode</value>
</property>
</configuration>
在 workers 文件里写上从节点主机名:
hadoop-slave1
hadoop-slave2
启动Hadoop集群
首次启动前格式化NameNode:
/usr/local/hadoop/bin/hdfs namenode -format
然后启动HDFS:
/usr/local/hadoop/sbin/start-dfs.sh
打开浏览器访问 http://hadoop-master:9870,能看到HDFS管理界面,两个DataNode在线就说明成功了。
跑个词频统计试试
准备一个文本文件 words.txt,内容是几行英文句子。上传到HDFS:
/usr/local/hadoop/bin/hdfs dfs -mkdir /input
/usr/local/hadoop/bin/hdfs dfs -put words.txt /input
运行自带的WordCount例子:
/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /input /output
完成后查看结果:
/usr/local/hadoop/bin/hdfs dfs -cat /output/part-r-00000
你会看到每个单词和它出现的次数。这就是最典型的大数据处理流程:读取、分片、映射、归约、输出。
这种环境虽然性能比不上真集群,但用来学Hadoop原理、写MapReduce逻辑、调试配置完全够用。等掌握了这套流程,迁移到云服务器或物理集群也只是规模变化而已。