最近有个需求,计算用户画像。

系统大概有800W的用户量,算每个用户的一些数据。

数据量比较大,算用hive还是毫无压力的,但是写的oracle,在给出数据给前端,就比较难受了。

然后换了种解决方法:

  1.hive计算,写的HDFS

  2.API读出来,写到hbase(hdfs和hbase的版本不匹配,没办法用sqoop 直接导)

然后问题就来了。

需要写个API,读HDFS上的文件。

主要类:ReadHDFS 

public class ReadHDFS {

    public static void main(String[]args){

        long startLong = System.currentTimeMillis();
HDFSReadLog.writeLog("start read file");
String path;
if (args.length > 1) {
// path = args[0];
Constant.init(args[0],args[1]);
}
HDFSReadLog.writeLog(Constant.PATH); try {
getFile(Constant.URI + Constant.PATH);
} catch (IOException e) {
e.printStackTrace();
} long endLong = System.currentTimeMillis();
HDFSReadLog.writeLog("cost " + (endLong -startLong)/1000 + " seconds");
HDFSReadLog.writeLog("cost " + (endLong -startLong)/1000/60 + " minute");
} private static void getFile(String filePath) throws IOException { FileSystem fs = FileSystem.get(URI.create(filePath), HDFSConf.getConf());
Path path = new Path(filePath);
if (fs.exists(path) && fs.isDirectory(path)) { FileStatus[] stats = fs.listStatus(path);
FSDataInputStream is;
FileStatus stat;
byte[] buffer;
int index;
StringBuilder lastStr = new StringBuilder();
for(FileStatus file : stats){
try{
HDFSReadLog.writeLog("start read : " + file.getPath());
is = fs.open(file.getPath());
stat = fs.getFileStatus(path);
int sum = is.available();
if(sum == 0){
HDFSReadLog.writeLog("have no data : " + file.getPath() );
continue;
}
HDFSReadLog.writeLog("there have : " + sum + " bytes" );
buffer = new byte[sum];
            // 注意一点,如果文件太大了,可能会内存不够用。在本机测得时候,读一个100多M的文件,导致内存不够。
is.readFully(0,buffer);
String result = Bytes.toString(buffer);
// 写到 hbase
WriteHBase.writeHbase(result); is.close();
HDFSReadLog.writeLog("read : " + file.getPath() + " end");
}catch (IOException e){
e.printStackTrace();
HDFSReadLog.writeLog("read " + file.getPath() +" error");
HDFSReadLog.writeLog(e.getMessage());
}
}
HDFSReadLog.writeLog("Read End");
fs.close(); }else {
HDFSReadLog.writeLog(path + " is not exists");
} }
}

配置类:HDFSConfie(赶紧没什么用,url和path配好了,不需要配置就可以读)

public class HDFSConf {

    public static Configuration conf = null;
public static Configuration getConf(){
if (conf == null){
conf = new Configuration();
String path = Constant.getSysEnv("HADOOP_HOME")+"/etc/hadoop/";
HDFSReadLog.writeLog("Get hadoop home : " + Constant.getSysEnv("HADOOP_HOME"));
// hdfs conf
conf.addResource(path+"core-site.xml");
conf.addResource(path+"hdfs-site.xml");
conf.addResource(path+"mapred-site.xml");
conf.addResource(path+"yarn-site.xml");
}
return conf;
} }

一些常量:

 url : hdfs:ip:prot

 path : HDFS的路径

注: 考虑到读的表,可能不止有一个文件,做了循环。

看下篇,往hbase写数据

