I think this is more of an issue of your 78 salt buckets than the width of your table. Each chunk, running in parallel, is spilling incremental counts to disk.

I'd check your ulimit settings on the node which you run this query from and try to increase the number of open files allowed before going into this one in more depth :)

On 6/16/17 2:31 PM, Michael Young wrote:

We are running a 13-node hbase cluster. One table uses 78 SALT BUCKETS which seems to work reasonable well for both read and write. This table has 130 columns with a PK having 30 columns (fairly wide table).

However, after adding several new tables we are seeing errors about too many open files when running a full table scan.


Caused by: org.apache.phoenix.exception.PhoenixIOException: Too many open files at org.apache.phoenix.util.ServerUtil.parseServerException(ServerUtil.java:111) at org.apache.phoenix.iterate.SpoolingResultIterator.<init>(SpoolingResultIterator.java:152) at org.apache.phoenix.iterate.SpoolingResultIterator.<init>(SpoolingResultIterator.java:84) at org.apache.phoenix.iterate.SpoolingResultIterator.<init>(SpoolingResultIterator.java:63) at org.apache.phoenix.iterate.SpoolingResultIterator$SpoolingResultIteratorFactory.newIterator(SpoolingResultIterator.java:79) at org.apache.phoenix.iterate.ParallelIterators$1.call(ParallelIterators.java:112) at org.apache.phoenix.iterate.ParallelIterators$1.call(ParallelIterators.java:103)
         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.apache.phoenix.job.JobManager$InstrumentedJobFutureTask.run(JobManager.java:183) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
         at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Too many open files
         at java.io.UnixFileSystem.createFileExclusively(Native Method)
         at java.io.File.createTempFile(File.java:2024)
at org.apache.phoenix.shaded.org.apache.commons.io.output.DeferredFileOutputStream.thresholdReached(DeferredFileOutputStream.java:176) at org.apache.phoenix.iterate.SpoolingResultIterator$1.thresholdReached(SpoolingResultIterator.java:116) at org.apache.phoenix.shaded.org.apache.commons.io.output.ThresholdingOutputStream.checkThreshold(ThresholdingOutputStream.java:224) at org.apache.phoenix.shaded.org.apache.commons.io.output.ThresholdingOutputStream.write(ThresholdingOutputStream.java:92)
         at java.io.DataOutputStream.writeByte(DataOutputStream.java:153)
at org.apache.hadoop.io.WritableUtils.writeVLong(WritableUtils.java:273) at org.apache.hadoop.io.WritableUtils.writeVInt(WritableUtils.java:253)
         at org.apache.phoenix.util.TupleUtil.write(TupleUtil.java:149)
at org.apache.phoenix.iterate.SpoolingResultIterator.<init>(SpoolingResultIterator.java:127)
         ... 10 more


When running an explain plan:
explain select count(1) from MYBIGTABLE

+------------------------------------------------------------------------------------------------------------------+
| PLAN |
+------------------------------------------------------------------------------------------------------------------+
| CLIENT 8728-CHUNK 674830174 ROWS 2721056772632 BYTES PARALLEL 78-WAY FULL SCAN OVER ATT.PRE_ENG_CONVERSION_OLAP | | ROW TIMESTAMP FILTER [0, 9223372036854775807) | | SERVER FILTER BY FIRST KEY ONLY | | SERVER AGGREGATE INTO SINGLE ROW |
+------------------------------------------------------------------------------------------------------------------+

I has a lot of chunks. Normally this query would return at least some result after running for a few minutes. With appropriate filters in the WHERE clause, the queries run fine.

Any suggestions on how to avoid this error and get better performance from the table scans? Realizing that we don't need to run full table scans regularly, just trying to understand better best practices for Phoenix Hbase.

Thank you,
Michael

Reply via email to