Hadoop 安装
配置单机版和伪分布式
-
首先去各自官网下载jdk和hadoop并解压到你想要安装的位置,建议下载oracle jdk 1.11 和 hadoop 3.3.0
-
配置环境变量
编辑/etc/profile
或~/.bashrc
添加如下代码,记得替换/path/to/jdk
为你解压的jdk的路径,/path/to/hadoop
为你解压的hadoop的路径export JAVA_HOME=/path/to/jdk export JAVA_JRE=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib: export HADOOP_HOME=/path/to/hadoop export HADOOP_MAPRED_HOME=$HADOOP_HOME export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
无论是编辑
/etc/profile
还是~/.bashrc
都可以,只不过一个是系统环境变量一个是用户环境变量,一个配置好后各个用户下都会有配置的环境变量,一个只有当前用户有。
编辑完毕保存后根据你编辑的文件执行source /etc/profile
或者
source ~/.bashrc
-
这里请继续参照官方文档http://hadoop.apache.org/docs/current3/hadoop-project-dist/hadoop-common/SingleCluster.html完成搭建
可能遇到的错误
-
第3步按照官方教程配置过程中,在执行
sbin/start-dfs.sh
时报错localhost: rcmd: socket: Permission denied
,执行sudo bash -c "echo ssh > /etc/pdsh/rcmd_default"
即可解决
-
我在自己的电脑上按照官方文档配置进行样例测试的时候遇到错误
找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
,但是帮同学配置的时候却没有这个问题。emmm……总之如果遇到这个问题可以按如下方法解决。。。hadoop classpath
输出
/home/beatback/hadoop/etc/hadoop:/home/beatback/hadoop/share/hadoop/common/lib/*:/home/beatback/hadoop/share/hadoop/common/*:/home/beatback/hadoop/share/hadoop/hdfs:/home/beatback/hadoop/share/hadoop/hdfs/lib/*:/home/beatback/hadoop/share/hadoop/hdfs/*:/home/beatback/hadoop/share/hadoop/mapreduce/*:/home/beatback/hadoop/share/hadoop/yarn:/home/beatback/hadoop/share/hadoop/yarn/lib/*:/home/beatback/hadoop/share/hadoop/yarn/*
然后将输出内容按如下格式写入yarn-site.xml
<property> <name>yarn.application.classpath</name> <value>/home/beatback/hadoop/etc/hadoop:/home/beatback/hadoop/share/hadoop/common/lib/*:/home/beatback/hadoop/share/hadoop/common/*:/home/beatback/hadoop/share/hadoop/hdfs:/home/beatback/hadoop/share/hadoop/hdfs/lib/*:/home/beatback/hadoop/share/hadoop/hdfs/*:/home/beatback/hadoop/share/hadoop/mapreduce/*:/home/beatback/hadoop/share/hadoop/yarn:/home/beatback/hadoop/share/hadoop/yarn/lib/*:/home/beatback/hadoop/share/hadoop/yarn/*</value> </property >
配置完全分布式
各节点共同的设置
-
修改配置文件
core-site.xml<property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property>
mapred-site.xml
<property> <name>mapreduce.application.classpath</name> <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value> </property>
yarn-site.xml
<property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property>
workers
worker1 worker2 worker3
-
配置hosts
192.168.37.140 master 192.168.37.141 worker1 192.168.37.142 worker2 192.168.37.143 worker3
-
删除hdfs的tmp文件,默认在/tmp下
sudo rm -rf /tmp/*
各节点不同的设置
-
修改各节点的主机名和IP地址以匹配hosts
sudo nano /etc/hostname
-
各节点重新生成ssh公钥
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
master独有的设置
-
获取获取并分发各节点公钥,以实现互相免密码ssh登录,根据实际情况替换
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys scp <username>@worker1:~/.ssh/id_rsa /tmp/key cat /tmp/key >> ~/.ssh/authorized_keys scp <username>@worker2:~/.ssh/id_rsa /tmp/key cat /tmp/key >> ~/.ssh/authorized_keys scp <username>@worker3:~/.ssh/id_rsa /tmp/key cat /tmp/key >> ~/.ssh/authorized_keys scp ~/.ssh/authorized_keys <username>@worker1:~/.ssh/authorized_keys scp ~/.ssh/authorized_keys <username>@worker2:~/.ssh/authorized_keys scp ~/.ssh/authorized_keys <username>@worker3:~/.ssh/authorized_keys
-
重新格式化hdfs并启动hadoop,在hdfs里创建用户目录,请将username换成你的用户名
hdfs namenode -format start-all.sh hdfs dfs -mkdir /user hdfs dfs -mkdir /user/username
验证配置
- 检验各节点是否正确工作
jps
如果master节点只有namenode没有datanode而且worker节点只有datanode没有namenode就算配置成功了。
Visual Studio Code 远程编写编译运行hadoop java 程序
Step 0. 实验环境说明和注意事项
-
Hadoop集群软件环境
OS:Deepin 20 Beta Java Version: Oracle JDK 11.0.9 Java Location: /home/beatback/jdk Hadoop Version: 3.3.0 Cluster Hadoop Location: /home/beatback/hadoop
-
Hadoop集群网络环境
192.168.37.140 master 192.168.37.141 worker1 192.168.37.142 worker2 192.168.37.143 worker3
-
注意事项
本文原本旨在本地没有Hadoop环境,甚至没有Java环境的情况下,远程在Hadoop集群上编写运行Hadoop程序。
因此如果本地正确配置了Hadoop环境,能够直接使用
hadoop jar xxx.jar args
向Hadoop集群提交任务,则无需远程编写Hadoop程序,即不需要执行注明有(仅远程环境)的步骤。
Step 1. 客户端VS Code安装插件
-
安装 Java Extension Pack 插件
-
(仅远程环境) 安装 Remote SSH 插件
Step 2. 安装 jdk 11
-
VS Code的Java插件需要至少 Java 11 或者更新的版本,如果你本来装的就是高版本的JAVA 可以跳过这一步
-
如果需要安装Java 11请安装Oracle JDK 11,并配置环境变量和hadoop-env.sh中的JAVA_HOME为jdk 11的路径。(参照配置单机版和伪分布式中对应的步骤)
Step 3. (仅远程环境)客户端 VS Code 设置 SSH 密码登录
-
在VS Code设置面板的
用户
设置下勾选Remote-SSH
扩展的Show Login Terminal
设置项
-
其实也可以设置无密码登录,将 master 的 ~/.ssh/id_rsa.pub 的内容 添加到 用户文件夹下的.ssh文件夹里的 authorized_keys
scp beatback@master:.ssh/id_rsa.pub tmp type tmp >> %appdata%/../../.ssh/authorized_keys del tmp
Step 4. (仅远程环境)客户端 VS Code 打开远程连接 并 输入密码完成SSH登陆
-
点左侧的远程图标打开侧边栏的远程面板
-
点击远程面板上
SSH TARGETS
右侧的加号添加远程设备 -
在弹出的
Enter SSH Connection Command
面板中输入SSH连接命令
-
在终端中输入密码以连接
Step 5. (仅远程环境)客户端 VS Code 在 master 上加载 Java Extension Pack 插件
- 打开SSH远程连接后VS Code 会重新载入,重新载入后在插件面板里启用远程的Java插件包
Step 6. 创建一个JAVA项目
-
点击左侧第一个文件图标,在JAVA PROJECTS选项卡下点击Create New Java Proects按钮创建新的项目
-
在弹出来的面板上选择 No build tools(如果你明白这是什么意思,你也可以根据需要选其他的)
-
在弹出来的打开文件夹对话框上直接确定(打开),如果你有需要也可选你想要存放Java项目的目录(根据系统环境实际界面可能和截图不同,不要再问了)
-
输入项目名称,可以随便取,回车后VS Code会在指定目录下新建项目名称文件夹
-
然后VS Code会重新打开编辑器,进入刚创建的项目文件夹。如果是SSH连接远程的话需要再输入一次密码
Step 7. 写一个WordCount
-
在src目录下新建一个
WordCount.java
,这里我就不写了,直接粘贴官方的WordCount示例代码进去 -
P.S. JAVA不熟悉的同学注意不要把package那行给复制进去了啊
Step 8. 载入hadoop依赖包
-
在项目根目录下新建一个.vscode 文件夹(如果没有的话)
这样也可以
-
.vscode 文件夹下新建一个 settings.json 文件并编辑如下
{ "java.project.referencedLibraries": [ "lib/**/*.jar", "/home/beatback/hadoop/etc/hadoop", "/home/beatback/hadoop/share/hadoop/common/lib/*", "/home/beatback/hadoop/share/hadoop/common/*", "/home/beatback/hadoop/share/hadoop/hdfs", "/home/beatback/hadoop/share/hadoop/hdfs/lib/*", "/home/beatback/hadoop/share/hadoop/hdfs/*", "/home/beatback/hadoop/share/hadoop/mapreduce/*", "/home/beatback/hadoop/share/hadoop/yarn", "/home/beatback/hadoop/share/hadoop/yarn/lib/*", "/home/beatback/hadoop/share/hadoop/yarn/*", ], }
Step 9. 配置自动编译运行任务
-
在.vscode文件夹下新建task.json或者
ctrl+shift+p
调出命令面板输入tasks选择配置生成任务
-
选择使用模板创建tasks.json文件
-
选择Others
上述三步其实就是在.vscode文件夹下新建了一个tasks.json
-
使用如下代码代替tasks.json中的内容
{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "label": "hadoop - start service", "type": "shell", "command": "start-all.sh", "options": { "cwd": "${workspaceFolder}" }, "group": "build" }, { "label": "hadoop - run", "type": "shell", "command": "(hadoop jar bin/test.jar ${fileBasenameNoExtension} /input /output )&&(rm -rf output || :)&&( hdfs dfs -get /output . ; cat output/*)", "options": { "cwd": "${workspaceFolder}" }, "group": "build", "dependsOn":["hadoop - build"] }, { "label": "hadoop - run without build", "type": "shell", "command": "(hadoop jar bin/test.jar ${fileBasenameNoExtension} /input /output )&&(rm -rf output || :)&&(hdfs dfs -get /output . ; cat output/*)", "options": { "cwd": "${workspaceFolder}" }, "group": "test", "dependsOn":["hadoop - upload input"] }, { "label": "hadoop - stop service", "type": "shell", "command": "stop-all.sh", "options": { "cwd": "${workspaceFolder}" }, "group": "build" }, { "label": "hadoop - build", "type": "shell", "command": "(rm -rf /tmp/a2f2ed || : )&&( mkdir /tmp/a2f2ed || : )&&( javac -cp $(hadoop classpath) -d /tmp/a2f2ed ${file} )&&( jar -cvf bin/test.jar -C /tmp/a2f2ed . )", "options": { "cwd": "${workspaceFolder}" }, "group": "build", "dependsOn":["hadoop - upload input"] }, { "label": "hadoop - upload input", "type": "shell", "command":"(hdfs dfs -rm -r /input || : )&&( hdfs dfs -put input / )&&( hdfs dfs -rm -r /output || :)&&(rm -rf output || :)", "options": { "cwd": "${workspaceFolder}" }, "group": "build" } ] }
Step 10. 设置Java插件调试运行
-
在.vscode文件夹下新建launch.json文件
-
将下列代码替换launch.json内容,
master:9000
请替换为实际hdfs地址,例如localhost:9000
{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "java", "name": "Debug (Launch)", "request": "launch", "mainClass": "org.apache.hadoop.util.RunJar", "args": ["bin/test.jar", "${fileBasenameNoExtension}", "hdfs://master:9000/input", "hdfs://master:9000/output","&&","hdfs","dfs","-get","/output",".","&&","cat","output/*"], "preLaunchTask": "hadoop - build" }, ] }
Step 11. 创建测试样例
- 项目下新建input文件夹,并放入一个test.txt,输入任意英文,比如
HELLO WORLD THIS IS A HELLO WORLD DEMO IN HADOOP WORLD
Step 12. 编译运行和调试WordCount程序
-
如果项目下没有bin文件夹,请先建立bin文件夹
-
切换到WordCount.java文件
-
使用
ctrl+shift+B
调用tasks执行hadoop - start service
启动hadoop -
然后再次使用
ctrl+shift+B
调用tasks执行hadoop - run
编译运行WordCount程序 -
也可以使用
F5
调试运行WordCount程序 -
查看输出结果,程序运行完后会自动在终端打印结果,同时会将结果复制到项目的output文件夹下
-
在hadoop出现故障时可以使用使用
ctrl+shift+B
调用tasks执行hadoop - stop service
关闭hadoop
结语
配置过程中遇到的困难主要有两点
-
首先因为自己没怎么编译过java,研究打包java花了不少时间
-
其次是第8步的自动编译执行脚本花费了我很多时间,~因为java插件没法配置让编译出来的程序由hadoop执行,~vscode也没有像eclipse那样的插件,并且google上也找不到有人配置过vscode的hadoop编程环境,因此我在vscode的官方文档找到发现tasks可能可以实现自动编译就花了好几个小时,在不停失败后实现了自动编译hadoop执行的功能
后来在检索资料的时候了解到hadoop jar xxx.jar
的本质是java org.apache.hadoop.util.RunJar xxx.jar
,理论上就能利用java插件调试运行hadoop程序了,于是就又花了大半天时间写了launch.json以支持调试
远程ssh连接到hadoop集群在集群上编写编译hadoop集群的优势是本地不需要安装hadoop,甚至连java都不需要,尤其方便windows客户端连接hadoop集群的情况,不过缺点就是ssh连接一断开就不能编辑了。
最后自夸一下,这估计是全网首发的VS Code配置Hadoop集群编程环境的教程,之前无论是百度还是谷歌都找不到任何页面同时存在Hadoop 和 VS Code 或者 Visual Studio Code这两个关键字。
tql