当前位置:   article > 正文

hadoop的学习心得_hadoop学习心得

hadoop学习心得

本片文章需要一定的java jdbc 连接数据库的经验。 

目录

一.hadoop的组件

HDFS

MapReduce

Hbase

二. MapReduce编程

1.统计重复数据

源代码

数据库结果

2.将详细数据存入Hbase 

 源代码

 三,运行时的报错

错误:java.lang.UnsatisfiedLinkError

方法一:

方法二:

 错误:java.lang.ClassCastException

解决方法:


一.hadoop的组件

HDFS

        HDFS的全称为Hadoop Distributed File System,是Hadoop分布式文件系统。是指被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。

        HDFS能提供高吞吐量的数据访问,会对大文件进行切块,且每个切块都会备份,保证数据的高可用,适合那些有着超大数据集的应用程序。

MapReduce

        MapReduce是一种分布式技术框架,分布式计算是将该应用分解成许多小的部分,分配给多台计算机进行处理,以达到提交计算效率的目的,减少大规模数据计算的时间。

Hbase

        HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式数据存储系统”。HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。

二. MapReduce编程

现在我们有如下json格式的数据集(条数不限):

 {"车架号":"vin2364235","行驶总里程":762,"速度":0,"汽车状态":"停泊中","充电状态":"待充电","剩余电量":"93%","电量预警":"电量充足","生成时间":"2023-06-26 11:01:16"}

1.统计重复数据

数据集中有若干条的重复数据(所有的字段值相同即视为重复),需要统计。

因为 Reduce阶段会将完全相同key值分为一组,所有Map阶段将整条记录作为key值,value定义为1,方便后续统计。

源代码

main方法

  1. public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
  2. Configuration conf = new Configuration();
  3. conf.set("fs.defaultFS","hdfs://20210322053-master:9000");
  4. Job jod = Job.getInstance(conf,"repeat2");
  5. jod.setJarByClass(part3_2.class);
  6. jod.setMapperClass(part3_2.map.class);
  7. jod.setReducerClass(part3_2.reducer.class);
  8. jod.setMapOutputKeyClass(Text.class);
  9. jod.setMapOutputValueClass(IntWritable.class);
  10. jod.setOutputKeyClass(Text.class);
  11. jod.setOutputValueClass(IntWritable.class);
  12. FileInputFormat.setInputPaths(jod,new Path(args[0]));
  13. FileOutputFormat.setOutputPath(jod,new Path(args[1]));
  14. System.exit(jod.waitForCompletion(true)?0:1);
  15. }

Map类 

  1. public static class map extends Mapper<Object, Text,Text,IntWritable> {
  2. @Override
  3. protected void map(Object key, Text value,Context context) throws IOException, InterruptedException {
  4. context.write(value,new IntWritable(1));
  5. }
  6. }

 Reduce类

        在无参构造方法中定义jdbc的连接。使用Gson类将字符串的数据转换为Map字典方便后续的调用,由于文件是一行一行读取的,有可能会读取到空行,导致Gson为空。所以在输出前进行判断。

  1. public static class reducer extends Reducer<Text,IntWritable,Text,IntWritable> {
  2. private Connection conn;
  3. public reducer() {
  4. try {
  5. Class.forName("com.mysql.cj.jdbc.Driver");
  6. String url = "jdbc:mysql://20210322053-master:3306/hadoop?serverTimezone=UTC&useSSL=false&characterEncoding=utf-8";
  7. conn = DriverManager.getConnection(url, "root", "123456");
  8. } catch (SQLException e) {
  9. throw new RuntimeException(e);
  10. } catch (ClassNotFoundException e) {
  11. throw new RuntimeException(e);
  12. }
  13. }
  14. @Override
  15. protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
  16. int total = 0;
  17. for(IntWritable one :values){
  18. total += one.get();
  19. }
  20. if (total>1) {
  21. Gson gson = new Gson();
  22. Map<String,String> data = gson.fromJson(key.toString(),Map.class);
  23. // 创建jdbc连接
  24. String sql = "insert into `repeat` values(?,?,?)";
  25. PreparedStatement pc = null;
  26. try {
  27. pc = conn.prepareStatement(sql);
  28. pc.setString(1,data.get("生成时间"));
  29. pc.setString(2,data.get("车架号"));
  30. pc.setInt(3,total);
  31. pc.execute();
  32. context.write(key,new IntWritable(total));
  33. } catch (SQLException e) {
  34. throw new RuntimeException(e);
  35. }
  36. }
  37. }
  38. }

数据库结果

2.将详细数据存入Hbase 

 源代码

main

  1. public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
  2. Configuration conf = new Configuration();
  3. conf.set("fs.defaultFS","hdfs://20210322053-master:9000");
  4. Job jod = Job.getInstance(conf,"repeat4");
  5. jod.setJarByClass(part3_4.class);
  6. jod.setMapperClass(part3_4.map .class);
  7. jod.setReducerClass(part3_4.reducer .class);
  8. jod.setMapOutputKeyClass(Text .class);
  9. jod.setMapOutputValueClass(IntWritable .class);
  10. jod.setOutputKeyClass(Text.class);
  11. jod.setOutputValueClass(IntWritable.class);
  12. FileInputFormat.setInputPaths(jod,new Path(args[0]));
  13. FileOutputFormat.setOutputPath(jod,new Path(args[1]));
  14. System.exit(jod.waitForCompletion(true)?0:1);
  15. }

Map类 

  1. public static class map extends Mapper<Object, Text,Text,IntWritable> {
  2. @Override
  3. protected void map(Object key, Text value,Context context) throws IOException, InterruptedException {
  4. context.write(value,new IntWritable(1));
  5. }
  6. }

 Reduce类

        在无参构造方法中定义Hbase数据库连接。数据列数较多时可采用遍历key值的方法将列名提取使用。

  1. public static class reducer extends Reducer<Text,IntWritable,Text,IntWritable> {
  2. private Connection conn;
  3. public reducer() {
  4. try {
  5. Configuration conf = HBaseConfiguration.create();
  6. conf.set("hbase.zookeeper.quorum","20210322053-master:2181");
  7. conn = ConnectionFactory.createConnection(conf);
  8. } catch (IOException e) {
  9. throw new RuntimeException(e);
  10. }
  11. }
  12. @Override
  13. protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
  14. Gson gson = new Gson();
  15. Map<String,String> data = gson.fromJson(key.toString(),Map.class);
  16. if (data!=null){
  17. String time = data.get("生成时间").split(" ")[0];
  18. Table car = conn.getTable(TableName.valueOf("car_data"));
  19. Put put = new Put((time+data.get("车架号")).getBytes());
  20. for (String x:data.keySet()) {
  21. String value = String.valueOf(data.get(x));
  22. put.addColumn("data".getBytes(),x.getBytes(),value.getBytes());
  23. }
  24. car.put(put);
  25. car.close();
  26. context.write(key,null);
  27. }
  28. }
  29. }

 三,运行时的报错

错误:java.lang.UnsatisfiedLinkError

'boolean org.apache.hadoop.io.nativeio.NativeIO$Window

方法一:

在C:\Windows 下添加hadoop.dll

方法二:

下载windows版本的hadoop,将bin与sbin配置在PATH环境变量中。

 

 错误:java.lang.ClassCastException

java.lang.String cannot be cast to java.lang.Double

解决方法:

1.直接使用tosting的方式

String str = entry.value().toString();

2.使用String类的静态方法valueOf()

String str = String.valueOf(entry.value());

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/485938
推荐阅读
相关标签
  

闽ICP备14008679号