在实现了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_CLASSPATH变量值,值为myclass的路径,保存编辑后使配置文件生效。
image.png
使配置文件生效:
source hadoop-env.sh
四、上传java代码到hadoop
1、jar包准备
通过http://mvnrepository.com/ 官网上去下载对应需要的jar包
是
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
网友评论