大数据下:上传java代码到Hadoop上运行实例

2018-06-26  本文已影响64人  大炮对着虫子

在实现了hadoop的伪分布式部署,接下来打算通过编写几个例子来感受下在hadoop上是如何运行java代码的。

例子一:读取hdfs上文件的数据输出到控制台。

实现功能思路:
1、数据源:需要在hdfs上创建数据源
2、java代码:程序的入口

一、启动hadoop环境
strart-all.sh    启动hadoop环境
stop-all.sh      关闭hadoop环境
jps                查看java进程,检查hadoop是否正常启动

附带一个小技巧:
可能会忘了start-all.sh全拼,记不住的情况下,可以输入 start(前几个字母)后+ 两次Tab键。

二、创建目录

在linux目录下自己建立一个目录 input,myclass用以存放数据和java代码。
我的路径为:


[hadoop@Hadoop travis]$ pwd
/home/hadoop/travis
mkdir input
mkdir myclass

在input目录下创建quangle.txt文件并输入内容数据

cd input
touch quangle.txt
vi quangle.txt

数据:

On the top of the Crumpetty Tree
The Quangle Wangle sat,
But his face you could not see,
On account of his Beaver Hat.

接下来要将刚刚建立的linux本地的quangle.txt上传到hdfs上

hadoop fs -mkdir  /class4         在hdfs上创建文件夹class4
hadoop fs -ls /                 显示hdfs根目录下的文件信息
hdfs 上目录

接下来,将linux本地上的quangle.txt上传到hdfs上

[hadoop@Hadoop travis]$ cd input
[hadoop@Hadoop input]$ hadoop fs -copyFromLocal quangle.txt /class4/quangle.txt
hadoop fs -ls /class4/quangle.txt
显示hdfs上文件
三、配置本地环境

数据源有了,那么我们现在,打算将刚才创建的myclass作为运行java代码的空间,那么hadoop怎么认可这个我们自己创建的文件夹呢,这个时候需要我们去配置HADOOP_CLASSPATH

找到hadoop-env.sh
加入对HADOOP_CLASSPATH变量值,值为myclass的路径,保存编辑后使配置文件生效。
image.png
使配置文件生效:
source hadoop-env.sh
四、上传java代码到hadoop
1、jar包准备

通过http://mvnrepository.com/ 官网上去下载对应需要的jar包

hadoop所需jar包.png
2、编写代码

编写代码:读取hdfs上文件的数据,控制台输出

package test;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;




public class FileSystemCat {
    public static void main(String[] args) throws IOException {
        String uri=args[0];
        Configuration conf=new Configuration();
        FileSystem fs=FileSystem.get(URI.create(uri),conf);
        InputStream in=null;
        try{
        in=fs.open(new Path(uri));
        IOUtils.copyBytes(in, System.out, 4096,false);
        }finally
        {
            IOUtils.closeStream(in);
        }
        
    }
}

3、将java文件打包成可以运行的jar包

关于导成jar包,这里本人踩了一个坑,关于代码依赖的jar包的问题,一般选择Runable JAR file 能确保能运行,jar不会少


image.png

再通过winSCP将导出的jar包文件 上传到linux的myclass目录上。

五、运行验证数据

[hadoop@Hadoop myclass]$ hadoop jar FileSystemCat.jar /class4/quangle.txt
18/06/26 13:32:29 WARN util.NativeCodeLoader:
 Unable to load native-hadoop library for 
your platform... using builtin-java classes where applicable
n the top of the Crumpetty Tree
The Quangle Wangle sat,
But his face you could not see,
On account of his Beaver Hat.

六、期间踩过的坑

刚开始是 打算直接编译成.class文件而不是jar去运行,结果存在两个问题。

1、没有jar包

因为直接通过运行java编译成的class,则通过指令运行程序会发现找不到class

hadoop FileSystemCat  /class4/quangle.txt
image.png

解决方法:配置hadoop_classspath,将hadoop的jar包引进去

hadoop的jar包

打开hadoop-env.sh,加上 下面的代码


for f in /home/hadoop/hdfs/hadoop-2.6.0/share/hadoop/**/*.jar; do
  if [ "$HADOOP_CLASSPATH" ]; then
    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f
  else
    export HADOOP_CLASSPATH=$f
  fi
done

然后打开.bashrc文件

[hadoop@Hadoop ~]$ pwd
/home/hadoop
[hadoop@Hadoop ~]$ vi .bashrc

将HADOOP_CLASSPATH环境给拼接上去
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$HADOOP_CLASSPATH

2、编译带package和不带package

我是通过eclipse上编写编译后通过winSCP上传到linux上,


image.png

如果只是简单的放到myclass文件目录上,会路径错误。
解决方法两种: 1、在myclass上创建test目录,将.class文件上传到test上。
2、通过指令 进行编译,则会自动生成文件目录

javac -d .  FileSystemCat.java
上一篇 下一篇

猜你喜欢

热点阅读