Java 读取HDFS文件系统的更多相关文章

  1. 通过java读取HDFS的数据 (转)

    原文链接:通过java读取HDFS的数据 通过JAVA直接读取HDFS中的时候,一定会用到FSDataInputStream类,通过FSDataInputStream以流的形式从HDFS读数据代码如下 ...

  2. java读取HDFS压缩文件乱码

    java通过调用HDFS系统的FileSystem等API 直接读取HDFS的压缩文件会产生乱码 解决方法: 1.调用解码的API,解码后通过IO流处理. public static void mai ...

  3. JAVA读取HDFS信息

    uri填路径 public static void main(String[] args) throws IOException { String uri = "/user/WeiboAD/ ...

  4. hadoop学习(三)HDFS常用命令以及java操作HDFS

    一.HDFS的常用命令 1.查看根目录下的信息:./hadoop dfs -ls 2.查看根目录下的in目录中的内容:./hadoop dfs -ls in或者./hadoop dfs -ls ./i ...

  5. hadoop系列二:HDFS文件系统的命令及JAVA客户端API

    转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...

  6. HDFS文件系统基操--Java实现

    Java实现对HDFS文件系统的基本操作 1.准备好jar包 2.创建一个类 1. 测试连接 @Test //测试是否连接成功 public void test() { //添加配置 ==> c ...

  7. 使用JAVA API读取HDFS的文件数据出现乱码的解决方案

    使用JAVA api读取HDFS文件乱码踩坑 想写一个读取HFDS上的部分文件数据做预览的接口,根据网上的博客实现后,发现有时读取信息会出现乱码,例如读取一个csv时,字符串之间被逗号分割 英文字符串 ...

  8. 使用Java API操作HDFS文件系统

    使用Junit封装HFDS import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org ...

  9. Java API 读取HDFS的单文件

    HDFS上的单文件: -bash-3.2$ hadoop fs -ls /user/pms/ouyangyewei/data/input/combineorder/repeat_rec_categor ...

随机推荐

  1. navicat连接虚拟机中mysql"Access denied for user'root'@'IP地址'"问题

    登陆要链接的服务器上的mysql 命令:mysql -uroot -p123456 然后执行 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED ...

  2. django的优缺点(非原创)

    Django 大包大揽,用它来快速开发一些 Web 应用是不错的.如果你顺着 Django 的设计哲学来,你会觉得 Django 很好用,越用越顺手:相反,你如果不能融入或接受 Django 的设计哲 ...

  3. Python开发【第三篇】:Python函数

    set     无序,不重复,可嵌套. 函数     创建函数:     1.def关键字,创建函数     2.函数名     3.()     4.函数体     5.返回值 发邮件函数 def ...

  4. HW3 纠结的心得

    改好的controller //yuec2 Yue Cheng package hw3; import java.io.File; import java.text.DecimalFormat; im ...

  5. AngularJS——第9章 模块加载

    第9章 模块加载 AngularJS模块可以在被加载和执行之前对其自身进行配置.我们可以在应用的加载阶段配置不同的逻辑. [AngularJS执行流程] 启动阶段(startup) 开始 --> ...

  6. 利用Java创建Windows服务

    1.Java测试代码 import org.apache.log4j.Logger; public class Test { private static Logger logger = Logger ...

  7. Comparing Code Playgrounds Codepen, JSFiddle, JS Bin, Dabblet, CSS Deck, and Liveweave

    What is a code playground? Codepen, JSFiddle, JS Bin, Dabblet, CSS Deck, and Liveweave are HTML, CSS ...

  8. 当前上下文中不存在viewbag

    参考链接:http://www.cnblogs.com/chas/p/5076297.html view文件夹下的web.config中的appsetting节点中缺少了 <add key=&q ...

  9. Oracle_高级功能(7) 数据字典视图和动态性能视图

    oracle数据字典 1.概念数据字典是oracle数据库用来存储数据库结构信息的地方.数据字典是用来描述数据库数据的组织方式的,由表和视图组成.数据字典基表是在任何 Oracle 数据库中创建的第一 ...

  10. Oracle_PL/SQL(1) 匿名块

    1. PL/SQL 简介PL/SQL是一种比较复杂的程序设计语言, 用于从各种环境中访问Oracle数据库.为什么使用PL/SQL?Orade是一种关系型数据库, 用来访问关系型数据库的语言是 “结构 ...