Hadoop调戏日志

Hadoop 安装

配置单机版和伪分布式

  1. 首先去各自官网下载jdk和hadoop并解压到你想要安装的位置,建议下载oracle jdk 1.11 和 hadoop 3.3.0

  2. 配置环境变量
    编辑/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
  3. 这里请继续参照官方文档http://hadoop.apache.org/docs/current3/hadoop-project-dist/hadoop-common/SingleCluster.html完成搭建

可能遇到的错误
  1. 第3步按照官方教程配置过程中,在执行sbin/start-dfs.sh时报错localhost: rcmd: socket: Permission denied,执行

    sudo bash -c "echo ssh > /etc/pdsh/rcmd_default"

    即可解决

  2. 我在自己的电脑上按照官方文档配置进行样例测试的时候遇到错误 找不到或无法加载主类 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 >

配置完全分布式

各节点共同的设置

  1. 修改配置文件
    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
  2. 配置hosts

    192.168.37.140 master
    192.168.37.141 worker1
    192.168.37.142 worker2
    192.168.37.143 worker3
  3. 删除hdfs的tmp文件,默认在/tmp下

    sudo rm -rf /tmp/*

各节点不同的设置

  1. 修改各节点的主机名和IP地址以匹配hosts

    sudo nano /etc/hostname
  2. 各节点重新生成ssh公钥

    ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

master独有的设置

  1. 获取获取并分发各节点公钥,以实现互相免密码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
  2. 重新格式化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. 实验环境说明和注意事项

  1. 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
  2. Hadoop集群网络环境

    192.168.37.140 master
    192.168.37.141 worker1
    192.168.37.142 worker2
    192.168.37.143 worker3
  3. 注意事项

    本文原本旨在本地没有Hadoop环境,甚至没有Java环境的情况下,远程在Hadoop集群上编写运行Hadoop程序。

    因此如果本地正确配置了Hadoop环境,能够直接使用hadoop jar xxx.jar args向Hadoop集群提交任务,则无需远程编写Hadoop程序,即不需要执行注明有(仅远程环境)的步骤。

Step 1. 客户端VS Code安装插件

  1. 安装 Java Extension Pack 插件

  2. (仅远程环境) 安装 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设置项
    file

  • 其实也可以设置无密码登录,将 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登陆

  1. 点左侧的远程图标打开侧边栏的远程面板

  2. 点击远程面板上SSH TARGETS右侧的加号添加远程设备

  3. 在弹出的Enter SSH Connection Command面板中输入SSH连接命令

  4. 在终端中输入密码以连接

Step 5. (仅远程环境)客户端 VS Code 在 master 上加载 Java Extension Pack 插件

  • 打开SSH远程连接后VS Code 会重新载入,重新载入后在插件面板里启用远程的Java插件包
    file

Step 6. 创建一个JAVA项目

  1. 点击左侧第一个文件图标,在JAVA PROJECTS选项卡下点击Create New Java Proects按钮创建新的项目

  2. 在弹出来的面板上选择 No build tools(如果你明白这是什么意思,你也可以根据需要选其他的)
    file

  3. 在弹出来的打开文件夹对话框上直接确定(打开),如果你有需要也可选你想要存放Java项目的目录(根据系统环境实际界面可能和截图不同,不要再问了)
    file

  4. 输入项目名称,可以随便取,回车后VS Code会在指定目录下新建项目名称文件夹
    file

  5. 然后VS Code会重新打开编辑器,进入刚创建的项目文件夹。如果是SSH连接远程的话需要再输入一次密码

Step 7. 写一个WordCount

  • 在src目录下新建一个WordCount.java,这里我就不写了,直接粘贴官方的WordCount示例代码进去

  • P.S. JAVA不熟悉的同学注意不要把package那行给复制进去了啊

Step 8. 载入hadoop依赖包

  1. 在项目根目录下新建一个.vscode 文件夹(如果没有的话)
    file
    这样也可以
    file

  2. .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. 配置自动编译运行任务

  1. 在.vscode文件夹下新建task.json或者ctrl+shift+p调出命令面板输入tasks选择配置生成任务
    file

  2. 选择使用模板创建tasks.json文件

  3. 选择Others
    file

上述三步其实就是在.vscode文件夹下新建了一个tasks.json

  1. 使用如下代码代替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插件调试运行

  1. 在.vscode文件夹下新建launch.json文件

  2. 将下列代码替换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程序

  1. 如果项目下没有bin文件夹,请先建立bin文件夹

  2. 切换到WordCount.java文件

  3. 使用ctrl+shift+B调用tasks执行hadoop - start service启动hadoop

  4. 然后再次使用ctrl+shift+B调用tasks执行hadoop - run编译运行WordCount程序

  5. 也可以使用F5调试运行WordCount程序

  6. 查看输出结果,程序运行完后会自动在终端打印结果,同时会将结果复制到项目的output文件夹下

  7. 在hadoop出现故障时可以使用使用ctrl+shift+B调用tasks执行hadoop - stop service关闭hadoop

file

结语

配置过程中遇到的困难主要有两点

  1. 首先因为自己没怎么编译过java,研究打包java花了不少时间

  2. 其次是第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这两个关键字。

标签:

不说点什么喵?

1 × 5 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据