使用命令行查找hdfs分布式文件中的总行数

koaltpgm  于 2021-06-03  发布在  Hadoop
关注(0)|答案(6)|浏览(498)

我正在研究一个集群,其中保存了一个数据集 hdfs 以分散的方式。以下是我所拥有的:

[hmi@bdadev-5 ~]$ hadoop fs -ls /bdatest/clm/data/
Found 1840 items
-rw-r--r--   3 bda supergroup          0 2015-08-11 00:32 /bdatest/clm/data/_SUCCESS
-rw-r--r--   3 bda supergroup   34404390 2015-08-11 00:32 /bdatest/clm/data/part-00000
-rw-r--r--   3 bda supergroup   34404062 2015-08-11 00:32 /bdatest/clm/data/part-00001
-rw-r--r--   3 bda supergroup   34404259 2015-08-11 00:32 /bdatest/clm/data/part-00002
....
....

数据的形式如下:

[hmi@bdadev-5 ~]$ hadoop fs -cat /bdatest/clm/data/part-00000|head
V|485715986|1|8ca217a3d75d8236|Y|Y|Y|Y/1X||Trimode|SAMSUNG|1x/Trimode|High|Phone|N|Y|Y|Y|N|Basic|Basic|Basic|Basic|N|N|N|N|Y|N|Basic-Communicator|Y|Basic|N|Y|1X|Basic|1X|||SAM|Other|SCH-A870|SCH-A870|N|N|M2MC|

所以,我要做的是计算原始数据文件中的总行数 data . 我的理解是 part-00000 , part-00001 等有重叠。所以只要数一数 part-x 把文件和它们相加是行不通的。还有原始数据集 data 大小不一 ~70GB . 如何有效地找出行的总数?

dxpyg8gm

dxpyg8gm1#

如果你只需要找出数据中的行数。可以使用以下命令:

hdfs dfs -cat /bdatest/clm/data/part-* | wc -l

也可以用identity mapper编写一个简单的mapreduce程序,将输入作为输出输出。然后检查计数器并找到Map器的输入记录。这将是数据中的行数。

uinbv5nw

uinbv5nw2#

如果您有一个非常大的文件,其行内容大致相同(我可以想象一个json或一个日志条目),并且您不关心精度,那么您可以计算它。
例如,我将原始json存储在一个文件中:
文件大小:750mo第一行大小:752个字符(=>752个八位字节)
行=>约1.020.091
跑步 cat | wc -l 给出1.018.932
还不错^^

wkyowqbh

wkyowqbh3#

hadoop一行:

hadoop fs -cat /bdatest/clm/data/part-* | wc -l

资料来源:http://www.sasanalysis.com/2014/04/10-popular-linux-commands-for-hadoop.html
另一种方法是创建一个map reduce作业,其中mapper为每行发出1,reducer对值求和。请参阅编写mapreduce代码的公认答案以了解解决方案的记录数。

zpf6vheq

zpf6vheq4#

您可以使用hadoop流来解决这个问题。
您可以这样运行它:

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-streaming-2.6.0-cdh5.11.0.jar -input <dir> -output <dir> counter_mapper.py -reducer counter_reducery -file counter_mapper.py -file counter_reducer.py

计数器Map器.py


# !/usr/bin/env python

import sys
count = 0

for line in sys.stdin:
    count = count + 1

print count

计数器\u.py


# !/usr/bin/env python

import sys
count = 0

for line in sys.stdin:
    count = count +int(line)

print count
pb3s4cty

pb3s4cty5#

更有效地——你可以使用spark来计算行数。下面的代码段有助于计算行数。

text_file = spark.textFile("hdfs://...")
count = text_file.count();
count.dump();

显示行数。 Note: The data in different part files will not overlap 使用 hdfs dfs -cat /bdatest/clm/data/part-* | wc -l 也会给你的输出,但这将转储所有的数据到本地机器,需要更长的时间。
最好的解决方案是使用mapreduce或spark。mapreduce的开发和执行将花费较长的时间。如果安装了Spark,这是最好的选择。

bjp0bcyl

bjp0bcyl6#

这是一个非常常见的任务,我希望在fs中有一个子命令来完成它(例如。 hadoop fs -wc -l inputdir )避免将所有内容流式传输到执行“wc-l”命令的一台计算机。
为了有效地计算行数,我经常使用hadoop流和unix命令,如下所示:

hadoop jar ${HADOOP_HOME}/hadoop-streaming.jar \
  -Dmapred.reduce.tasks=1 \
  -input inputdir \
  -output outputdir \
  -mapper "bash -c 'paste <(echo "count") <(wc -l)'" \
  -reducer "bash -c 'cut -f2 | paste -sd+ | bc'"

每个Map器将运行“wc-l”的部分,它有,然后一个单一的减速机将汇总所有Map器的计数。

相关问题